From owner-p4-projects@FreeBSD.ORG Sat Aug 25 13:54:35 2007 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 643E616A41B; Sat, 25 Aug 2007 13:54:35 +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 2030716A417 for ; Sat, 25 Aug 2007 13:54:35 +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 081F613C459 for ; Sat, 25 Aug 2007 13:54:35 +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 l7PDsY6e061281 for ; Sat, 25 Aug 2007 13:54:34 GMT (envelope-from mharvan@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id l7PDsYvk061278 for perforce@freebsd.org; Sat, 25 Aug 2007 13:54:34 GMT (envelope-from mharvan@FreeBSD.org) Date: Sat, 25 Aug 2007 13:54:34 GMT Message-Id: <200708251354.l7PDsYvk061278@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 125663 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: Sat, 25 Aug 2007 13:54:35 -0000 http://perforce.freebsd.org/chv.cgi?CH=125663 Change 125663 by mharvan@mharvan_bike-planet on 2007/08/25 13:54:24 fragment reassembly bugfix - bitmap was not correctly initialized fragment reassembly code cleanup fragment header modified - 16 bit unsigned integers are enough for our mtu Affected files ... .. //depot/projects/soc2007/mharvan-mtund/mtund.src/mtund.c#13 edit Differences ... ==== //depot/projects/soc2007/mharvan-mtund/mtund.src/mtund.c#13 (text+ko) ==== @@ -71,23 +71,23 @@ /* DATA TYPES */ /* fragment header */ struct frag_hdr { - u_int8_t dispatch; - uint id; /* ID of the packet. same in each fragment + uint8_t dispatch; + uint16_t id; /* ID of the packet. same in each fragment * belonging to the same packet */ - uint size; /* length of the whole packet, same in each fragment */ - uint offset; /* fragment offset (in bytes) from the beginning + uint16_t size; /* length of the whole packet, same in each fragment */ + uint16_t offset;/* fragment offset (in bytes) from the beginning * of the packet */ }; /* info about a packet being reassembled from fragments */ struct frag_info { - uint id; /* ID of the packet. same in each fragment + uint16_t id; /* ID of the packet. same in each fragment * belonging to the same packet */ - uint size; /* length of the whole packet, same + uint16_t size; /* length of the whole packet, same * in each fragment */ time_t tv_sec; /* seconds after epoch when reassembly * of this packet started */ - u_int8_t *bitmap; /* bitmap representing already + uint8_t *bitmap; /* bitmap representing already * received parts of the packet */ char *buf; /* buffer into which the fragment is * reassembled */ @@ -112,7 +112,7 @@ char frag_data[MTU+sizeof(struct frag_hdr)]; char *frag_datap; int frag_data_len; - uint frag_id;/* id for the next packet to be fragmented */ + uint16_t frag_id;/* id for the next packet to be fragmented */ /* fragment reassembly information */ LIST_HEAD(frag_infos_head, frag_info) frag_infos; }; @@ -709,8 +709,6 @@ break; case DISPATCH_FRAG: /* fragment reassembly */ - pl->conn_map(pl, *clid, CONN_PERM); - if (len <= sizeof(*frag_hdr)) { plugin_report(pl, *clid, REPORT_ERROR_RECEIVE); return; @@ -729,7 +727,7 @@ if (np->id == frag_hdr->id && np->size == frag_hdr->size) { /* found in list */ - fprintf(stderr, "found frag info in list\n"); + debug("found frag info in list\n"); p = np; break; } @@ -753,7 +751,7 @@ "fragment reassembly: out of memory\n"); return; } - p->bitmap = malloc(frag_hdr->size/8 + 1); + p->bitmap = malloc(frag_hdr->size / 8 + 1); if (!p->bitmap) { free(p->buf); free(p); @@ -761,8 +759,8 @@ "fragment reassembly: out of memory\n"); return; } - memset(p->bitmap, 0, sizeof(*(p->bitmap))); - + memset(p->bitmap, 0, frag_hdr->size / 8 + 1); + /* collect information about the fragments */ gettimeofday(&tv, NULL); p->id = frag_hdr->id; @@ -771,49 +769,47 @@ LIST_INSERT_HEAD(&cl->frag_infos, p, frag_infos); } - if (frag_hdr->offset + len <= p->size) { - /* copy the data */ - memcpy(p->buf + frag_hdr->offset, data, len); - /* update the bitmap - * - * We ignore fragment overlaps as these should - * be caught by the upper layer - * checksum. Actually, they should not happen - * at all. - */ - for (i = frag_hdr->offset; i < frag_hdr->offset+len; - i++) - p->bitmap[i/8] |= (0x1 << (i%8)); - } else { - debug("fragment outside of packet payload\n"); + if (frag_hdr->offset + len > p->size) { + debug("fragment payload outside of packet payload\n"); return; } + /* copy the data */ + memcpy(p->buf + frag_hdr->offset, data, len); + /* update the bitmap + * + * We ignore fragment overlaps as these should + * be caught by the upper layer + * checksum. Actually, they should not happen + * at all. + */ + for (i = frag_hdr->offset; i < frag_hdr->offset+len; i++) + p->bitmap[i/8] |= (0x1 << (i%8)); /* * Fragment was processed without errors, so it was * valid traffic and the plugin used by this client * should be updated. */ + pl->conn_map(pl, *clid, CONN_PERM); set_client_pl(cl, pl); /* check if the complete packet has been reassembled */ dgram_reassembled = 1; /* examine the bitmap */ - for(i=0; i < p->size/8 && dgram_reassembled; i++) { + for(i = 0; i < p->size / 8 && dgram_reassembled; i++) { if (p->bitmap[i] != 0xff) { dgram_reassembled = 0; } } - for(i=0; i < p->size%8 && dgram_reassembled; i++) { - if (! (p->bitmap[p->size/8] & (1 << i))) { - dgram_reassembled=0; + for(i = 0; i < p->size % 8 && dgram_reassembled; i++) { + if ((p->bitmap[p->size / 8] & (1 << i)) == 0) { + dgram_reassembled = 0; } } /* packet completely reassembled */ - if (dgram_reassembled) { + if (dgram_reassembled != 0) { debug("frag reassembly: packet complete\n"); - set_client_pl(cl, pl); /* pass the reassembled packet to the tun device */ tun_send(cl, p->buf, p->size); @@ -1066,6 +1062,7 @@ int consumed; int n; + debug("send_next_frag: frag_hdr.size: %u\n", cl->frag_hdr.size); if (server) { while(cl->frag_data_len > sizeof(cl->frag_hdr) && nwrite == SEND_PKT_SENT) { @@ -1132,6 +1129,7 @@ n = cl->frag_data_len; nwrite = cl->pl->send(cl->pl, cl->clid, cl->frag_datap, n, NORMAL_DATA, &consumed); + debug("send_next_frag: consumed: %d\n", consumed); switch (nwrite) { case SEND_PKT_SENT: case SEND_PKT_QUEUED: @@ -1327,23 +1325,23 @@ signal(SIGTERM, sigcb); /* load plugins */ - if (server) { - pl = load_plugin("./plugin_udp_catchall.so"); - pl->name = "udp_catchall"; - } else { /* client */ +/* if (server) { */ +/* pl = load_plugin("./plugin_udp_catchall.so"); */ +/* pl->name = "udp_catchall"; */ +/* } else { /\* client *\/ */ pl = load_plugin("./plugin_udp.so"); pl->name = "udp_1234"; - pl = load_plugin("./plugin_udp.so"); - pl->name = "udp_1235"; /* pl = load_plugin("./plugin_udp.so"); */ -/* pl->name = "udp_53"; */ - } - pl = load_plugin("./plugin_tcp.so"); - pl->name = "tcp_1234"; - pl = load_plugin("./plugin_icmp.so"); - pl->name = "icmp"; - pl = load_plugin("./plugin_dns/plugin_dns.so"); - pl->name = "dns_53"; +/* pl->name = "udp_1235"; */ +/* /\* pl = load_plugin("./plugin_udp.so"); *\/ */ +/* /\* pl->name = "udp_53"; *\/ */ +/* } */ +/* pl = load_plugin("./plugin_tcp.so"); */ +/* pl->name = "tcp_1234"; */ +/* pl = load_plugin("./plugin_icmp.so"); */ +/* pl->name = "icmp"; */ +/* pl = load_plugin("./plugin_dns/plugin_dns.so"); */ +/* pl->name = "dns_53"; */ if (server) { /* initialize all plugins */