Ryo Iizuka / libMiMic

Dependents:   MbedFileServer_1768MiniDK2 RedWireBridge IssueDebug_gcc MiMicRemoteMCU-for-Mbed ... more

Revision:
91:db8279c869d3
Parent:
79:baa21f8763cf
Child:
92:4f77028cce64
diff -r d35c976570fc -r db8279c869d3 core/uip/NyLPC_cUipService.c
--- a/core/uip/NyLPC_cUipService.c	Sat Sep 06 02:41:20 2014 +0000
+++ b/core/uip/NyLPC_cUipService.c	Sat Sep 27 13:33:26 2014 +0000
@@ -63,7 +63,6 @@
 
 
 
-
 /****************************************************
  * UipServiceに関する宣言:その他
  ***************************************************/
@@ -105,7 +104,7 @@
 //--------------------------------------------------------------
 
 
-static NyLPC_TBool sendIPv4Tx(struct NyLPC_TTxBufferHeader* i_eth_buf);
+static NyLPC_TBool sendIPv4Tx(struct TEthPacket* i_eth_buf);
 
 //static void sendArpReqest(const struct TEthPacket* i_eth_packet);
 static void sendRawEthFrameNL(void* i_buf,NyLPC_TUInt16 i_len);
@@ -306,7 +305,7 @@
                     NyLPC_cMutex_unlock(&(inst->_mutex));
                     //IPパケットの処理
                     r=NyLPC_cIPv4_rx(&(inst->_tcpv4),&(ethbuf->data.ipv4),rx_len);
