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); }
///Worker Method ///Called to send a nl_packet to an associated access point. ///If this device is not associated, we abort and manage association instead ///as there is nowhere to transmit the packet to. static int transmit(struct nl_packet *packet) { fprintf(stdout, "\tTransmitting.\n"); // Create a broadcast address. CnetNICaddr wifi_dest; CHECK(CNET_parse_nicaddr(wifi_dest, "ff:ff:ff:ff:ff:ff")); //uint16_t packet_length = NL_PACKET_LENGTH(packet); uint16_t packet_length = sizeof(*packet); if(packet->type == NULL_FRAME) { fprintf(stderr, "\t%s is attempting to send a null packet!\n",nodeinfo.nodename); exit(0); } if(isAss == false) { fprintf(stdout, "\tWhoops! %s is not associated!\n\t Starting Probe\n", nodeinfo.nodename); // CHECK(CNET_disable_application(ALLNODES)); probe_timer = CNET_start_timer(EV_TIMER1, 100, 0); return 0; } else { fprintf(stdout, "\tAssociation is true, sending frame.\n"); fprintf(stdout, "\n packet src:%i dest:%i\n",packet->src, packet->dest); if(packet->dest > 133) exit(0); dll_wifi_write(dll_states[1], wifi_dest, (char *)packet, packet_length); if(packet->type == NL_DATA ) { CHECK(CNET_disable_application(ALLNODES)); printf(" DATA transmitted, seq=%d\n", packet->seq); data_timeout = CNET_start_timer(EV_TIMER2, CNET_rand() * 50000 + 500000, 0); /// one second wait time } return 1; } }
static EVENT_HANDLER(walker) { static double dx = 0.0; static double dy = 0.0; static double newx = 0.0; static double newy = 0.0; static int nsteps = 0; CnetPosition now; CnetTime movenext; // IF PAUSED, WE NEED TO CHOOSE A NEW DESTINATION AND WALKING SPEED if(paused) { CnetPosition newdest; CHECK(CNET_get_position(&now, NULL)); // CHOOSE A NEW DESTINATION THAT DOESN'T REQUIRE WALKING THROUGH A WALL! do { int newspeed; double dist; newdest = now; do { choose_position(&newdest, MAX_WALK_DIST); } while(through_an_object(now, newdest)); dx = newdest.x - now.x; dy = newdest.y - now.y; dist = sqrt(dx*dx + dy*dy); // only walking in 2D newspeed = CNET_rand() % MAX_SPEED + 1; nsteps = dist / newspeed; } while(nsteps < 3); // ensure we'll take at least 3 steps //draw_walk(&now, &newdest); // CALCULATE MOVEMENTS PER STEP dx = (dx / nsteps); dy = (dy / nsteps); newx = now.x; newy = now.y; paused = false; // and off we go.... } // WE'RE WALKING; DO WE STILL HAVE SOME STEPS TO TAKE? if(nsteps > 0) { newx += dx; newy += dy; now.x = newx; now.y = newy; now.z = 0; CHECK(CNET_set_position(now)); paused = false; --nsteps; movenext = WALK_FREQUENCY; } // WE'VE FINISHED WALKING, SO WE PAUSE HERE FOR A WHILE else { paused = true; nsteps = 0; movenext = (CNET_rand() % (MAX_PAUSE-MIN_PAUSE) + MIN_PAUSE) * 1000000; } // RESCHEDULE THIS WALKING EVENT tid = CNET_start_timer(EV_WALKING, movenext, data); }