diff options
author | 2016-10-05 10:30:34 +0300 | |
---|---|---|
committer | 2016-10-05 10:30:34 +0300 | |
commit | 15499f72d642b4ed99f4f71d50d04cf70953aeac (patch) | |
tree | 1ad6eb98231db1b7d6408a455197a660803c5594 /src/common/Network/Packet/IPv6Header.cpp | |
parent | 432946c5c42e1138bcc2b3ba8731348301d9dc65 (diff) |
Implementation of Ipv6Header::getl4Proto + cleanup in Ipv6 files
Diffstat (limited to 'src/common/Network/Packet/IPv6Header.cpp')
-rwxr-xr-x | src/common/Network/Packet/IPv6Header.cpp | 89 |
1 files changed, 36 insertions, 53 deletions
diff --git a/src/common/Network/Packet/IPv6Header.cpp b/src/common/Network/Packet/IPv6Header.cpp index cf1f632a..3856120f 100755 --- a/src/common/Network/Packet/IPv6Header.cpp +++ b/src/common/Network/Packet/IPv6Header.cpp @@ -1,5 +1,5 @@ /* -Copyright (c) 2015-2015 Cisco Systems, Inc. +Copyright (c) 2016-2016 Cisco Systems, Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -16,56 +16,39 @@ limitations under the License. #include "IPv6Header.h" - -char * IPv6Header::Protocol::interpretIpProtocolName(uint8_t argType) -{ - switch (argType) - { - case TCP: - return (char *)"TCP"; - break; - case UDP: - return (char *)"UDP"; - break; - case IP: - return (char *)"IP"; - break; - case ICMP: - return (char *)"ICMP"; - break; - case ESP: - return (char *)"ESP"; - break; - case AH: - return (char *)"AH"; - break; - case IGMP: - return (char *)"IGMP"; - break; - default: - return (char *)NULL; - break; - } -} - -void IPv6Header::dump(FILE *fd) -{ - fprintf(fd, "\nIPv6Header"); - fprintf(fd, "\nSource 0x%.8lX, Destination 0x%.8lX, Protocol 0x%.1X", - getSourceIp(), getDestIp(), getProtocol()); - fprintf(fd, "\nTTL : %d, Id : 0x%.2X, Ver %d, Header Length %d, Total Length %d", - getTimeToLive(), getId(), getVersion(), getHeaderLength(), getTotalLength()); - if(isFragmented()) - { - fprintf(fd,"\nIsFirst %d, IsMiddle %d, IsLast %d, Offset %d", - isFirstFragment(), isMiddleFragment(), isLastFragment(), getFragmentOffset()); - } - else - { - fprintf(fd, "\nDont fragment %d", isDontFragment()); - } - fprintf(fd, "\n"); +/* + * Return l4 type of Ipv6 packet + * pkt - pointer to start of packet data (including header) + * pkt_len - length of packet (including header) + * p_l4 - return pointer to start of l4 header + */ +uint8_t IPv6Header::getl4Proto(uint8_t *pkt, uint16_t pkt_len, uint8_t *&p_l4) { + bool stop = false; + uint8_t *next_header = pkt + IPV6_HDR_LEN;; + uint8_t next_header_type = myNextHdr; + uint16_t len_left = pkt_len - IPV6_HDR_LEN; + uint16_t curr_header_len; + + do { + switch(next_header_type) { + case IPPROTO_HOPOPTS: + case IPPROTO_ROUTING: + case IPPROTO_ENCAP_SEC: + case IPPROTO_AUTH: + case IPPROTO_FRAGMENT: + case IPPROTO_DSTOPTS: + case IPPROTO_MH: + next_header_type = next_header[0]; + curr_header_len = (next_header[1] + 1) * 8; + next_header += curr_header_len; + len_left -= curr_header_len; + break; + default: + stop = true; + break; + } + } while ((! stop) && len_left >= 2); + + p_l4 = next_header; + return next_header_type; } - - - |