Date: Sat, 25 Aug 2007 13:54:34 GMT From: Matus Harvan <mharvan@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 125663 for review Message-ID: <200708251354.l7PDsYvk061278@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
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 */
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200708251354.l7PDsYvk061278>