diff options
| author | luwenpeng <[email protected]> | 2024-05-30 18:45:39 +0800 |
|---|---|---|
| committer | luwenpeng <[email protected]> | 2024-05-30 18:45:47 +0800 |
| commit | 2d958dbe077db36befbbc8f93d64f4ca6259a319 (patch) | |
| tree | d0c081d2b74fb1cd1c36fd563f3aea1de592838e | |
| parent | 1a7f74025bb8462bc9cc18a2da095e1c8f66c012 (diff) | |
bugfix: calculate L2TPv2 offset
| -rw-r--r-- | src/packet/packet.cpp | 16 | ||||
| -rw-r--r-- | test/packet_parser/cmp_layers.sh | 2 | ||||
| -rw-r--r-- | test/packet_parser/packet_parser.cpp | 43 |
3 files changed, 32 insertions, 29 deletions
diff --git a/src/packet/packet.cpp b/src/packet/packet.cpp index ccadc9b..5954e7e 100644 --- a/src/packet/packet.cpp +++ b/src/packet/packet.cpp @@ -728,7 +728,21 @@ static inline uint16_t get_l2tpv2_hdr_len(const char *data, uint16_t len) { return 0; } - return ntohs(*((uint16_t *)(data + skip_len))); + uint16_t offset = ntohs(*((uint16_t *)(data + skip_len))); + if (offset == 0) + { + return skip_len + 2; + } + + // invalid offset + if (offset > len) + { + return 0; + } + else + { + return offset; + } } else { diff --git a/test/packet_parser/cmp_layers.sh b/test/packet_parser/cmp_layers.sh index 791c203..fd886de 100644 --- a/test/packet_parser/cmp_layers.sh +++ b/test/packet_parser/cmp_layers.sh @@ -15,7 +15,7 @@ fi # remove l7 protocol fields function replace() { file=$1 - array=(":data" ":ntp" ":rip" ":isakmp" ":esp" ":udpencap" ":sip" ":sdp" ":rtcp" ":rtp" ":ssh" ":dns" ":ssl" ":gquic" ":http-text-lines" ":http" ":msmms" ":bfd" ":ftp-data-text-lines" ":ftp" ":ssdp" ":mdns" ":radius" ":pop" ":smtp" ":rtmpt" ":bittorrent" ":oicq" ":json" ":media" ":x11" ":telnet" ":nbss:smb" ":memcache" ":rtspi" ":rdt" ":rtsp" ":nbns" ":nbdgm:smb:browser" ":lcp" ":chap" ":ipcp" ":comp_data" ":ccp" ":snmp" ":socks" ":bgp" ":eigrp" ":bootp" ":xml" ":echo" ":vssmonitoring" ":mndp" ":websocket-text-lines" ":websocket" ":image-jfif" ":png" ":pkix1implicit" ":x509sat" ":x509ce" ":pkix1explicit" ":llmnr") + array=(":data" ":ntp" ":rip" ":isakmp" ":esp" ":udpencap" ":sip" ":sdp" ":rtcp" ":rtp" ":ssh" ":dns" ":ssl" ":gquic" ":http-text-lines" ":http" ":msmms" ":bfd" ":ftp-data-text-lines" ":ftp" ":ssdp" ":mdns" ":radius" ":pop" ":smtp" ":rtmpt" ":bittorrent" ":oicq" ":json" ":media" ":x11" ":telnet" ":nbss:smb" ":memcache" ":rtspi" ":rdt" ":rtsp" ":nbns" ":nbdgm:smb:browser" ":lcp" ":chap" ":ipcp" ":comp_data" ":ccp" ":snmp" ":socks" ":bgp" ":eigrp" ":bootp" ":xml" ":echo" ":vssmonitoring" ":mndp" ":websocket-text-lines" ":websocket" ":image-jfif" ":png" ":pkix1implicit" ":x509sat" ":x509ce" ":pkix1explicit" ":llmnr" ":pkcs-1") for key in "${array[@]}"; do sed "s/$key//g" ${file} >.tmp.txt mv .tmp.txt ${file} diff --git a/test/packet_parser/packet_parser.cpp b/test/packet_parser/packet_parser.cpp index 2d00575..1f5de4f 100644 --- a/test/packet_parser/packet_parser.cpp +++ b/test/packet_parser/packet_parser.cpp @@ -15,34 +15,23 @@ static uint64_t number = 0; static int ipv6_proto_to_str(const struct packet_layer *ipv6_layer, char *buff, int size) { int used = snprintf(buff, size, "ipv6"); - uint16_t skip_len = sizeof(struct ip6_hdr); uint8_t next_hdr = ipv6_hdr_get_next_header((const struct ip6_hdr *)ipv6_layer->hdr_ptr); - while (skip_len < ipv6_layer->hdr_len) + switch (next_hdr) { - if (next_hdr == IPPROTO_HOPOPTS) - { - used += snprintf(buff + used, size - used, ":ipv6.hopopt"); - } - else if (next_hdr == IPPROTO_ROUTING) - { - used += snprintf(buff + used, size - used, ":ipv6.routing"); - } - else if (next_hdr == IPPROTO_AH) - { - used += snprintf(buff + used, size - used, ":ipv6.ah"); - } - else if (next_hdr == IPPROTO_DSTOPTS) - { - used += snprintf(buff + used, size - used, ":ipv6.dstopts"); - } - else - { - break; - } - - struct ip6_ext *ext = (struct ip6_ext *)ipv6_layer->hdr_ptr + skip_len; - skip_len += ext->ip6e_len * 8 + 8; - next_hdr = ext->ip6e_nxt; + case IPPROTO_HOPOPTS: + used += snprintf(buff + used, size - used, ":ipv6.hopopt"); + break; + case IPPROTO_ROUTING: + used += snprintf(buff + used, size - used, ":ipv6.routing"); + break; + case IPPROTO_AH: + used += snprintf(buff + used, size - used, ":ipv6.ah"); + break; + case IPPROTO_DSTOPTS: + used += snprintf(buff + used, size - used, ":ipv6.dstopts"); + break; + default: + break; } return used; @@ -73,7 +62,7 @@ static int packet_proto_to_str(const struct packet *pkt, char *buff, int size) used += snprintf(buff + used, size - used, "vlan:ethertype"); break; case LAYER_TYPE_PPPOE: - used += snprintf(buff + used, size - used, "pppoe"); + used += snprintf(buff + used, size - used, "pppoes:ppp"); break; case LAYER_TYPE_MPLS: used += snprintf(buff + used, size - used, "mpls"); |
