From owner-p4-projects@FreeBSD.ORG Mon Jul 23 16:47:23 2007 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id D6C7216A41A; Mon, 23 Jul 2007 16:47:22 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 943CB16A417 for ; Mon, 23 Jul 2007 16:47:22 +0000 (UTC) (envelope-from mharvan@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 8BA2B13C428 for ; Mon, 23 Jul 2007 16:47:22 +0000 (UTC) (envelope-from mharvan@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id l6NGlMx0092934 for ; Mon, 23 Jul 2007 16:47:22 GMT (envelope-from mharvan@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id l6NGlM5P092929 for perforce@freebsd.org; Mon, 23 Jul 2007 16:47:22 GMT (envelope-from mharvan@FreeBSD.org) Date: Mon, 23 Jul 2007 16:47:22 GMT Message-Id: <200707231647.l6NGlM5P092929@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to mharvan@FreeBSD.org using -f From: Matus Harvan To: Perforce Change Reviews Cc: Subject: PERFORCE change 123975 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 23 Jul 2007 16:47:23 -0000 http://perforce.freebsd.org/chv.cgi?CH=123975 Change 123975 by mharvan@mharvan_twoflower on 2007/07/23 16:46:34 plugins can choose whether the daemon should prepend a fragmentation header the tcp plugin does framing on its own Affected files ... .. //depot/projects/soc2007/mharvan-mtund/mtund.src/plugin_icmp.c#3 edit .. //depot/projects/soc2007/mharvan-mtund/mtund.src/plugin_tcp.c#5 edit .. //depot/projects/soc2007/mharvan-mtund/mtund.src/plugin_udp.c#4 edit .. //depot/projects/soc2007/mharvan-mtund/mtund.src/tunneld.c#10 edit .. //depot/projects/soc2007/mharvan-mtund/mtund.src/tunneld.h#5 edit Differences ... ==== //depot/projects/soc2007/mharvan-mtund/mtund.src/plugin_icmp.c#3 (text+ko) ==== @@ -113,6 +113,7 @@ int plugin_register(plugint* pl) { pl->name = "icmp"; + pl->need_frag = 1; pl->initialize = plugin_initialize; pl->deinitialize = plugin_deinitialize; pl->send = plugin_send; @@ -185,7 +186,7 @@ if (data->server) { #ifdef __FreeBSD__ - //system("sysctl net.ipv4.icmp_echo_ignore_all=0"); + system("sysctl net.ipv4.icmp_echo_ignore_all=0"); #else system("sysctl net.ipv4.icmp_echo_ignore_all=0"); #endif ==== //depot/projects/soc2007/mharvan-mtund/mtund.src/plugin_tcp.c#5 (text+ko) ==== @@ -15,6 +15,8 @@ #include "tunneld.h" #include "plugin.h" +#define min(a,b) ( (a>b) ? b : a ) + /* * Establish a connected UDP endpoint. First get the list of potential * network layer addresses and transport layer port numbers. Iterate @@ -188,6 +190,7 @@ int plugin_register(plugint* pl) { pl->name = "tcp"; + pl->need_frag = 0; pl->initialize = plugin_initialize; pl->deinitialize = plugin_deinitialize; pl->send = plugin_send; @@ -247,7 +250,9 @@ plugin_tcp_datat *data = (plugin_tcp_datat*) pl->data; int n = 0; char packet[PACKETLEN]; + char *packet_p = packet; int new_fd = -1; + int len; //fprintf(stderr, "state: %d\n", data->state); if (! (data->state == PLUGIN_STATE_CONNECTED @@ -272,19 +277,42 @@ //report_plugin_error(pl, PLUGIN_ERROR_SUCCESS); } } else { - //n = read(data->fd, packet, sizeof(packet)); - n = recv(fd, packet, sizeof(packet),0); - //fprintf(stderr, "n: %d\n", n); - if (n <= 0) { - /* client disconnected */ - unregister_select_fd(fd); - data->state = PLUGIN_STATE_DISCONNECTED; - report_plugin_error(pl, PLUGIN_ERROR_RECEIVE); - } else if (n > 0) { + /* get length of the next packet */ + n = recv(fd, &len, sizeof(len),0); + if (n <= 0) goto recv_error; + + if (len <= sizeof(packet)) { + while (len>0) { + n = recv(fd, packet_p, len,0); + if (n <= 0) { + goto recv_error; + } else { + len -= n; + packet_p += n; + } + } process_data_from_plugin(pl, packet, n); + //report_plugin_error(pl, PLUGIN_ERROR_SUCCESS); + /* packet too large */ + } else { + fprintf(stderr, "client sent a too large packet (len: %d)\n", + len); + while(len) { + n = recv(fd, packet, min(len, sizeof(packet)),0); + if (n <= 0) { + goto recv_error; + } else { + len -= n; + } + } } + return; + recv_error: + /* client disconnected */ + unregister_select_fd(fd); + data->state = PLUGIN_STATE_DISCONNECTED; + report_plugin_error(pl, PLUGIN_ERROR_RECEIVE); } - //report_plugin_error(pl, PLUGIN_ERROR_SUCCESS); } /* @@ -294,11 +322,15 @@ int plugin_send(plugint *pl, char *data, int len) { plugin_tcp_datat *datapl = (plugin_tcp_datat*) pl->data; int n = 0; + if (datapl->state != PLUGIN_STATE_CONNECTED) { fprintf(stderr, "no client connected yet, discarding data\n"); return 0; } else { //n = write(datapl->fd, data, len); + // TODO: we should use on buffer only as the current + // approach generates two packets + n = send(datapl->fd, &len, sizeof(len), 0); n = send(datapl->fd, data, len, 0); //fprintf(stderr, "plugin_send: fd: %d\n", datapl->fd); //fprintf(stderr, "plugin_send: write returned %d\n", n); ==== //depot/projects/soc2007/mharvan-mtund/mtund.src/plugin_udp.c#4 (text+ko) ==== @@ -129,6 +129,7 @@ int plugin_register(plugint* pl) { pl->name = "udp"; + pl->need_frag = 1; pl->initialize = plugin_initialize; pl->deinitialize = plugin_deinitialize; pl->send = plugin_send; ==== //depot/projects/soc2007/mharvan-mtund/mtund.src/tunneld.c#10 (text+ko) ==== @@ -32,7 +32,7 @@ #define min(a,b) ( (a>b) ? b : a ) -/* max transfered unit - capsuled packet size */ +/* max transfered unit - encapsulated packet size */ //const int mtu = 1400; #define MTU 1500 /* how many pings can fail before the plugin is declared broken */ @@ -262,7 +262,8 @@ { u_int8_t dispatch = *data; frag_hdr_t *frag_hdr = NULL; - frag_llist_t *p, *q, **pp; + frag_llist_t *p; /* pointer to frag info about the processed fragment */ + frag_llist_t **pp; /* previous item before p */ struct timeval tv; int i; int dgram_reassembled; @@ -288,7 +289,7 @@ fprintf(stderr, "got a frag header: id %d, size %d, off %d, len %d\n", frag_hdr->id, frag_hdr->size, frag_hdr->offset, len); - /* search frag info in list */ + /* check if reassembly for this fragment has already started */ pp = &frag_list; for(p = frag_list; p; p = p->next) { if (p->id == frag_hdr->id && @@ -300,7 +301,7 @@ /* found in list */ if (p) { fprintf(stderr, "found frag info in list\n"); - /* fragment info not found in list, start a new reassembly */ + /* fragment info not found in list, start a new reassembly */ } else { fprintf(stderr, "frag info NOT found in list\n"); /* allocate memory */ @@ -349,6 +350,7 @@ } } else { fprintf(stderr, "fragment outside of packet payload\n"); + return; } /* check if the complete packet has been reassembled */ @@ -357,23 +359,13 @@ for(i=0; i < p->size/8 && dgram_reassembled; i++) { if (p->bitmap[i] != 0xff) { dgram_reassembled = 0; -/* printf("dgram_reassembled = 0 (bitmap[%d]: 0x%x)\n", */ -/* i, p->bitmap[i]); */ } } for(i=0; i < p->size%8 && dgram_reassembled; i++) { if (! (p->bitmap[p->size/8] & (1 << i))) { dgram_reassembled=0; -/* printf("dgram_reassembled = 0 (bitmap<<%d)\n", i); */ -/* printf("bitmap[%d]: 0x%x)\n", */ -/* p->size/8, p->bitmap[p->size/8]); */ } } -/* printf("bitmap: 0x"); */ -/* for(i=0; i < p->size/8 + 1; i++) { */ -/* printf("%x",p->bitmap[i]); */ -/* } */ -/* printf("\n"); */ /* packet completely reassembled */ if (dgram_reassembled) { fprintf(stderr, "frag reassembly: packet complete\n"); @@ -381,11 +373,10 @@ tun_send(p->buf, p->size); /* remove fragment info from linked list */ - q = p->next; + *pp = p->next; free(p->buf); free(p->bitmap); free(p); - *pp = q; } break; case DISPATCH_ECHO_REQUEST: @@ -419,8 +410,11 @@ if (current_pl == NULL) { fprintf(stderr, "no plugin connected yet, discarding tun data\n"); report_plugin_error(NULL, PLUGIN_ERROR_BOOTSTRAP); - } else { -#ifdef NO_FRAG + return; + } + + /* no need to add the fragmentation header */ + if (! current_pl->need_frag) { *ldata = DISPATCH_DATA; memcpy(ldata+1, data, min(sizeof(ldata)-1, len)); n = current_pl->send(current_pl, ldata, min(sizeof(ldata), len+1)); @@ -429,7 +423,8 @@ fprintf(stderr, "process_data_from_tun: plugind sent less " "bytes (%d) than requested (%d)\n", n, len); } -#else /* NO_FRAG */ + /* add the fragmentation header */ + } else { // mtu = current_pl->mtu; /* prepare the frag header */ @@ -467,7 +462,6 @@ frag_hdr.offset += n; len -= n; } -#endif /* NO_FRAG */ } } @@ -603,19 +597,22 @@ /* setup the tun interface */ if (server) { - #ifdef __FreeBSD__ +#ifdef __FreeBSD__ ssystem("ifconfig tun0 mtu 1400 192.168.0.1 192.168.0.2"); - #endif +#endif +#ifdef __linux + ssystem("ifconfig tun0 mtu 1400 192.168.0.1"); + ssystem("route add 192.168.0.2 tun0"); +#endif } else { - /* FreeBSD */ - #ifdef __FreeBSD__ +#ifdef __FreeBSD__ ssystem("ifconfig tun0 mtu 1400 192.168.0.2 192.168.0.1"); - #else - /* Linux */ +#endif +#ifdef __linux ssystem("ifconfig tun0 mtu 1400 192.168.0.2"); ssystem("route add 192.168.0.1 tun0"); - #endif +#endif } signal(SIGHUP, sigcb); @@ -635,8 +632,8 @@ plugins->name = "tcp_2222"; load_plugin("./plugin_tcp.so"); plugins->name = "tcp_3333"; - load_plugin("./plugin_icmp.so"); - plugins->name = "icmp"; + // load_plugin("./plugin_icmp.so"); + // plugins->name = "icmp"; if (server) { /* initialize all plugins */ ==== //depot/projects/soc2007/mharvan-mtund/mtund.src/tunneld.h#5 (text+ko) ==== @@ -44,6 +44,8 @@ int (*send)(struct _plugint*, char*, int); void (*receive)(int fd, short ev_type, void *arg); /* select fired on some fd - check for data */ void* data; + int need_frag; + int mtu; struct _plugint *next; } plugint;