diff options
author | Guy Harris <guy@alum.mit.edu> | 2018-09-25 19:47:13 -0700 |
---|---|---|
committer | Guy Harris <guy@alum.mit.edu> | 2018-09-26 02:47:54 +0000 |
commit | 3ddc3b076139b8d609d8474be9f51b63ff89dc9c (patch) | |
tree | 81cb749f6c83427792d876a75e4b91bd2f347357 /wiretap/pcap-common.c | |
parent | 7e928c8a51ebf53c6c27108c2968bdfe51eb65e0 (diff) |
Put the code for writing pseudo-headers into individual routines.
For each pseudo-header type, put a routine to write the pseudo-header
after the routine to read it.
Change-Id: Iffc010c1bf97acc5eb834a388e328ad3c2310351
Reviewed-on: https://code.wireshark.org/review/29840
Reviewed-by: Guy Harris <guy@alum.mit.edu>
Diffstat (limited to 'wiretap/pcap-common.c')
-rw-r--r-- | wiretap/pcap-common.c | 302 |
1 files changed, 195 insertions, 107 deletions
diff --git a/wiretap/pcap-common.c b/wiretap/pcap-common.c index cc42e0ea2e..8ef5481625 100644 --- a/wiretap/pcap-common.c +++ b/wiretap/pcap-common.c @@ -872,6 +872,52 @@ pcap_read_sunatm_pseudoheader(FILE_T fh, return SUNATM_LEN; } +static gboolean +pcap_write_sunatm_pseudoheader(wtap_dumper *wdh, + const union wtap_pseudo_header *pseudo_header, int *err) +{ + guint8 atm_hdr[SUNATM_LEN]; + + /* + * Write the ATM header. + */ + atm_hdr[SUNATM_FLAGS] = + (pseudo_header->atm.channel == 0) ? 0x80 : 0x00; + switch (pseudo_header->atm.aal) { + + case AAL_SIGNALLING: + /* Q.2931 */ + atm_hdr[SUNATM_FLAGS] |= 0x06; + break; + + case AAL_5: + switch (pseudo_header->atm.type) { + + case TRAF_LANE: + /* LANE */ + atm_hdr[SUNATM_FLAGS] |= 0x01; + break; + + case TRAF_LLCMX: + /* RFC 1483 LLC multiplexed traffic */ + atm_hdr[SUNATM_FLAGS] |= 0x02; + break; + + case TRAF_ILMI: + /* ILMI */ + atm_hdr[SUNATM_FLAGS] |= 0x05; + break; + } + break; + } + atm_hdr[SUNATM_VPI] = (guint8)pseudo_header->atm.vpi; + phtons(&atm_hdr[SUNATM_VCI], pseudo_header->atm.vci); + if (!wtap_dump_file_write(wdh, atm_hdr, sizeof(atm_hdr), err)) + return FALSE; + wdh->bytes_dumped += sizeof(atm_hdr); + return TRUE; +} + /* * The link-layer header on Nokia IPSO ATM packets. */ @@ -990,6 +1036,24 @@ pcap_read_irda_pseudoheader(FILE_T fh, union wtap_pseudo_header *pseudo_header, return IRDA_SLL_LEN; } +static gboolean +pcap_write_irda_pseudoheader(wtap_dumper *wdh, + const union wtap_pseudo_header *pseudo_header, int *err) +{ + guint8 irda_hdr[IRDA_SLL_LEN]; + + /* + * Write the IrDA header. + */ + memset(irda_hdr, 0, sizeof(irda_hdr)); + phtons(&irda_hdr[IRDA_SLL_PKTTYPE_OFFSET], pseudo_header->irda.pkttype); + phtons(&irda_hdr[IRDA_SLL_PROTOCOL_OFFSET], 0x0017); + if (!wtap_dump_file_write(wdh, irda_hdr, sizeof(irda_hdr), err)) + return FALSE; + wdh->bytes_dumped += sizeof(irda_hdr); + return TRUE; +} + /* * A header containing additional MTP information. */ @@ -1024,6 +1088,26 @@ pcap_read_mtp2_pseudoheader(FILE_T fh, union wtap_pseudo_header *pseudo_header, return MTP2_HDR_LEN; } +static gboolean +pcap_write_mtp2_pseudoheader(wtap_dumper *wdh, + const union wtap_pseudo_header *pseudo_header, int *err) +{ + guint8 mtp2_hdr[MTP2_HDR_LEN]; + + /* + * Write the MTP2 header. + */ + memset(&mtp2_hdr, 0, sizeof(mtp2_hdr)); + mtp2_hdr[MTP2_SENT_OFFSET] = pseudo_header->mtp2.sent; + mtp2_hdr[MTP2_ANNEX_A_USED_OFFSET] = pseudo_header->mtp2.annex_a_used; + phtons(&mtp2_hdr[MTP2_LINK_NUMBER_OFFSET], + pseudo_header->mtp2.link_number); + if (!wtap_dump_file_write(wdh, mtp2_hdr, sizeof(mtp2_hdr), err)) + return FALSE; + wdh->bytes_dumped += sizeof(mtp2_hdr); + return TRUE; +} + /* * The fake link-layer header of LAPD packets. */ @@ -1070,6 +1154,26 @@ pcap_read_lapd_pseudoheader(FILE_T fh, union wtap_pseudo_header *pseudo_header, return LAPD_SLL_LEN; } +static gboolean +pcap_write_lapd_pseudoheader(wtap_dumper *wdh, + const union wtap_pseudo_header *pseudo_header, int *err) +{ + guint8 lapd_hdr[LAPD_SLL_LEN]; + + /* + * Write the LAPD header. + */ + memset(&lapd_hdr, 0, sizeof(lapd_hdr)); + phtons(&lapd_hdr[LAPD_SLL_PKTTYPE_OFFSET], pseudo_header->lapd.pkttype); + phtons(&lapd_hdr[LAPD_SLL_PROTOCOL_OFFSET], ETH_P_LAPD); + lapd_hdr[LAPD_SLL_ADDR_OFFSET + 0] = + pseudo_header->lapd.we_network?0x01:0x00; + if (!wtap_dump_file_write(wdh, lapd_hdr, sizeof(lapd_hdr), err)) + return FALSE; + wdh->bytes_dumped += sizeof(lapd_hdr); + return TRUE; +} + /* * A header containing additional SITA WAN information. */ @@ -1108,6 +1212,27 @@ pcap_read_sita_pseudoheader(FILE_T fh, union wtap_pseudo_header *pseudo_header, return SITA_HDR_LEN; } +static gboolean +pcap_write_sita_pseudoheader(wtap_dumper *wdh, + const union wtap_pseudo_header *pseudo_header, int *err) +{ + guint8 sita_hdr[SITA_HDR_LEN]; + + /* + * Write the SITA header. + */ + memset(&sita_hdr, 0, sizeof(sita_hdr)); + sita_hdr[SITA_FLAGS_OFFSET] = pseudo_header->sita.sita_flags; + sita_hdr[SITA_SIGNALS_OFFSET] = pseudo_header->sita.sita_signals; + sita_hdr[SITA_ERRORS1_OFFSET] = pseudo_header->sita.sita_errors1; + sita_hdr[SITA_ERRORS2_OFFSET] = pseudo_header->sita.sita_errors2; + sita_hdr[SITA_PROTO_OFFSET] = pseudo_header->sita.sita_proto; + if (!wtap_dump_file_write(wdh, sita_hdr, sizeof(sita_hdr), err)) + return FALSE; + wdh->bytes_dumped += sizeof(sita_hdr); + return TRUE; +} + /* * When not using the memory-mapped interface to capture USB events, * code that reads those events can use the MON_IOCX_GET ioctl to @@ -1522,6 +1647,19 @@ pcap_read_bt_pseudoheader(FILE_T fh, union wtap_pseudo_header *pseudo_header, return (int)sizeof (struct pcap_bt_phdr); } +static gboolean +pcap_write_bt_pseudoheader(wtap_dumper *wdh, + const union wtap_pseudo_header *pseudo_header, int *err) +{ + struct pcap_bt_phdr bt_hdr; + + bt_hdr.direction = GUINT32_TO_BE(pseudo_header->p2p.sent ? LIBPCAP_BT_PHDR_SENT : LIBPCAP_BT_PHDR_RECV); + if (!wtap_dump_file_write(wdh, &bt_hdr, sizeof bt_hdr, err)) + return FALSE; + wdh->bytes_dumped += sizeof bt_hdr; + return TRUE; +} + /* * Pseudo-header at the beginning of DLT_BLUETOOTH_LINUX_MONITOR frames. * Values in network byte order. @@ -1557,6 +1695,21 @@ pcap_read_bt_monitor_pseudoheader(FILE_T fh, return (int)sizeof (struct pcap_bt_monitor_phdr); } +static gboolean +pcap_write_bt_monitor_pseudoheader(wtap_dumper *wdh, + const union wtap_pseudo_header *pseudo_header, int *err) +{ + struct pcap_bt_monitor_phdr bt_monitor_hdr; + + bt_monitor_hdr.adapter_id = GUINT16_TO_BE(pseudo_header->btmon.adapter_id); + bt_monitor_hdr.opcode = GUINT16_TO_BE(pseudo_header->btmon.opcode); + + if (!wtap_dump_file_write(wdh, &bt_monitor_hdr, sizeof bt_monitor_hdr, err)) + return FALSE; + wdh->bytes_dumped += sizeof bt_monitor_hdr; + return TRUE; +} + /* * The NFC LLCP per-packet header. */ @@ -1618,6 +1771,20 @@ pcap_read_ppp_pseudoheader(FILE_T fh, union wtap_pseudo_header *pseudo_header, return (int)sizeof (struct pcap_ppp_phdr); } +static gboolean +pcap_write_ppp_pseudoheader(wtap_dumper *wdh, + const union wtap_pseudo_header *pseudo_header, int *err) +{ + struct pcap_ppp_phdr ppp_hdr; + + /* Any non-zero value means "sent" */ + ppp_hdr.direction = (pseudo_header->p2p.sent ? 1 : 0); + if (!wtap_dump_file_write(wdh, &ppp_hdr, sizeof ppp_hdr, err)) + return FALSE; + wdh->bytes_dumped += sizeof ppp_hdr; + return TRUE; +} + static int pcap_read_erf_pseudoheader(FILE_T fh, wtap_rec *rec, union wtap_pseudo_header *pseudo_header, guint packet_size, @@ -1772,6 +1939,25 @@ pcap_read_i2c_pseudoheader(FILE_T fh, union wtap_pseudo_header *pseudo_header, return (int)sizeof (struct i2c_file_hdr); } +static gboolean +pcap_write_i2c_pseudoheader(wtap_dumper *wdh, + const union wtap_pseudo_header *pseudo_header, int *err) +{ + struct i2c_file_hdr i2c_hdr; + + /* + * Write the I2C header. + */ + memset(&i2c_hdr, 0, sizeof(i2c_hdr)); + i2c_hdr.bus = pseudo_header->i2c.bus | + (pseudo_header->i2c.is_event ? 0x80 : 0x00); + phtonl((guint8 *)&i2c_hdr.flags, pseudo_header->i2c.flags); + if (!wtap_dump_file_write(wdh, &i2c_hdr, sizeof(i2c_hdr), err)) + return FALSE; + wdh->bytes_dumped += sizeof(i2c_hdr); + return TRUE; +} + int pcap_process_pseudo_header(FILE_T fh, int file_type, int wtap_encap, guint packet_size, wtap_rec *rec, int *err, gchar **err_info) @@ -2127,117 +2313,36 @@ gboolean pcap_write_phdr(wtap_dumper *wdh, int encap, const union wtap_pseudo_header *pseudo_header, int *err) { - guint8 atm_hdr[SUNATM_LEN]; - guint8 irda_hdr[IRDA_SLL_LEN]; - guint8 lapd_hdr[LAPD_SLL_LEN]; - guint8 mtp2_hdr[MTP2_HDR_LEN]; - guint8 sita_hdr[SITA_HDR_LEN]; guint8 erf_hdr[ sizeof(struct erf_mc_phdr)]; guint8 erf_subhdr[sizeof(union erf_subhdr)]; - struct i2c_file_hdr i2c_hdr; - struct pcap_bt_phdr bt_hdr; - struct pcap_bt_monitor_phdr bt_monitor_hdr; - struct pcap_ppp_phdr ppp_hdr; size_t size; size_t subhdr_size = 0; switch (encap) { case WTAP_ENCAP_ATM_PDUS: - /* - * Write the ATM header. - */ - atm_hdr[SUNATM_FLAGS] = - (pseudo_header->atm.channel == 0) ? 0x80 : 0x00; - switch (pseudo_header->atm.aal) { - - case AAL_SIGNALLING: - /* Q.2931 */ - atm_hdr[SUNATM_FLAGS] |= 0x06; - break; - - case AAL_5: - switch (pseudo_header->atm.type) { - - case TRAF_LANE: - /* LANE */ - atm_hdr[SUNATM_FLAGS] |= 0x01; - break; - - case TRAF_LLCMX: - /* RFC 1483 LLC multiplexed traffic */ - atm_hdr[SUNATM_FLAGS] |= 0x02; - break; - - case TRAF_ILMI: - /* ILMI */ - atm_hdr[SUNATM_FLAGS] |= 0x05; - break; - } - break; - } - atm_hdr[SUNATM_VPI] = (guint8)pseudo_header->atm.vpi; - phtons(&atm_hdr[SUNATM_VCI], pseudo_header->atm.vci); - if (!wtap_dump_file_write(wdh, atm_hdr, sizeof(atm_hdr), err)) + if (!pcap_write_sunatm_pseudoheader(wdh, pseudo_header, err)) return FALSE; - wdh->bytes_dumped += sizeof(atm_hdr); break; case WTAP_ENCAP_IRDA: - /* - * Write the IrDA header. - */ - memset(irda_hdr, 0, sizeof(irda_hdr)); - phtons(&irda_hdr[IRDA_SLL_PKTTYPE_OFFSET], - pseudo_header->irda.pkttype); - phtons(&irda_hdr[IRDA_SLL_PROTOCOL_OFFSET], 0x0017); - if (!wtap_dump_file_write(wdh, irda_hdr, sizeof(irda_hdr), err)) + if (!pcap_write_irda_pseudoheader(wdh, pseudo_header, err)) return FALSE; - wdh->bytes_dumped += sizeof(irda_hdr); break; case WTAP_ENCAP_MTP2_WITH_PHDR: - /* - * Write the MTP2 header. - */ - memset(&mtp2_hdr, 0, sizeof(mtp2_hdr)); - mtp2_hdr[MTP2_SENT_OFFSET] = pseudo_header->mtp2.sent; - mtp2_hdr[MTP2_ANNEX_A_USED_OFFSET] = pseudo_header->mtp2.annex_a_used; - phtons(&mtp2_hdr[MTP2_LINK_NUMBER_OFFSET], - pseudo_header->mtp2.link_number); - if (!wtap_dump_file_write(wdh, mtp2_hdr, sizeof(mtp2_hdr), err)) + if (!pcap_write_mtp2_pseudoheader(wdh, pseudo_header, err)) return FALSE; - wdh->bytes_dumped += sizeof(mtp2_hdr); break; case WTAP_ENCAP_LINUX_LAPD: - /* - * Write the LAPD header. - */ - memset(&lapd_hdr, 0, sizeof(lapd_hdr)); - phtons(&lapd_hdr[LAPD_SLL_PKTTYPE_OFFSET], - pseudo_header->lapd.pkttype); - phtons(&lapd_hdr[LAPD_SLL_PROTOCOL_OFFSET], ETH_P_LAPD); - lapd_hdr[LAPD_SLL_ADDR_OFFSET + 0] = - pseudo_header->lapd.we_network?0x01:0x00; - if (!wtap_dump_file_write(wdh, lapd_hdr, sizeof(lapd_hdr), err)) + if (!pcap_write_lapd_pseudoheader(wdh, pseudo_header, err)) return FALSE; - wdh->bytes_dumped += sizeof(lapd_hdr); break; case WTAP_ENCAP_SITA: - /* - * Write the SITA header. - */ - memset(&sita_hdr, 0, sizeof(sita_hdr)); - sita_hdr[SITA_FLAGS_OFFSET] = pseudo_header->sita.sita_flags; - sita_hdr[SITA_SIGNALS_OFFSET] = pseudo_header->sita.sita_signals; - sita_hdr[SITA_ERRORS1_OFFSET] = pseudo_header->sita.sita_errors1; - sita_hdr[SITA_ERRORS2_OFFSET] = pseudo_header->sita.sita_errors2; - sita_hdr[SITA_PROTO_OFFSET] = pseudo_header->sita.sita_proto; - if (!wtap_dump_file_write(wdh, sita_hdr, sizeof(sita_hdr), err)) + if (!pcap_write_sita_pseudoheader(wdh, pseudo_header, err)) return FALSE; - wdh->bytes_dumped += sizeof(sita_hdr); break; case WTAP_ENCAP_ERF: @@ -2324,40 +2429,23 @@ pcap_write_phdr(wtap_dumper *wdh, int encap, const union wtap_pseudo_header *pse break; case WTAP_ENCAP_I2C: - /* - * Write the I2C header. - */ - memset(&i2c_hdr, 0, sizeof(i2c_hdr)); - i2c_hdr.bus = pseudo_header->i2c.bus | - (pseudo_header->i2c.is_event ? 0x80 : 0x00); - phtonl((guint8 *)&i2c_hdr.flags, pseudo_header->i2c.flags); - if (!wtap_dump_file_write(wdh, &i2c_hdr, sizeof(i2c_hdr), err)) + if (!pcap_write_i2c_pseudoheader(wdh, pseudo_header, err)) return FALSE; - wdh->bytes_dumped += sizeof(i2c_hdr); break; case WTAP_ENCAP_BLUETOOTH_H4_WITH_PHDR: - bt_hdr.direction = GUINT32_TO_BE(pseudo_header->p2p.sent ? LIBPCAP_BT_PHDR_SENT : LIBPCAP_BT_PHDR_RECV); - if (!wtap_dump_file_write(wdh, &bt_hdr, sizeof bt_hdr, err)) + if (!pcap_write_bt_pseudoheader(wdh, pseudo_header, err)) return FALSE; - wdh->bytes_dumped += sizeof bt_hdr; break; case WTAP_ENCAP_BLUETOOTH_LINUX_MONITOR: - bt_monitor_hdr.adapter_id = GUINT16_TO_BE(pseudo_header->btmon.adapter_id); - bt_monitor_hdr.opcode = GUINT16_TO_BE(pseudo_header->btmon.opcode); - - if (!wtap_dump_file_write(wdh, &bt_monitor_hdr, sizeof bt_monitor_hdr, err)) + if (!pcap_write_bt_monitor_pseudoheader(wdh, pseudo_header, err)) return FALSE; - wdh->bytes_dumped += sizeof bt_monitor_hdr; break; case WTAP_ENCAP_PPP_WITH_PHDR: - /* Any non-zero value means "sent" */ - ppp_hdr.direction = (pseudo_header->p2p.sent ? 1 : 0); - if (!wtap_dump_file_write(wdh, &ppp_hdr, sizeof ppp_hdr, err)) + if (!pcap_write_ppp_pseudoheader(wdh, pseudo_header, err)) return FALSE; - wdh->bytes_dumped += sizeof ppp_hdr; break; } return TRUE; |