static EVENT_HANDLER(transmit) { WLAN_FRAME frame; int link = 1; // POPULATE A NEW FRAME do { frame.header.dest = CNET_rand() % NNODES; } while(frame.header.dest == nodeinfo.nodenumber); frame.header.src = nodeinfo.nodenumber; frame.header.prevpos = positions[nodeinfo.nodenumber]; // me! sprintf(frame.payload, "hello from %d", nodeinfo.nodenumber); frame.header.length = strlen(frame.payload) + 1; // send nul-byte too // TRANSMIT THE FRAME size_t len = sizeof(WLAN_HEADER) + frame.header.length; CHECK(CNET_write_physical_reliable(link, &frame, &len)); ++stats[0]; if(verbose) { fprintf(stdout, "\n%s: transmitting '%s' to %d\n", nodeinfo.nodename, frame.payload, frame.header.dest); } // SCHEDULE OUR NEXT TRANSMISSION CNET_start_timer(EV_TIMER1, TX_NEXT, 0); }
static void transmit_frame(MSG *msg, FRAMEKIND kind, size_t length, int seqno) { FRAME f; int link = 1; f.kind = kind; f.seq = seqno; f.checksum = 0; f.len = length; switch (kind) { case ACK : CHECK(CNET_set_wlancolour(link, "blue")); break; case DATA: { CnetTime timeout; CHECK(CNET_set_wlancolour(link, "red")); memcpy(&f.msg, (char *)msg, length); timeout = (FRAME_SIZE(f)*(CnetTime)8000000 / linkinfo[link].bandwidth + linkinfo[link].propagationdelay); timeout = 300000; lasttimer = CNET_start_timer(EV_TIMER1, 3 * timeout, 0); break; } } length = FRAME_SIZE(f); f.checksum = CNET_ccitt((unsigned char *)&f, length); CHECK(CNET_write_physical_reliable(link, (char *)&f, &length)); }
static EVENT_HANDLER(talking) { if(am_walking() == false) { size_t len = sizeof(int); fprintf(stdout,"%d: transmitting\n", nodeinfo.nodenumber); CHECK( CNET_write_physical_reliable(1, (char *)&nodeinfo.nodenumber, &len)); } CNET_start_timer(EV_TALKING, TALK_FREQUENCY, data); }
/**************************************************************************** Write length bytes of the packet to the data link layer on a link. ****************************************************************************/ int down_to_datalink(int link, char *packet, int length) { if (!linkinfo[link].linkup) { return 0; } #ifndef LOSSIE CHECK(CNET_write_physical_reliable(link, (char *)packet, &length)); #else CHECK(CNET_write_physical(link, (char *)packet, &length)); #endif return(0); }
/** * @brief transmit a frame * * @param kind * @param dst * @param msg * @param rxsignal */ void transmit(KIND kind, int dst, char *msg, double rxsignal) { FRAME frame = initFrame(kind, dst, msg); size_t length = sizeof(FRAME); int link = 1; frame.rxsignal = rxsignal; CHECK(CNET_write_physical_reliable(link, (FRAME *)&frame, &length)); printf("transmitting a %s frame to ap %d\n", msg, dst); }
static void send_reliable(CnetEvent ev, CnetTimer timer, CnetData data) { char frame[256]; int length; sprintf(frame, "message %d is %s", ++count, fruit[random()%NFRUITS]); length = strlen(frame) + 1; printf("sending %d bytes, checksum=%6d\n\n", length, checksum_internet((unsigned short *)frame,length)); CHECK(CNET_write_physical_reliable(1, frame, &length)); }
static EVENT_HANDLER(receive) { WLAN_FRAME frame; size_t len; int link; // READ THE ARRIVING FRAME FROM OUR PHYSICAL LINK len = sizeof(frame); CHECK(CNET_read_physical(&link, &frame, &len)); if(verbose) { double rx_signal; CHECK(CNET_wlan_arrival(link, &rx_signal, NULL)); fprintf(stdout, "\t%5s: received '%s' @%.3fdBm\n", nodeinfo.nodename, frame.payload, rx_signal); } // IS THIS FRAME FOR ME? if(frame.header.dest == nodeinfo.nodenumber) { ++stats[1]; if(verbose) fprintf(stdout, "\t\tfor me!\n"); } // NO; RETRANSMIT FRAME IF WE'RE CLOSER TO THE DESTINATION THAN THE PREV NODE else { CnetPosition dest = positions[frame.header.dest]; double prev = distance(frame.header.prevpos, dest); double now = distance(positions[nodeinfo.nodenumber],dest); if(now < prev) { // closer? frame.header.prevpos = positions[nodeinfo.nodenumber]; // me! len = sizeof(WLAN_HEADER) + frame.header.length; CHECK(CNET_write_physical_reliable(link, &frame, &len)); if(verbose) fprintf(stdout, "\t\tretransmitting\n"); } } }