diff options
author | Michael Tüxen <tuexen@fh-muenster.de> | 2012-02-21 16:32:25 +0000 |
---|---|---|
committer | Michael Tüxen <tuexen@fh-muenster.de> | 2012-02-21 16:32:25 +0000 |
commit | 877edcc89dca64b81ae16761208e1002938ed531 (patch) | |
tree | fc3d43af3ce9a34047e51727b9c7a629111d0f7c | |
parent | bb3a686a99477e3e98f84238f8d46ebc2f526352 (diff) |
When writing an option in an IDB, also write an endofoption option.
Use (consistently) 0 as the default for the interface speed.
While there, do some whitespace cleanups.
svn path=/trunk/; revision=41118
-rw-r--r-- | wiretap/pcapng.c | 132 |
1 files changed, 72 insertions, 60 deletions
diff --git a/wiretap/pcapng.c b/wiretap/pcapng.c index 92ec6d4b52..b0493a38c2 100644 --- a/wiretap/pcapng.c +++ b/wiretap/pcapng.c @@ -70,7 +70,7 @@ #include "pcap-encap.h" #include "pcapng.h" -#if 0 +#if 1 #define pcapng_debug0(str) g_warning(str) #define pcapng_debug1(str,p1) g_warning(str,p1) #define pcapng_debug2(str,p1,p2) g_warning(str,p1,p2) @@ -189,9 +189,10 @@ struct option { #define BLOCK_TYPE_SHB 0x0A0D0D0A /* Section Header Block */ /* Options */ +#define OPT_EOFOPT 0 #define OPT_COMMENT 1 #define OPT_SHB_HARDWARE 2 -#define OPT_SHB_OS 3 +#define OPT_SHB_OS 3 #define OPT_SHB_USERAPPL 4 /* Capture section */ @@ -242,7 +243,7 @@ typedef struct wtapng_if_descr_s { /* XXX: if_IPv6addr opt 5 Interface network address and prefix length (stored in the last byte).*/ /* XXX: if_MACaddr opt 6 Interface Hardware MAC address (48 bits).*/ /* XXX: if_EUIaddr opt 7 Interface Hardware EUI address (64 bits)*/ - guint64 if_speed; /* 0xFFFFFFFF if unknown, opt 8 Interface speed (in bps). 100000000 for 100Mbps */ + guint64 if_speed; /* 0 if unknown, opt 8 Interface speed (in bps). 100000000 for 100Mbps */ guint8 if_tsresol; /* default is 6 for microsecond resolution, opt 9 Resolution of timestamps. * If the Most Significant Bit is equal to zero, the remaining bits indicates the resolution of the timestamp as as a negative power of 10 */ @@ -667,18 +668,18 @@ pcapng_read_if_descr_block(FILE_T fh, pcapng_block_header_t *bh, pcapng_t *pn, } /* Option defaults */ - wblock->data.if_descr.opt_comment = NULL; - wblock->data.if_descr.if_name = NULL; - wblock->data.if_descr.if_description = NULL; + wblock->data.if_descr.opt_comment = NULL; + wblock->data.if_descr.if_name = NULL; + wblock->data.if_descr.if_description = NULL; /* XXX: if_IPv4addr */ /* XXX: if_IPv6addr */ /* XXX: if_MACaddr */ /* XXX: if_EUIaddr */ - wblock->data.if_descr.if_speed = 0; /* "unknown" */ - wblock->data.if_descr.if_tsresol = 6; /* default is 6 for microsecond resolution */ - wblock->data.if_descr.if_filter = NULL; - wblock->data.if_descr.if_os = NULL; - wblock->data.if_descr.if_fcslen = -1; /* unknown or changes between packets */ + wblock->data.if_descr.if_speed = 0; /* "unknown" */ + wblock->data.if_descr.if_tsresol = 6; /* default is 6 for microsecond resolution */ + wblock->data.if_descr.if_filter = NULL; + wblock->data.if_descr.if_os = NULL; + wblock->data.if_descr.if_fcslen = -1; /* unknown or changes between packets */ /* XXX: guint64 if_tsoffset; */ @@ -713,7 +714,7 @@ pcapng_read_if_descr_block(FILE_T fh, pcapng_block_header_t *bh, pcapng_t *pn, to_read = 0; break; case(1): /* opt_comment */ - if(oh.option_length > 0 && oh.option_length < opt_cont_buf_len) { + if (oh.option_length > 0 && oh.option_length < opt_cont_buf_len) { wblock->data.if_descr.opt_comment = g_strndup(option_content, oh.option_length); pcapng_debug1("pcapng_read_if_descr_block: opt_comment %s", wblock->data.if_descr.opt_comment); } else { @@ -721,7 +722,7 @@ pcapng_read_if_descr_block(FILE_T fh, pcapng_block_header_t *bh, pcapng_t *pn, } break; case(2): /* if_name */ - if(oh.option_length > 0 && oh.option_length < opt_cont_buf_len) { + if (oh.option_length > 0 && oh.option_length < opt_cont_buf_len) { wblock->data.if_descr.if_name = g_strndup(option_content, oh.option_length); pcapng_debug1("pcapng_read_if_descr_block: if_name %s", wblock->data.if_descr.if_name); } else { @@ -729,7 +730,7 @@ pcapng_read_if_descr_block(FILE_T fh, pcapng_block_header_t *bh, pcapng_t *pn, } break; case(3): /* if_description */ - if(oh.option_length > 0 && oh.option_length < opt_cont_buf_len) { + if (oh.option_length > 0 && oh.option_length < opt_cont_buf_len) { wblock->data.if_descr.if_description = g_strndup(option_content, oh.option_length); pcapng_debug1("pcapng_read_if_descr_block: if_description %s", wblock->data.if_descr.if_description); } else { @@ -743,7 +744,7 @@ pcapng_read_if_descr_block(FILE_T fh, pcapng_block_header_t *bh, pcapng_t *pn, * if_EUIaddr 7 Interface Hardware EUI address (64 bits), if available. TODO: give a good example */ case(8): /* if_speed */ - if(oh.option_length == 8) { + if (oh.option_length == 8) { /* Don't cast a char[] into a guint64--the * char[] may not be aligned correctly. */ @@ -791,7 +792,7 @@ pcapng_read_if_descr_block(FILE_T fh, pcapng_block_header_t *bh, pcapng_t *pn, * if_tzone 10 Time zone for GMT support (TODO: specify better). TODO: give a good example */ case(11): /* if_filter */ - if(oh.option_length > 0 && oh.option_length < opt_cont_buf_len) { + if (oh.option_length > 0 && oh.option_length < opt_cont_buf_len) { wblock->data.if_descr.if_filter = g_strndup(option_content, oh.option_length); pcapng_debug1("pcapng_read_if_descr_block: if_filter %s", wblock->data.if_descr.if_filter); } else { @@ -804,7 +805,7 @@ pcapng_read_if_descr_block(FILE_T fh, pcapng_block_header_t *bh, pcapng_t *pn, * This can be different from the same information that can be contained by the Section Header Block (Section 3.1 (Section Header Block (mandatory))) * because the capture can have been done on a remote machine. "Windows XP SP2" / "openSUSE 10.2" / ... */ - if(oh.option_length > 0 && oh.option_length < opt_cont_buf_len) { + if (oh.option_length > 0 && oh.option_length < opt_cont_buf_len) { wblock->data.if_descr.if_os = g_strndup(option_content, oh.option_length); pcapng_debug1("pcapng_read_if_descr_block: if_os %s", wblock->data.if_descr.if_os); } else { @@ -812,7 +813,7 @@ pcapng_read_if_descr_block(FILE_T fh, pcapng_block_header_t *bh, pcapng_t *pn, } break; case(13): /* if_fcslen */ - if(oh.option_length == 1) { + if (oh.option_length == 1) { wblock->data.if_descr.if_fcslen = option_content[0]; pn->if_fcslen = wblock->data.if_descr.if_fcslen; pcapng_debug1("pcapng_read_if_descr_block: if_fcslen %u", wblock->data.if_descr.if_fcslen); @@ -1871,56 +1872,56 @@ pcapng_write_section_header_block(wtap_dumper *wdh, wtapng_block_t *wblock, int guint32 comment_len = 0, shb_hardware_len = 0, shb_os_len = 0, shb_user_appl_len = 0; guint32 comment_pad_len = 0, shb_hardware_pad_len = 0, shb_os_pad_len = 0, shb_user_appl_pad_len = 0; - if(wdh->shb_hdr){ + if (wdh->shb_hdr) { pcapng_debug0("pcapng_write_section_header_block: Have shb_hdr"); /* Check if we should write comment option */ - if(wdh->shb_hdr->opt_comment){ + if (wdh->shb_hdr->opt_comment) { have_options = TRUE; comment_len = (guint32)strlen(wdh->shb_hdr->opt_comment) & 0xffff; - if((comment_len % 4)){ + if ((comment_len % 4)) { comment_pad_len = 4 - (comment_len % 4); - }else{ + } else { comment_pad_len = 0; } options_total_length = options_total_length + comment_len + comment_pad_len + 4 /* comment options tag */ ; } /* Check if we should write shb_hardware option */ - if(wdh->shb_hdr->shb_hardware){ + if (wdh->shb_hdr->shb_hardware) { have_options = TRUE; shb_hardware_len = (guint32)strlen(wdh->shb_hdr->shb_hardware) & 0xffff; - if((shb_hardware_len % 4)){ + if ((shb_hardware_len % 4)) { shb_hardware_pad_len = 4 - (shb_hardware_len % 4); - }else{ + } else { shb_hardware_pad_len = 0; } options_total_length = options_total_length + shb_hardware_len + shb_hardware_pad_len + 4 /* options tag */ ; } /* Check if we should write shb_os option */ - if(wdh->shb_hdr->shb_os){ + if (wdh->shb_hdr->shb_os) { have_options = TRUE; shb_os_len = (guint32)strlen(wdh->shb_hdr->shb_os) & 0xffff; - if((shb_os_len % 4)){ + if ((shb_os_len % 4)) { shb_os_pad_len = 4 - (shb_os_len % 4); - }else{ + } else { shb_os_pad_len = 0; } options_total_length = options_total_length + shb_os_len + shb_os_pad_len + 4 /* options tag */ ; } /* Check if we should write shb_user_appl option */ - if(wdh->shb_hdr->shb_user_appl){ + if (wdh->shb_hdr->shb_user_appl) { have_options = TRUE; shb_user_appl_len = (guint32)strlen(wdh->shb_hdr->shb_user_appl) & 0xffff; - if((shb_user_appl_len % 4)){ + if ((shb_user_appl_len % 4)) { shb_user_appl_pad_len = 4 - (shb_user_appl_len % 4); - }else{ + } else { shb_user_appl_pad_len = 0; } options_total_length = options_total_length + shb_user_appl_len + shb_user_appl_pad_len + 4 /* options tag */ ; } - if(have_options){ + if (have_options) { /* End-of-optios tag */ options_total_length += 4; } @@ -1953,7 +1954,7 @@ pcapng_write_section_header_block(wtap_dumper *wdh, wtapng_block_t *wblock, int * shb_user_appl 4 */ - if(comment_len){ + if (comment_len) { option_hdr.type = OPT_COMMENT; option_hdr.value_length = comment_len; if (!wtap_dump_file_write(wdh, &option_hdr, 4, err)) @@ -1974,7 +1975,7 @@ pcapng_write_section_header_block(wtap_dumper *wdh, wtapng_block_t *wblock, int } } - if(shb_hardware_len){ + if (shb_hardware_len) { option_hdr.type = OPT_SHB_HARDWARE; option_hdr.value_length = shb_hardware_len; if (!wtap_dump_file_write(wdh, &option_hdr, 4, err)) @@ -1995,7 +1996,7 @@ pcapng_write_section_header_block(wtap_dumper *wdh, wtapng_block_t *wblock, int } } - if(shb_os_len){ + if (shb_os_len) { option_hdr.type = OPT_SHB_OS; option_hdr.value_length = shb_os_len; if (!wtap_dump_file_write(wdh, &option_hdr, 4, err)) @@ -2016,7 +2017,7 @@ pcapng_write_section_header_block(wtap_dumper *wdh, wtapng_block_t *wblock, int } } - if(shb_user_appl_len){ + if (shb_user_appl_len) { option_hdr.type = OPT_SHB_USERAPPL; option_hdr.value_length = shb_user_appl_len; if (!wtap_dump_file_write(wdh, &option_hdr, 4, err)) @@ -2038,7 +2039,9 @@ pcapng_write_section_header_block(wtap_dumper *wdh, wtapng_block_t *wblock, int } /* Write end of options if we have otions */ - if(have_options){ + if (have_options) { + option_hdr.type = OPT_EOFOPT; + option_hdr.value_length = 0; if (!wtap_dump_file_write(wdh, &zero_pad, 4, err)) return FALSE; wdh->bytes_dumped += 4; @@ -2084,12 +2087,12 @@ pcapng_write_if_descr_block(wtap_dumper *wdh, wtapng_block_t *wblock, int *err) } /* Calculate options length */ - if(wblock->data.if_descr.opt_comment){ + if (wblock->data.if_descr.opt_comment) { have_options = TRUE; comment_len = (guint32)strlen(wblock->data.if_descr.opt_comment) & 0xffff; - if((comment_len % 4)){ + if ((comment_len % 4)){ comment_pad_len = 4 - (comment_len % 4); - }else{ + } else { comment_pad_len = 0; } options_total_length = options_total_length + comment_len + comment_pad_len + 4 /* comment options tag */ ; @@ -2098,12 +2101,12 @@ pcapng_write_if_descr_block(wtap_dumper *wdh, wtapng_block_t *wblock, int *err) /* * if_name 2 A UTF-8 string containing the name of the device used to capture data. */ - if(wblock->data.if_descr.if_name){ + if (wblock->data.if_descr.if_name){ have_options = TRUE; if_name_len = (guint32)strlen(wblock->data.if_descr.if_name) & 0xffff; - if((if_name_len % 4)){ + if ((if_name_len % 4)) { if_name_pad_len = 4 - (if_name_len % 4); - }else{ + } else { if_name_pad_len = 0; } options_total_length = options_total_length + if_name_len + if_name_pad_len + 4 /* comment options tag */ ; @@ -2112,12 +2115,12 @@ pcapng_write_if_descr_block(wtap_dumper *wdh, wtapng_block_t *wblock, int *err) /* * if_description 3 A UTF-8 string containing the description of the device used to capture data. */ - if(wblock->data.if_descr.if_description){ + if (wblock->data.if_descr.if_description) { have_options = TRUE; if_name_len = (guint32)strlen(wblock->data.if_descr.if_description) & 0xffff; - if((if_description_len % 4)){ + if ((if_description_len % 4)) { if_description_pad_len = 4 - (if_description_len % 4); - }else{ + } else { if_description_pad_len = 0; } options_total_length = options_total_length + if_description_len + if_description_pad_len + 4 /* comment options tag */ ; @@ -2131,14 +2134,14 @@ pcapng_write_if_descr_block(wtap_dumper *wdh, wtapng_block_t *wblock, int *err) /* * if_speed 8 Interface speed (in bps). 100000000 for 100Mbps */ - if(wblock->data.if_descr.if_speed != 0){ + if (wblock->data.if_descr.if_speed != 0) { have_options = TRUE; options_total_length = options_total_length + 8 + 4; } /* * if_tsresol 9 Resolution of timestamps. */ - if(wblock->data.if_descr.if_tsresol != 0){ + if (wblock->data.if_descr.if_tsresol != 0) { have_options = TRUE; options_total_length = options_total_length + 4 + 4; } @@ -2148,17 +2151,17 @@ pcapng_write_if_descr_block(wtap_dumper *wdh, wtapng_block_t *wblock, int *err) /* * if_filter 11 The filter (e.g. "capture only TCP traffic") used to capture traffic. */ - if(wblock->data.if_descr.if_filter){ + if (wblock->data.if_descr.if_filter) { } /* * if_os 12 A UTF-8 string containing the name of the operating system of the machine in which this interface is installed. */ - if(wblock->data.if_descr.if_os){ + if (wblock->data.if_descr.if_os) { have_options = TRUE; if_name_len = (guint32)strlen(wblock->data.if_descr.if_os) & 0xffff; - if((if_os_len % 4)){ + if ((if_os_len % 4)) { if_os_pad_len = 4 - (if_os_len % 4); - }else{ + } else { if_os_pad_len = 0; } options_total_length = options_total_length + if_os_len + if_os_pad_len + 4 /* comment options tag */ ; @@ -2166,14 +2169,14 @@ pcapng_write_if_descr_block(wtap_dumper *wdh, wtapng_block_t *wblock, int *err) /* * if_fcslen 13 An integer value that specified the length of the Frame Check Sequence (in bits) for this interface. */ - if(wblock->data.if_descr.opt_comment){ + if (wblock->data.if_descr.opt_comment) { } /* Not used * if_tsoffset 14 A 64 bits integer value that specifies an offset (in seconds) that must be added to the timestamp of each packet * to obtain the absolute timestamp of a packet. If the option is missing, the timestamps stored in the packet must be considered absolute timestamps. */ - if(have_options){ + if (have_options) { /* End-of-optios tag */ options_total_length += 4; } @@ -2196,7 +2199,7 @@ pcapng_write_if_descr_block(wtap_dumper *wdh, wtapng_block_t *wblock, int *err) wdh->bytes_dumped += sizeof idb; /* XXX - write (optional) block options */ - if(comment_len){ + if (comment_len) { option_hdr.type = OPT_COMMENT; option_hdr.value_length = comment_len; if (!wtap_dump_file_write(wdh, &option_hdr, 4, err)) @@ -2219,7 +2222,7 @@ pcapng_write_if_descr_block(wtap_dumper *wdh, wtapng_block_t *wblock, int *err) /* * if_name 2 A UTF-8 string containing the name of the device used to capture data. */ - if(if_name_len){ + if (if_name_len) { option_hdr.type = IDB_OPT_IF_NAME; option_hdr.value_length = if_name_len; if (!wtap_dump_file_write(wdh, &option_hdr, 4, err)) @@ -2242,7 +2245,7 @@ pcapng_write_if_descr_block(wtap_dumper *wdh, wtapng_block_t *wblock, int *err) /* * if_description 3 A UTF-8 string containing the description of the device used to capture data. */ - if(if_description_len){ + if (if_description_len) { option_hdr.type = IDB_OPT_IF_NAME; option_hdr.value_length = if_description_len; if (!wtap_dump_file_write(wdh, &option_hdr, 4, err)) @@ -2271,7 +2274,8 @@ pcapng_write_if_descr_block(wtap_dumper *wdh, wtapng_block_t *wblock, int *err) /* * if_speed 8 Interface speed (in bps). 100000000 for 100Mbps */ - if(wblock->data.if_descr.if_speed != 0){ + if (wblock->data.if_descr.if_speed != 0) { + printf("HJKHJHK\n"); option_hdr.type = IDB_OPT_IF_SPEED; option_hdr.value_length = 8; if (!wtap_dump_file_write(wdh, &option_hdr, 4, err)) @@ -2287,7 +2291,7 @@ pcapng_write_if_descr_block(wtap_dumper *wdh, wtapng_block_t *wblock, int *err) /* * if_tsresol 9 Resolution of timestamps. */ - if(wblock->data.if_descr.if_tsresol != 0){ + if (wblock->data.if_descr.if_tsresol != 0) { option_hdr.type = IDB_OPT_IF_TSRESOL; option_hdr.value_length = 1; if (!wtap_dump_file_write(wdh, &option_hdr, 4, err)) @@ -2312,7 +2316,7 @@ pcapng_write_if_descr_block(wtap_dumper *wdh, wtapng_block_t *wblock, int *err) /* * if_os 12 A UTF-8 string containing the name of the operating system of the machine in which this interface is installed. */ - if(if_os_len){ + if (if_os_len) { option_hdr.type = IDB_OPT_IF_OS; option_hdr.value_length = if_os_len; if (!wtap_dump_file_write(wdh, &option_hdr, 4, err)) @@ -2333,6 +2337,14 @@ pcapng_write_if_descr_block(wtap_dumper *wdh, wtapng_block_t *wblock, int *err) } } + if (have_options) { + option_hdr.type = OPT_EOFOPT; + option_hdr.value_length = 0; + if (!wtap_dump_file_write(wdh, &option_hdr, 4, err)) + return FALSE; + wdh->bytes_dumped += 4; + } + /* * if_fcslen 13 An integer value that specified the length of the Frame Check Sequence (in bits) for this interface. */ |