static void ieee_serial_mcps(MAC_McpsDcfmInd_s *ev) /* this funtion gets called on a MLME event from the main handler in * ieee802.c. Primarily after scan requests. */ { uint8_t i; if(!ieee_serial_open) return; switch(ev->u8Type) { case MAC_MCPS_IND_DATA: /* new packet rx'd */ uart0_writeb('z'); uart0_writeb('b'); uart0_writeb(0x86); uart0_writeb(asdataframe(ev).u8LinkQuality); uart0_writeb(asdataframe(ev).u8SduLength); /* data frame without fcs */ for (i=0; i<asdataframe(ev).u8SduLength; i++) uart0_writeb(asdataframe(ev).au8Sdu[i]); break; case MAC_MCPS_DCFM_DATA: /* deferred confirm of transmission */ uart0_writeb('z'); uart0_writeb('b'); uart0_writeb(0x89); if (asdataind(ev).u8Status==MAC_ENUM_SUCCESS) uart0_writeb(SUCCESS); else uart0_writeb(ERR); case MAC_MCPS_DCFM_PURGE: /* deferred confirm of purge request */ default: break; } }
static void ieee_mcpspt(MAC_McpsDcfmInd_s *ev) /* packet input and output thread */ { rimeaddr_t rime; switch(ev->u8Type) { case MAC_MCPS_IND_DATA: GDB2_PUTS(","); /* new frame received */ packetbuf_clear(); packetbuf_copyfrom(asdataframe(ev).au8Sdu, asdataframe(ev).u8SduLength); packetbuf_set_datalen(asdataframe(ev).u8SduLength); packetbuf_set_addr(PACKETBUF_ADDR_SENDER, asrimeaddr(&asdataframe(ev).sSrcAddr.uAddr.sExt, &rime)); if(asdataframe(ev).sDstAddr.u8AddrMode==LONG) { /* addressed frame */ packetbuf_set_addr(PACKETBUF_ADDR_RECEIVER, asrimeaddr(&asdataframe(ev).sDstAddr.uAddr.sExt, &rime)); } else if(asdataframe(ev).sDstAddr.u8AddrMode==SHORT && asdataframe(ev).sDstAddr.u16PanId==BROADCAST_PANID && asdataframe(ev).sDstAddr.uAddr.u16Short==BROADCAST_ADDR) { /* broadcast frame */ packetbuf_set_addr(PACKETBUF_ADDR_RECEIVER, &rimeaddr_null); } /* update lqi stuff and call lqi callback */ packetbuf_set_attr(PACKETBUF_ATTR_RSSI, asdataframe(ev).u8LinkQuality); if (asdataframe(ev).sSrcAddr.u8AddrMode == LONG && lqicb) lqicb(asrimeaddr(&asdataframe(ev).sSrcAddr.uAddr.sExt, &rime), asdataframe(ev).u8LinkQuality); else if (lqicb) lqicb(NULL, asdataframe(ev).u8LinkQuality); #if USE_TS current_timestamp = asdataframe(ev).timestamp; #endif //{ // static char buf[512]; // uint8_t i; // uint16_t j; // printf("delay:%d len:%d data:", (int32_t) (clock_hrtime()-asdataframe(ev).timestamp), asdataframe(ev).u8SduLength); // for (i=0,j=0; i<asdataframe(ev).u8SduLength; i++) // j+=snprintf(buf+j,sizeof(buf)-j,"0x%x ",asdataframe(ev).au8Sdu[i]); // buf[j]='\n'; // puts(buf); //} /* call upper layer */ NETSTACK_NETWORK.input(); break; case MAC_MCPS_DCFM_DATA: mac_call_sent_callback(mac_cb, mac_cb_ptr, tx_status(&asdataind(ev)), 1); break; case MAC_MCPS_DCFM_PURGE: default: HAL_BREAKPOINT(); break; } }