-                    if(r!=NULL){
+                    if(r!=NULL){                        
                         //IPパケットとして送信
                         NyLPC_cUipService_sendIPv4Tx(r);
                     }
@@ -381,7 +380,7 @@
 void NyLPC_cUipService_sendArpRequest(const struct NyLPC_TIPv4Addr* i_addr)
 {
     NyLPC_TcUipService_t* inst=_NyLPC_TcUipService_inst;
-    struct NyLPC_TTxBufferHeader* p;
+    void* p;
     NyLPC_TUInt16 tx_len;
     struct TEthPacket* ethbuf;
     //システムTxBufを得る
@@ -390,7 +389,7 @@
     NyLPC_TArpHeader_setArpRequest(&(ethbuf->data.arp),inst->_ref_config->ip_addr,&(inst->_ref_config->eth_mac),i_addr);
     tx_len=NyLPC_TEthernetIIHeader_setArpTx(&(ethbuf->header),&(inst->_ref_config->eth_mac));
     //送信
-    p=((struct NyLPC_TTxBufferHeader*)(((struct NyLPC_TEthernetIIHeader*)ethbuf)-1))-1;
+    p=((struct NyLPC_TEthernetIIHeader*)ethbuf)-1;
 
     NyLPC_cMutex_lock(&(inst->_mutex));
     NyLPC_iEthernetDevice_sendTxEthFrame(inst->_ethif,p,tx_len);
@@ -411,10 +410,10 @@
 void NyLPC_cUipService_sendIPv4Tx(void* i_eth_payload)
 {
     NyLPC_TcUipService_t* inst=_NyLPC_TcUipService_inst;
-    struct NyLPC_TTxBufferHeader* p=((struct NyLPC_TTxBufferHeader*)(((struct NyLPC_TEthernetIIHeader*)i_eth_payload)-1))-1;
+    void* p=((struct NyLPC_TEthernetIIHeader*)i_eth_payload)-1;
     NyLPC_cMutex_lock(&(inst->_mutex));
     //IPパケットの送信を試行
-    if(sendIPv4Tx(p)){
+    if(sendIPv4Tx((struct TEthPacket*)p)){
         NyLPC_cMutex_unlock(&(inst->_mutex));
         return;
     }
@@ -442,11 +441,11 @@
 {
     NyLPC_TUInt16 s;
     NyLPC_TcUipService_t* inst=_NyLPC_TcUipService_inst;
-    struct NyLPC_TTxBufferHeader* ethbuf;
+    struct TEthPacket* ethbuf;
     //排他処理をして、メモリを取得する。SYSTEMメモリはEthernetドライバの解放待ちのみなのでまとめてLOCKしておk
     NyLPC_cMutex_lock(&(inst->_mutex));
     for(;;){
-        ethbuf=(struct NyLPC_TTxBufferHeader*)NyLPC_iEthernetDevice_allocTxBuf(inst->_ethif,NyLPC_TcEthernetMM_HINT_CTRL_PACKET,&s);
+        ethbuf=(struct TEthPacket*)NyLPC_iEthernetDevice_allocTxBuf(inst->_ethif,NyLPC_TcEthernetMM_HINT_CTRL_PACKET,&s);
         if(ethbuf==NULL){
             NyLPC_cThread_yield();
             continue;
@@ -455,7 +454,7 @@
     }
     NyLPC_cMutex_unlock(&(inst->_mutex));
     //イーサネットバッファのアドレスを計算
-    return &(((struct TEthPacket*)(ethbuf+1))->data);
+    return &(ethbuf->data);
 }
 
 
@@ -463,10 +462,10 @@
 void* NyLPC_cUipService_allocTxBuf(NyLPC_TUInt16 i_hint,NyLPC_TUInt16* o_size)
 {
     NyLPC_TcUipService_t* inst=_NyLPC_TcUipService_inst;
-    struct NyLPC_TTxBufferHeader* ethbuf;
+    struct TEthPacket* ethbuf;
     //排他処理をして、メモリを取得する。
     NyLPC_cMutex_lock(&(inst->_mutex));
-    ethbuf=(struct NyLPC_TTxBufferHeader*)NyLPC_iEthernetDevice_allocTxBuf(inst->_ethif,i_hint+sizeof(struct NyLPC_TEthernetIIHeader),o_size);
+    ethbuf=(struct TEthPacket*)NyLPC_iEthernetDevice_allocTxBuf(inst->_ethif,i_hint+sizeof(struct NyLPC_TEthernetIIHeader),o_size);
     NyLPC_cMutex_unlock(&(inst->_mutex));
     if(ethbuf==NULL){
         return NULL;
@@ -474,7 +473,7 @@
     //イーサネットバッファのサイズを計算
     *o_size-=sizeof(struct NyLPC_TEthernetIIHeader);
     //イーサネットバッファのアドレスを計算
-    return &(((struct TEthPacket*)(ethbuf+1))->data);
+    return &(ethbuf->data);
 }
 
 
@@ -484,7 +483,7 @@
     NyLPC_TcUipService_t* inst=_NyLPC_TcUipService_inst;
     NyLPC_cMutex_lock(&(inst->_mutex));
     //ペイロードの位置から、メモリブロックを再生。
-    NyLPC_iEthernetDevice_releaseTxBuf(inst->_ethif,((struct NyLPC_TTxBufferHeader*)(((struct NyLPC_TEthernetIIHeader*)i_buf)-1))-1);
+    NyLPC_iEthernetDevice_releaseTxBuf(inst->_ethif,((struct NyLPC_TEthernetIIHeader*)i_buf)-1);
     NyLPC_cMutex_unlock(&(inst->_mutex));
     return NULL;
 }
@@ -555,7 +554,7 @@
 {
     NyLPC_iEthernetDevice_sendTxEthFrame(
         _NyLPC_TcUipService_inst->_ethif,
-        ((struct NyLPC_TTxBufferHeader*)(((struct NyLPC_TEthernetIIHeader*)i_buf)-1))-1,
+        ((struct NyLPC_TEthernetIIHeader*)i_buf)-1,
         i_len);
     return;
 }
@@ -568,7 +567,7 @@
     //ペイロードの位置から、メモリブロックを再生。
     NyLPC_iEthernetDevice_releaseTxBuf(
         _NyLPC_TcUipService_inst->_ethif,
-        ((struct NyLPC_TTxBufferHeader*)(((struct NyLPC_TEthernetIIHeader*)i_buf)-1))-1);
+        ((struct NyLPC_TEthernetIIHeader*)i_buf)-1);
     return;
 }
 /**
@@ -593,34 +592,33 @@
  * allocTxBufで確保したメモリを指定してください。
  * ペイロードには、TCP/IPパケットを格納します。
  */
-static NyLPC_TBool sendIPv4Tx(struct NyLPC_TTxBufferHeader* i_eth_buf)
+static NyLPC_TBool sendIPv4Tx(struct TEthPacket* i_eth_buf)
 {
     NyLPC_TcUipService_t* inst=_NyLPC_TcUipService_inst;
     struct NyLPC_TEthAddr emac;
     NyLPC_TUInt16 tx_len;
     const struct NyLPC_TEthAddr* eth_dest;
-    struct TEthPacket* ethbuf=(struct TEthPacket*)(i_eth_buf+1);
     //ペイロードのアドレスから、イーサネットフレームバッファのアドレスを復元
 
-    if(NyLPC_TIPv4Addr_isEqual(&(ethbuf->data.ipv4.destipaddr),&NyLPC_TIPv4Addr_BROADCAST)) {
+    if(NyLPC_TIPv4Addr_isEqual(&(i_eth_buf->data.ipv4.destipaddr),&NyLPC_TIPv4Addr_BROADCAST)) {
         //ブロードキャストならそのまま
         eth_dest=&NyLPC_TEthAddr_BROADCAST;
-    }else if(NyLPC_TIPv4Addr_isEqualWithMask(&(ethbuf->data.ipv4.destipaddr),&NyLPC_TIPv4Addr_MULTICAST,&NyLPC_TIPv4Addr_MULTICAST_MASK)){
+    }else if(NyLPC_TIPv4Addr_isEqualWithMask(&(i_eth_buf->data.ipv4.destipaddr),&NyLPC_TIPv4Addr_MULTICAST,&NyLPC_TIPv4Addr_MULTICAST_MASK)){
         //マルチキャスト
-        ip2MulticastEmacAddr(&(ethbuf->data.ipv4.destipaddr),&emac);
+        ip2MulticastEmacAddr(&(i_eth_buf->data.ipv4.destipaddr),&emac);
         eth_dest=&emac;
     }else{
         //LocalIP以外ならdefaultRootへ変換
         eth_dest=NyLPC_cIPv4Arp_IPv4toEthAddr(
             &inst->_arp,
-            NyLPC_cIPv4Config_isLocalIP(inst->_ref_config, &(ethbuf->data.ipv4.destipaddr))?(ethbuf->data.ipv4.destipaddr):(inst->_ref_config->dr_addr));
+            NyLPC_cIPv4Config_isLocalIP(inst->_ref_config, &(i_eth_buf->data.ipv4.destipaddr))?(i_eth_buf->data.ipv4.destipaddr):(inst->_ref_config->dr_addr));
         //IP->MAC変換をテスト。
         if(eth_dest==NULL){
             return NyLPC_TBool_FALSE;
         }
     }
     //変換可能なら、イーサネットヘッダを更新して、送信処理へ。
-    tx_len=NyLPC_TEthernetIIHeader_setIPv4Tx(&(ethbuf->header),&(inst->_ref_config->eth_mac),eth_dest);
+    tx_len=NyLPC_TEthernetIIHeader_setIPv4Tx(&(i_eth_buf->header),&(inst->_ref_config->eth_mac),eth_dest);
     NyLPC_iEthernetDevice_sendTxEthFrame(inst->_ethif,i_eth_buf,tx_len);
     return NyLPC_TBool_TRUE;
 }