summaryrefslogtreecommitdiffstats
path: root/src/common/Network/Packet/IPv6Header.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/common/Network/Packet/IPv6Header.h')
-rwxr-xr-xsrc/common/Network/Packet/IPv6Header.h301
1 files changed, 230 insertions, 71 deletions
diff --git a/src/common/Network/Packet/IPv6Header.h b/src/common/Network/Packet/IPv6Header.h
index 8a246359..05653bdd 100755
--- a/src/common/Network/Packet/IPv6Header.h
+++ b/src/common/Network/Packet/IPv6Header.h
@@ -1,5 +1,5 @@
/*
-Copyright (c) 2015-2015 Cisco Systems, Inc.
+Copyright (c) 2015-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.
@@ -22,14 +22,25 @@ limitations under the License.
#define IPV6_16b_ADDR_GROUPS 8
#define IPV6_16b_ADDR_GROUPS_MSB 6
#define IPV6_HDR_LEN 40
-static uint16_t default_ipv6[8] = { 0xDEAD, 0xBEEF,
- 0xDEAD, 0xBEEF,
- 0xDEAD, 0xBEEF,
- 0xDEAD, 0xBEEF };
-
+static uint16_t default_ipv6[8] = { 0xDEAD, 0xBEEF, 0xDEAD, 0xBEEF,
+ 0xDEAD, 0xBEEF, 0xDEAD, 0xBEEF };
class IPv6Header
{
+/*
+ * IPV6 extension headers
+ */
+ enum ext_headers_e {
+ IPPROTO_HOPOPTS = 0, /* IPv6 hop-by-hop options */
+ IPPROTO_ROUTING = 43, /* IPv6 routing header */
+ IPPROTO_FRAGMENT = 44, /* IPv6 fragmentation header */
+ IPPROTO_ENCAP_SEC = 50, /* IPv6 encapsulation security paylod header */
+ IPPROTO_AUTH = 51, /* IPv6 authentication header */
+ IPPROTO_ICMPV6 = 58, /* ICMPv6 */
+ IPPROTO_NONE = 59, /* IPv6 no next header */
+ IPPROTO_DSTOPTS = 60, /* IPv6 destination options */
+ IPPROTO_MH = 135, /* IPv6 mobility header */
+ };
public:
IPv6Header()
@@ -38,10 +49,8 @@ public:
setSourceIpv6(default_ipv6);
setTrafficClass(0xDD);
};
-
- IPv6Header (uint16_t *argSource,
- uint16_t *argDestinaction,
- uint8_t argTrafficClass)
+
+ IPv6Header (uint16_t *argSource, uint16_t *argDestinaction, uint8_t argTrafficClass)
{
setDestIpv6(argDestinaction);
setSourceIpv6(argSource);
@@ -53,69 +62,51 @@ public:
DefaultSize = 40
};
-
-public:
-
- inline uint8_t getVersion ();
- inline void setVersion (uint8_t);
-
- inline uint8_t getHeaderLength (){return (IPV6_HDR_LEN);}
-
- inline uint16_t getTrafficClass ();
- inline void setTrafficClass (uint16_t);
-
- inline uint32_t getFlowLabel ();
- inline void setFlowLabel (uint32_t);
-
- inline uint16_t getPayloadLen ();
- inline void setPayloadLen (uint16_t);
-
- inline uint8_t getNextHdr ();
- inline void setNextHdr (uint8_t);
-
- inline uint8_t getHopLimit ();
- inline void setHopLimit (uint8_t);
-
- inline void getSourceIpv6 (uint16_t *);
- inline void setSourceIpv6 (uint16_t *);
-
- inline void getDestIpv6 (uint16_t *);
- inline void setDestIpv6 (uint16_t *);
-
public:
-
- inline void updateTrafficClass(uint8_t newclass);
- inline void updatePayloadLength(uint16_t newlen);
- inline void updateIpv6Src(uint16_t *ipsrc);
- inline void updateIpv6Dst(uint16_t *ipdst);
- inline void updateMSBIpv6Src(uint16_t *ipsrc);
- inline void updateMSBIpv6Dst(uint16_t *ipdst);
- inline void updateLSBIpv6Src(uint32_t ipsrc);
- inline void updateLSBIpv6Dst(uint32_t ipdst);
-
- inline void swapSrcDest();
+ inline uint8_t getVersion();
+ inline void setVersion(uint8_t);
+ inline uint8_t getHeaderLength() {return IPV6_HDR_LEN;}
+ inline uint16_t getTrafficClass();
+ inline void setTrafficClass(uint16_t);
+ inline uint32_t getFlowLabel();
+ inline void setFlowLabel(uint32_t);
+ inline uint16_t getPayloadLen();
+ inline void setPayloadLen(uint16_t);
+ inline uint8_t getNextHdr();
+ inline void setNextHdr(uint8_t);
+ inline uint8_t getHopLimit();
+ inline void setHopLimit(uint8_t);
+ inline void getSourceIpv6(uint16_t *);
+ inline void setSourceIpv6(uint16_t *);
+ inline void getDestIpv6(uint16_t *);
+ inline void setDestIpv6(uint16_t *);
+ uint8_t getl4Proto(uint8_t *pkt, uint16_t pkt_len, uint8_t *&p_l4);
+ inline void updateTrafficClass(uint8_t newclass);
+ inline void updatePayloadLength(uint16_t newlen);
+ inline void updateIpv6Src(uint16_t *ipsrc);
+ inline void updateIpv6Dst(uint16_t *ipdst);
+ inline void updateMSBIpv6Src(uint16_t *ipsrc);
+ inline void updateMSBIpv6Dst(uint16_t *ipdst);
+ inline void updateLSBIpv6Src(uint32_t ipsrc);
+ inline void updateLSBIpv6Dst(uint32_t ipdst);
+ inline void swapSrcDest();
////////////////////////////////////////////////////////////////////////////////////////
// Common Header Interface
////////////////////////////////////////////////////////////////////////////////////////
-public:
+public:
inline uint8_t* getPointer (){return (uint8_t*)this;}
inline uint32_t getSize (){return getHeaderLength();}
- void dump (FILE* fd);
-
-
public:
- uint32_t myVer_TrafficClass_FlowLabel;
-
- uint16_t myPayloadLen;
- uint8_t myNextHdr;
- uint8_t myHopLimit;
-
- uint16_t mySource[IPV6_16b_ADDR_GROUPS];
- uint16_t myDestination[IPV6_16b_ADDR_GROUPS];
- uint32_t myOption[1];
+ uint32_t myVer_TrafficClass_FlowLabel;
+ uint16_t myPayloadLen;
+ uint8_t myNextHdr;
+ uint8_t myHopLimit;
+ uint16_t mySource[IPV6_16b_ADDR_GROUPS];
+ uint16_t myDestination[IPV6_16b_ADDR_GROUPS];
+ uint32_t myOption[1];
};
@@ -124,19 +115,187 @@ class IPv6PseudoHeader
public:
uint32_t m_source_ip;
uint32_t m_dest_ip;
- uint8_t m_zero;
- uint8_t m_protocol;
- uint16_t m_length;
+ uint8_t m_zero;
+ uint8_t m_protocol;
+ uint16_t m_length;
+
public:
inline uint8_t* getPointer(){return (uint8_t*)this;}
+ inline uint32_t getSize();
+ inline uint16_t inetChecksum();
+};
- inline uint32_t getSize();
- inline uint16_t inetChecksum();
-};
+/////////////////////////////////////////////
+// inline functions implementation
+/////////////////////////////////////////////
+
+#include <common/BigEndianBitManipulation.h>
+
+//--------------------------------
+inline uint8_t IPv6Header::getVersion()
+{
+ return getMaskBit32(PKT_NTOHL(myVer_TrafficClass_FlowLabel), 0, 3);
+}
+
+inline void IPv6Header::setVersion(uint8_t argVersion)
+{
+ uint32_t myVer = PKT_HTONL(myVer_TrafficClass_FlowLabel);
+ setMaskBit32(myVer, 0, 3, argVersion);
+ myVer_TrafficClass_FlowLabel = PKT_NTOHL(myVer);
+}
+//--------------------------------
+inline uint16_t IPv6Header::getTrafficClass()
+{
+ return getMaskBit32(PKT_NTOHL(myVer_TrafficClass_FlowLabel), 4, 11);
+}
+
+inline void
+IPv6Header::setTrafficClass(uint16_t argTrafficClass)
+{
+ uint32_t myTrafficClass = PKT_HTONL(myVer_TrafficClass_FlowLabel);
+ setMaskBit32(myTrafficClass, 4, 11, argTrafficClass);
+ myVer_TrafficClass_FlowLabel = PKT_NTOHL(myTrafficClass);
+}
-#include "IPv6Header.inl"
+//--------------------------------
+inline uint32_t IPv6Header::getFlowLabel()
+{
+ return getMaskBit32(PKT_NTOHL(myVer_TrafficClass_FlowLabel), 12, 31);
+}
-#endif
+inline void IPv6Header::setFlowLabel(uint32_t argFlowLabel)
+{
+ uint32_t myFlowLabel = PKT_HTONL(myVer_TrafficClass_FlowLabel);
+ setMaskBit32(myFlowLabel, 12, 31, argFlowLabel);
+ myVer_TrafficClass_FlowLabel = PKT_NTOHL(myFlowLabel);
+}
+
+//--------------------------------
+inline uint16_t IPv6Header::getPayloadLen()
+{
+ return PKT_NTOHS(myPayloadLen);
+}
+inline void IPv6Header::setPayloadLen(uint16_t argPayloadLen)
+{
+ myPayloadLen = PKT_HTONS(argPayloadLen);
+}
+
+//--------------------------------
+inline uint8_t IPv6Header::getNextHdr()
+{
+ return myNextHdr;
+}
+
+inline void IPv6Header::setNextHdr(uint8_t argNextHdr)
+{
+ myNextHdr = argNextHdr;
+}
+
+//--------------------------------
+inline uint8_t IPv6Header::getHopLimit()
+{
+ return myHopLimit;
+}
+
+inline void IPv6Header::setHopLimit(uint8_t argHopLimit)
+{
+ myHopLimit = argHopLimit;
+}
+
+//--------------------------------
+inline void IPv6Header::getSourceIpv6(uint16_t *argSourceAddress)
+{
+ uint8_t i;
+ for (i = 0; i < IPV6_16b_ADDR_GROUPS; i++) {
+ argSourceAddress[i] = PKT_NTOHS(mySource[i]);
+ }
+}
+
+inline void IPv6Header::setSourceIpv6(uint16_t *argSourceAddress)
+{
+ uint8_t i;
+ for (i = 0; i < IPV6_16b_ADDR_GROUPS; i++) {
+ mySource[i] = PKT_HTONS(argSourceAddress[i]);
+ }
+}
+
+//--------------------------------
+inline void IPv6Header::getDestIpv6(uint16_t *argDestAddress)
+{
+ uint8_t i;
+ for (i=0; i<IPV6_16b_ADDR_GROUPS; i++) {
+ argDestAddress[i] = PKT_NTOHS(myDestination[i]);
+ }
+}
+
+inline void IPv6Header::setDestIpv6(uint16_t *argDestAddress)
+{
+ uint8_t i;
+ for (i = 0; i < IPV6_16b_ADDR_GROUPS; i++) {
+ myDestination[i] = PKT_HTONS(argDestAddress[i]);
+ }
+}
+
+//--------------------------------
+inline void IPv6Header::updateIpv6Src(uint16_t *ipsrc)
+{
+ uint8_t i;
+ for (i = 0; i < IPV6_16b_ADDR_GROUPS; i++) {
+ mySource[i] = PKT_HTONS(ipsrc[i]);
+ }
+}
+
+inline void IPv6Header::updateIpv6Dst(uint16_t *ipdst)
+{
+ uint8_t i;
+ for (i = 0; i < IPV6_16b_ADDR_GROUPS; i++) {
+ myDestination[i] = PKT_HTONS(ipdst[i]);
+ }
+}
+
+//--------------------------------
+inline void IPv6Header::updateMSBIpv6Src(uint16_t *ipsrc)
+{
+ uint8_t i;
+ for (i=0; i<IPV6_16b_ADDR_GROUPS_MSB; i++) {
+ mySource[i] = PKT_HTONS(ipsrc[i]);
+ }
+}
+
+inline void IPv6Header::updateMSBIpv6Dst(uint16_t *ipdst)
+{
+ uint8_t i;
+ for (i = 0; i < IPV6_16b_ADDR_GROUPS_MSB; i++) {
+ myDestination[i] = PKT_HTONS(ipdst[i]);
+ }
+}
+
+//--------------------------------
+inline void IPv6Header::updateLSBIpv6Src(uint32_t ipsrc)
+{
+ uint32_t *lsb = (uint32_t *)&mySource[6];
+ *lsb = PKT_HTONL(ipsrc);
+}
+
+inline void IPv6Header::updateLSBIpv6Dst(uint32_t ipdst)
+{
+ uint32_t *lsb = (uint32_t *)&myDestination[6];
+ *lsb = PKT_HTONL(ipdst);
+}
+
+//--------------------------------
+inline void IPv6Header::swapSrcDest()
+{
+ uint8_t i;
+ uint16_t tmp[IPV6_16b_ADDR_GROUPS];
+ for (i = 0; i < IPV6_16b_ADDR_GROUPS; i++) {
+ tmp[i] = myDestination[i];
+ myDestination[i] = mySource[i];
+ mySource[i] = tmp[i];
+ }
+}
+
+#endif