|
47 | 47 | #include <iostream> |
48 | 48 | #include <sys/types.h> |
49 | 49 |
|
50 | | -#ifdef WITH_PCAP |
51 | | -#include <pcap/sll.h> |
52 | | -#endif /* WITH_PCAP */ |
53 | | - |
54 | 50 | #include "parser.hpp" |
55 | 51 | #include "headers.hpp" |
56 | 52 | #include <ipfixprobe/packet.hpp> |
@@ -178,6 +174,39 @@ inline uint16_t parse_sll(const u_char *data_ptr, uint16_t data_len, Packet *pkt |
178 | 174 | pkt->ethertype = ntohs(sll->sll_protocol); |
179 | 175 | return sizeof(struct sll_header); |
180 | 176 | } |
| 177 | + |
| 178 | +# ifdef DLT_LINUX_SLL2 |
| 179 | +inline uint16_t parse_sll2(const u_char *data_ptr, uint16_t data_len, Packet *pkt) |
| 180 | +{ |
| 181 | + struct sll2_header *sll = (struct sll2_header *) data_ptr; |
| 182 | + if (sizeof(struct sll2_header) > data_len) { |
| 183 | + throw "Parser detected malformed packet"; |
| 184 | + } |
| 185 | + |
| 186 | + DEBUG_MSG("SLL2 header:\n"); |
| 187 | + DEBUG_MSG("\tPacket type:\t%u\n", ntohs(sll->sll2_pkttype)); |
| 188 | + DEBUG_MSG("\tHA type:\t%u\n", ntohs(sll->sll2_hatype)); |
| 189 | + DEBUG_MSG("\tHA len:\t\t%u\n", ntohs(sll->sll2_halen)); |
| 190 | + DEBUG_MSG("\tinterface index:\t\t%u\n", ntohl(sll->sll2_if_index)); |
| 191 | + DEBUG_CODE( |
| 192 | + DEBUG_MSG("\tAddress:\t"); |
| 193 | + for (int i = 0; i < SLL_ADDRLEN; i++) { |
| 194 | + DEBUG_MSG("%02x ", sll->sll2_addr[i]); |
| 195 | + } |
| 196 | + DEBUG_MSG("\n"); |
| 197 | + ); |
| 198 | + DEBUG_MSG("\tProtocol:\t%u\n", ntohs(sll->sll2_protocol)); |
| 199 | + |
| 200 | + if (ntohs(sll->sll2_hatype) == ARPHRD_ETHER) { |
| 201 | + memcpy(pkt->src_mac, sll->sll2_addr, 6); |
| 202 | + } else { |
| 203 | + memset(pkt->src_mac, 0, sizeof(pkt->src_mac)); |
| 204 | + } |
| 205 | + memset(pkt->dst_mac, 0, sizeof(pkt->dst_mac)); |
| 206 | + pkt->ethertype = ntohs(sll->sll2_protocol); |
| 207 | + return sizeof(struct sll2_header); |
| 208 | +} |
| 209 | +# endif /* DLT_LINUX_SLL2 */ |
181 | 210 | #endif /* WITH_PCAP */ |
182 | 211 |
|
183 | 212 |
|
@@ -619,6 +648,10 @@ void parse_packet(parser_opt_t *opt, struct timeval ts, const uint8_t *data, uin |
619 | 648 | data_offset = parse_eth_hdr(data, caplen, pkt); |
620 | 649 | } else if (opt->datalink == DLT_LINUX_SLL) { |
621 | 650 | data_offset = parse_sll(data, caplen, pkt); |
| 651 | + # ifdef DLT_LINUX_SLL2 |
| 652 | + } else if (opt->datalink == DLT_LINUX_SLL2) { |
| 653 | + data_offset = parse_sll2(data, caplen, pkt); |
| 654 | + # endif /* DLT_LINUX_SLL2 */ |
622 | 655 | } else if (opt->datalink == DLT_RAW) { |
623 | 656 | if ((data[0] & 0xF0) == 0x40) { |
624 | 657 | pkt->ethertype = ETH_P_IP; |
|
0 commit comments