Example #1
0
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;

	}
}
Example #2
0
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;

	}
}