Example #1
0
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
}