Signed-off-by: Sven Eckelmann sven@narfation.org --- packet.h | 43 +++++++++++++++++++++++++++++++++++-------- tcpdump.c | 31 +++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+), 8 deletions(-)
diff --git a/packet.h b/packet.h index 2d23a14..aa3e63a 100644 --- a/packet.h +++ b/packet.h @@ -23,14 +23,29 @@ #define BATADV_ETH_P_BATMAN 0x4305 /* unofficial/not registered Ethertype */
enum batadv_packettype { - BATADV_IV_OGM = 0x01, - BATADV_ICMP = 0x02, - BATADV_UNICAST = 0x03, - BATADV_BCAST = 0x04, - BATADV_VIS = 0x05, - BATADV_UNICAST_FRAG = 0x06, - BATADV_TT_QUERY = 0x07, - BATADV_ROAM_ADV = 0x08, + BATADV_IV_OGM = 0x01, + BATADV_ICMP = 0x02, + BATADV_UNICAST = 0x03, + BATADV_BCAST = 0x04, + BATADV_VIS = 0x05, + BATADV_UNICAST_FRAG = 0x06, + BATADV_TT_QUERY = 0x07, + BATADV_ROAM_ADV = 0x08, + BATADV_UNICAST_4ADDR = 0x09, +}; + +/** + * enum batadv_subtype - packet subtype for unicast4addr + * @BATADV_P_DATA: user payload + * @BATADV_P_DAT_DHT_GET: DHT request message + * @BATADV_P_DAT_DHT_PUT: DHT store message + * @BATADV_P_DAT_CACHE_REPLY: ARP reply generated by DAT + */ +enum batadv_subtype { + BATADV_P_DATA = 0x01, + BATADV_P_DAT_DHT_GET = 0x02, + BATADV_P_DAT_DHT_PUT = 0x03, + BATADV_P_DAT_CACHE_REPLY = 0x04, };
/* this file is included by batctl which needs these defines */ @@ -161,6 +176,18 @@ struct batadv_unicast_packet { uint8_t dest[ETH_ALEN]; } __packed;
+/** + * struct batadv_unicast_4addr_packet - extended unicast packet + * @u: common unicast packet header + * @src: address of the source + * @subtype: packet subtype + */ +struct batadv_unicast_4addr_packet { + struct batadv_unicast_packet u; + uint8_t src[ETH_ALEN]; + uint8_t subtype; +} __packed; + struct batadv_unicast_frag_packet { struct batadv_header header; uint8_t ttvn; /* destination translation table version number */ diff --git a/tcpdump.c b/tcpdump.c index 1a4a9a0..84abd74 100644 --- a/tcpdump.c +++ b/tcpdump.c @@ -539,6 +539,33 @@ static void dump_batman_frag(unsigned char *packet_buff, ssize_t buff_len, int r printf("length %zu\n", (size_t)buff_len - ETH_HLEN - sizeof(struct batadv_unicast_frag_packet)); }
+static void dump_batman_4addr(unsigned char *packet_buff, ssize_t buff_len, int read_opt, int time_printed) +{ + struct ether_header *ether_header; + struct batadv_unicast_packet *unicast_4addr_packet; + + LEN_CHECK((size_t)buff_len - sizeof(struct ether_header), sizeof(struct batadv_unicast_packet), "BAT 4ADDR"); + LEN_CHECK((size_t)buff_len - sizeof(struct ether_header) - sizeof(struct batadv_unicast_packet), + sizeof(struct ether_header), "BAT 4ADDR (unpacked)"); + + ether_header = (struct ether_header *)packet_buff; + unicast_4addr_packet = (struct batadv_unicast_packet *)(packet_buff + sizeof(struct ether_header)); + + if (!time_printed) + time_printed = print_time(); + + printf("BAT %s > ", + get_name_by_macaddr((struct ether_addr *)ether_header->ether_shost, read_opt)); + + printf("%s: 4ADDR, ttvn %d, ttl %hhu, ", + get_name_by_macaddr((struct ether_addr *)unicast_4addr_packet->dest, read_opt), + unicast_4addr_packet->ttvn, unicast_4addr_packet->header.ttl); + + parse_eth_hdr(packet_buff + ETH_HLEN + sizeof(struct batadv_unicast_packet), + buff_len - ETH_HLEN - sizeof(struct batadv_unicast_packet), + read_opt, time_printed); +} + static void parse_eth_hdr(unsigned char *packet_buff, ssize_t buff_len, int read_opt, int time_printed) { struct batadv_ogm_packet *batman_ogm_packet; @@ -600,6 +627,10 @@ static void parse_eth_hdr(unsigned char *packet_buff, ssize_t buff_len, int read if (dump_level & DUMP_TYPE_BATTT) dump_batman_roam(packet_buff, buff_len, read_opt, time_printed); break; + case BATADV_UNICAST_4ADDR: + if (dump_level & DUMP_TYPE_BATUCAST) + dump_batman_4addr(packet_buff, buff_len, read_opt, time_printed); + break; default: fprintf(stderr, "Warning - packet contains unknown batman packet type: 0x%02x\n", batman_ogm_packet->header.packet_type); break;