void network_handler(ev, data){ char buf[UIP_BUFSIZE]; // packet data buffer unsigned short cmd; // DataPayload *dp; ChannelState *state = NULL; uint16_t len = uip_datalen(); PRINTF("ipaddr=%d.%d.%d.%d\n", uip_ipaddr_to_quad(&(UDP_HDR->srcipaddr))); PRINTF("Packet is %d bytes long\n",len); memcpy(buf, uip_appdata, len); buf[len] = '\0'; dp = (DataPayload *)buf; PRINTF("Data is %d bytes long\n",uip_ntohs(dp->dhdr.tlen)); cmd = dp->hdr.cmd; // only a byte so no reordering :) PRINTF("Received a %s command.\n", cmdnames[cmd]); PRINTF("Message for channel %d\n",dp->hdr.dst_chan_num); if (dp->hdr.dst_chan_num == HOMECHANNEL || cmd == DISCONNECT){ if (cmd == QACK){ state = &home_channel_state; copy_link_address(state); } else if (cmd == DISCONNECT){ state = get_channel_state(dp->hdr.dst_chan_num); if (state){ remove_channel(state->chan_num); } state = &home_channel_state; copy_link_address(state); } } else{ state = get_channel_state(dp->hdr.dst_chan_num); if (state == NULL){ PRINTF("Channel %d doesn't exist\n", dp->hdr.dst_chan_num); return; } if (check_seqno(state, dp) == 0) { printf("OH NOES\n"); return; }else { //CHECK IF RIGHT CONNECTION //copy_link_address(state); } } // Received a message so reset pingOUT state->pingOUT = 0; if (cmd == QUERY) PRINTF("I'm a controller, Ignoring QUERY\n"); else if (cmd == CONNECT) PRINTF("I'm a controller, Ignoring CONNECT\n"); else if (cmd == QACK) qack_handler(state, dp); else if (cmd == CACK) cack_handler(state, dp); else if (cmd == RESPONSE) response_handler(state, dp); else if (cmd == CMDACK) command_ack_handler(state,dp); else if (cmd == PING) ping_handler(state, dp); else if (cmd == PACK) pack_handler(state, dp); else if (cmd == DISCONNECT) close_handler(state,dp); }
/* internal functions */ static void *l2_pkt_handler(void *unused) { (void) unused; msg_t m; radio_packet_t *p; l2_ping_payload_t *pp; msg_init_queue(msg_q, sizeof(msg_q)); while (1) { msg_receive(&m); if (m.type == PKT_PENDING) { vtimer_now(&end); p = (radio_packet_t *) m.content.ptr; pp = (l2_ping_payload_t *) p->data; if ((pp->type & L2_PAYLOAD_TYPE) == L2_PAYLOAD_PING) { DEBUGF("INFO: received l2_ping_packet number %d from %d with payload(%d) %.*s.\n", pp->seq, p->src, pp->payload_len, pp->payload_len, pp->payload); switch (pp->type & L2_PING_TYPE) { case L2_PING: ping_handler(p->src, pp->seq); break; case L2_PONG: pong_handler(); break; case L2_PROBE: probe_handler(p->src); break; default: DEBUGF("ERROR: Unknown L2 PING type\n"); } } else { DEBUGF("WARN: no L2 ping packet, type is %02X\n", pp->type); } p->processing--; } else if (m.type == ENOBUFFER) { DEBUGF("ERROR: Transceiver buffer full\n"); } else { DEBUGF("ERROR: Unknown messagereceived\n"); } } return NULL; }