void process_packet(u_char *args, const struct pcap_pkthdr *header, const u_char *packet) { struct rthdr *rth = (struct rthdr*) packet; u_char *packetIn = (u_char *) packet; //FILE* logfile = data->logfile; char err[128]; int size = (int) header->len; //char iface[10]; int ret = 0, hdrlen, payload_size; ret = routing_opt(packetIn, my_addr); int protocol = rth->protocol; switch(ret) { case P_APPRESPONSE: if(verify_packet_chk(packetIn, size, protocol) < 0){ fprintf(stderr, "Packet checksum verification failed for protocol %d \n", protocol); exit(1); } switch(protocol){ case ROUTE_ON_UNRELIABLE: printf("Received an UNRELIABLE packet of size: %d \n", size); hdrlen = sizeof(struct rthdr) + sizeof(struct urhdr); struct urhdr *urh = (struct urhdr*)(packetIn + sizeof(struct rthdr)); if(urh->port != port){ fprintf(stderr, "Requesting port %d doesnot match my port %d\n", urh->port, port); exit(1); } payload_size = size - hdrlen; write_ur_to_file(packetIn + hdrlen, payload_size); break; case ROUTE_ON_RELIABLE: hdrlen = sizeof(struct rthdr) + sizeof(struct rlhdr); //struct rlhdr* rlh = (struct rlhdr*)(packetIn + sizeof(struct rthdr)); break; default: break; } break; default: break; } }
void process_packet(u_char *args, const struct pcap_pkthdr *header, const u_char *packet_n) { struct rthdr *rth = (struct rthdr*) packet_n; u_char *packetIn = (u_char *) packet_n; char err[128]; int size = (int) header->len; int ret = 0, hdrlen, payload_size; if(rth->saddr == my_addr) return; ret = routing_opt(packetIn, my_addr); int protocol = rth->protocol; switch(ret) { case P_APPRESPONSE: if(verify_packet_chk(packetIn, size, protocol) < 0){ fprintf(stderr, "Packet checksum verification failed for protocol %d \n", protocol); exit(1); } hdrlen = sizeof(struct rthdr) + sizeof(struct rlhdr); struct rlhdr* rlh = (struct rlhdr*)(packetIn + sizeof(struct rthdr)); if(rlh->port != port){ fprintf(stderr, "Requesting port %d doesnot match my port %d\n", rlh->port, port); //exit(1); return; } // printf("Received NACK for %d with payload %d and size %d\n", rlh->seq, packetIn[hdrlen], size); //print_rl_packet(stdout, packetIn, size); if(packetIn[hdrlen] != 0) //Not a nack packet return; int seqNum = rlh->seq; int dummy = rlh->dummy; // fprintf(stdout, "Dummy %d \n", dummy); if(dummy == 1){ //print_dummy_packet(packetIn, size); fprintf(stdout, "TOTAL PACKETS TRANSMITTED: %d\n", no_of_packets); //printTime(); if( clock_gettime( CLOCK_REALTIME, &stop) == -1 ) { perror( "clock gettime" );} time_e = (stop.tv_sec - start.tv_sec)+ (double)(stop.tv_nsec - start.tv_nsec)/1e9; printf("TIME FOR DATA TRANSMISSION ONLY: %f \n", time_e); //printf("THROUGHPUT: %f Bytes/s\n", filesize / time_e); exit(1); } u_char packetOut[PACKET_BUF_SIZE]; char payload[PAYLOAD_SIZE]; int payload_size; if((seqNum == (no_of_packets-1)) && ((filesize % PAYLOAD_SIZE) != 0)) payload_size = filesize % PAYLOAD_SIZE; else payload_size = PAYLOAD_SIZE; //fseek(fp_read, seqNum * PAYLOAD_SIZE, SEEK_SET); memcpy(payload, data + (seqNum * PAYLOAD_SIZE), payload_size); int pktlen = generate_route_on_file_packet(packetOut, payload, payload_size + RE_HEADER_SIZE, ROUTE_ON_RELIABLE, seqNum ); // print_dummy_packet(packetOut, pktlen); //print_rl_packet(stdout, packetOut, pktlen); if ((ret = pcap_inject(handle_sniffed_nack, packetOut, pktlen)) != pktlen){ fprintf(stderr, "Fail to inject packet\n"); fprintf(stderr, "Only %d inserted \n", ret); // exit(1); } //fprintf(stdout, "Sent R_Seq #: %d with %d to %d\n", seqNum, ret, dest_addr); default: break; } }