uip_lladdr_t* mac_ethernetToLowpan() { static uip_lladdr_t destAddr; // If not IPv6 we don't do anything if (ETHBUF(uip_buf)->type != UIP_ETHTYPE_IPV6) { uip_log("bridge: unknown mac type\n"); return NULL; } /* IPv6 uses 33-33-xx-xx-xx-xx prefix for multicast ND stuff */ if ( (ETHBUF(uip_buf)->dest.addr[0] == 0x33) && (ETHBUF(uip_buf)->dest.addr[1] == 0x33) ) { // set destination address to broadcast memcpy(&destAddr, &rimeaddr_null, sizeof(destAddr)); } else if (ETHBUF(uip_buf)->dest.addr[0] == 0xFF && ETHBUF(uip_buf)->dest.addr[1] == 0xFF && ETHBUF(uip_buf)->dest.addr[2] == 0xFF && ETHBUF(uip_buf)->dest.addr[3] == 0xFF && ETHBUF(uip_buf)->dest.addr[4] == 0xFF && ETHBUF(uip_buf)->dest.addr[5] == 0xFF ) { /* IPv6 does not use broadcast addresses, hence this should not happen */ uip_log("bridge: ipv6 mac broadcast\n"); return NULL; } else { // Check this returns OK if (!mac_createSicslowpanLongAddr( ETHBUF(uip_buf)->dest.addr, &destAddr)) { uip_log("bridge: addr translation failed\n"); return NULL; // translation failed } } // Remove header from length before passing onward // Some IP packets have link layer in them, need to change them around! uip_len -= UIP_LLH_LEN; mac_translateIPLinkLayer(ll_802154_type); return &destAddr; }
//连接建立 void tcp_server_connected(void) { struct tcp_demo_appstate *s = (struct tcp_demo_appstate *)&uip_conn->appstate; //uip_conn结构体有一个"appstate"字段指向应用程序自定义的结构体。 //声明一个s指针,是为了便于使用。 //不需要再单独为每个uip_conn分配内存,这个已经在uip中分配好了。 //在uip.c 中 的相关代码如下: // struct uip_conn *uip_conn; // struct uip_conn uip_conns[UIP_CONNS]; //UIP_CONNS缺省=10 //定义了1个连接的数组,支持同时创建几个连接。 //uip_conn是一个全局的指针,指向当前的tcp或udp连接。 tcp_server_sta|=1<<7; //标志连接成功 uip_log((char*)"tcp_server connected!\r\n");//打印log s->state=STATE_CMD; //指令状态 s->textlen=0; s->textptr=(uint8_t*)"Connet to RdMaxes Server!!\r\n"; s->textlen=strlen((char *)s->textptr); }
//发送的数据成功送达 void tcp_server_acked(void) { struct tcp_demo_appstate *s=(struct tcp_demo_appstate *)&uip_conn->appstate; s->textlen=0;//发送清零 uip_log((char*)"tcp_server acked!\r\n");//表示成功发送 }
//连接关闭 void tcp_server_closed(void) { tcp_server_sta&=~(1<<7); //标志没有连接 uip_log((char*)"tcp_server closed!\r\n");//打印log }
//连接超时 void tcp_server_timedout(void) { tcp_server_sta&=~(1<<7); //标志没有连接 uip_log((char*)"tcp_server timeout!\r\n");//打印log }