diff options
| -rw-r--r-- | prog/checksum.go | 77 | ||||
| -rw-r--r-- | prog/checksum_test.go | 18 | ||||
| -rw-r--r-- | sys/socket.txt | 24 | ||||
| -rw-r--r-- | sys/test.txt | 12 | ||||
| -rw-r--r-- | sys/vnet.txt | 125 | ||||
| -rw-r--r-- | sys/vnet_amd64.const | 30 | ||||
| -rw-r--r-- | sys/vnet_arm64.const | 30 | ||||
| -rw-r--r-- | sys/vnet_ppc64le.const | 30 |
8 files changed, 317 insertions, 29 deletions
diff --git a/prog/checksum.go b/prog/checksum.go index 9df541dc1..94df4630a 100644 --- a/prog/checksum.go +++ b/prog/checksum.go @@ -147,7 +147,7 @@ func calcChecksumIPv4(arg *Arg, pid int) (*Arg, *Arg) { return csumField, &newCsumField } -func extractHeaderParamsIPv4(arg *Arg) (*Arg, *Arg, *Arg) { +func extractHeaderParamsIPv4(arg *Arg) (*Arg, *Arg) { srcAddr := getFieldByName(arg, "src_ip") if srcAddr.Size() != 4 { panic(fmt.Sprintf("src_ip field in %v must be 4 bytes", arg.Type.Name())) @@ -156,14 +156,44 @@ func extractHeaderParamsIPv4(arg *Arg) (*Arg, *Arg, *Arg) { if dstAddr.Size() != 4 { panic(fmt.Sprintf("dst_ip field in %v must be 4 bytes", arg.Type.Name())) } - protocol := getFieldByName(arg, "protocol") - if protocol.Size() != 1 { - panic(fmt.Sprintf("protocol field in %v must be 1 byte", arg.Type.Name())) + return srcAddr, dstAddr +} + +func extractHeaderParamsIPv6(arg *Arg) (*Arg, *Arg) { + srcAddr := getFieldByName(arg, "src_ip") + if srcAddr.Size() != 16 { + panic(fmt.Sprintf("src_ip field in %v must be 4 bytes", arg.Type.Name())) + } + dstAddr := getFieldByName(arg, "dst_ip") + if dstAddr.Size() != 16 { + panic(fmt.Sprintf("dst_ip field in %v must be 4 bytes", arg.Type.Name())) } - return srcAddr, dstAddr, protocol + return srcAddr, dstAddr +} + +func composeTCPPseudoHeaderIPv4(tcpPacket, srcAddr, dstAddr *Arg, pid int) []byte { + header := []byte{} + header = append(header, encodeArg(srcAddr, pid)...) + header = append(header, encodeArg(dstAddr, pid)...) + header = append(header, []byte{0, 6}...) // IPPROTO_TCP == 6 + length := []byte{0, 0} + binary.BigEndian.PutUint16(length, uint16(tcpPacket.Size())) + header = append(header, length...) + return header +} + +func composeTCPPseudoHeaderIPv6(tcpPacket, srcAddr, dstAddr *Arg, pid int) []byte { + header := []byte{} + header = append(header, encodeArg(srcAddr, pid)...) + header = append(header, encodeArg(dstAddr, pid)...) + length := []byte{0, 0, 0, 0} + binary.BigEndian.PutUint32(length, uint32(tcpPacket.Size())) + header = append(header, length...) + header = append(header, []byte{0, 0, 0, 6}...) // IPPROTO_TCP == 6 + return header } -func calcChecksumTCP(tcpPacket, srcAddr, dstAddr, protocol *Arg, pid int) (*Arg, *Arg) { +func calcChecksumTCP(tcpPacket *Arg, pseudoHeader []byte, pid int) (*Arg, *Arg) { tcpHeaderField := getFieldByName(tcpPacket, "header") csumField := getFieldByName(tcpHeaderField, "csum") if typ, ok := csumField.Type.(*sys.CsumType); !ok { @@ -173,12 +203,7 @@ func calcChecksumTCP(tcpPacket, srcAddr, dstAddr, protocol *Arg, pid int) (*Arg, } var csum IPChecksum - csum.Update(encodeArg(srcAddr, pid)) - csum.Update(encodeArg(dstAddr, pid)) - csum.Update([]byte{0, byte(protocol.Value(pid))}) - length := []byte{0, 0} - binary.BigEndian.PutUint16(length, uint16(tcpPacket.Size())) - csum.Update(length) + csum.Update(pseudoHeader) csum.Update(encodeArg(tcpPacket, pid)) newCsumField := *csumField @@ -189,9 +214,9 @@ func calcChecksumTCP(tcpPacket, srcAddr, dstAddr, protocol *Arg, pid int) (*Arg, func calcChecksumsCall(c *Call, pid int) map[*Arg]*Arg { var csumMap map[*Arg]*Arg ipv4HeaderParsed := false - var ipv4SrcAddr *Arg - var ipv4DstAddr *Arg - var ipv4Protocol *Arg + ipv6HeaderParsed := false + var ipSrcAddr *Arg + var ipDstAddr *Arg foreachArgArray(&c.Args, nil, func(arg, base *Arg, _ *[]*Arg) { // syz_csum_ipv4_header struct is used in tests if arg.Type.Name() == "ipv4_header" || arg.Type.Name() == "syz_csum_ipv4_header" { @@ -200,15 +225,29 @@ func calcChecksumsCall(c *Call, pid int) map[*Arg]*Arg { } csumField, newCsumField := calcChecksumIPv4(arg, pid) csumMap[csumField] = newCsumField - ipv4SrcAddr, ipv4DstAddr, ipv4Protocol = extractHeaderParamsIPv4(arg) + ipSrcAddr, ipDstAddr = extractHeaderParamsIPv4(arg) ipv4HeaderParsed = true } + // syz_csum_ipv6_header struct is used in tests + if arg.Type.Name() == "ipv6_packet" || arg.Type.Name() == "syz_csum_ipv6_header" { + ipSrcAddr, ipDstAddr = extractHeaderParamsIPv6(arg) + ipv6HeaderParsed = true + } // syz_csum_tcp_packet struct is used in tests if arg.Type.Name() == "tcp_packet" || arg.Type.Name() == "syz_csum_tcp_packet" { - if !ipv4HeaderParsed { - panic("tcp_packet is being parsed before ipv4_header") + if csumMap == nil { + csumMap = make(map[*Arg]*Arg) + } + if !ipv4HeaderParsed && !ipv6HeaderParsed { + panic("tcp packet is being parsed before ipv4 or ipv6 header") + } + var pseudoHeader []byte + if ipv4HeaderParsed { + pseudoHeader = composeTCPPseudoHeaderIPv4(arg, ipSrcAddr, ipDstAddr, pid) + } else { + pseudoHeader = composeTCPPseudoHeaderIPv6(arg, ipSrcAddr, ipDstAddr, pid) } - csumField, newCsumField := calcChecksumTCP(arg, ipv4SrcAddr, ipv4DstAddr, ipv4Protocol, pid) + csumField, newCsumField := calcChecksumTCP(arg, pseudoHeader, pid) csumMap[csumField] = newCsumField } }) diff --git a/prog/checksum_test.go b/prog/checksum_test.go index 822ccc7b7..7aa37a2ee 100644 --- a/prog/checksum_test.go +++ b/prog/checksum_test.go @@ -56,8 +56,12 @@ func TestChecksumIP(t *testing.T) { 0xe143, }, { - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\xab\xcd", - 0x542e, + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\xab\xcd", + 0x3250, + }, + { + "\x00\x11\x22\x33\x44\x55\x66\x77\x88\x99\xaa\xbb\xcc\xdd\xee\xff\xff\xee\xdd\xcc\xbb\xaa\x99\x88\x77\x66\x55\x44\x33\x22\x11\x00\x00\x00\x00\x04\x00\x00\x00\x06\x00\x00\xab\xcd", + 0x5428, }, } @@ -121,7 +125,7 @@ func TestChecksumIPv4Calc(t *testing.T) { csum uint16 }{ { - "syz_test$csum_ipv4(&(0x7f0000000000)={0x0, {0x42, 0x43, [0x44, 0x45], 0xa, 0xb, \"aabbccdd\"}, 0x0, 0x0, 0x0})", + "syz_test$csum_ipv4(&(0x7f0000000000)={0x0, {0x42, 0x43, [0x44, 0x45], 0xa, 0xb, \"aabbccdd\"}, 0x0, 0x0})", 0xe143, }, } @@ -145,8 +149,12 @@ func TestChecksumTCPCalc(t *testing.T) { csum uint16 }{ { - "syz_test$csum_ipv4_tcp(&(0x7f0000000000)={{0x0, {0x42, 0x43, [0x44, 0x45], 0xa, 0xb, \"aabbccdd\"}, 0x0, 0x0, 0x0}, {{0x0}, \"abcd\"}})", - 0x542e, + "syz_test$csum_ipv4_tcp(&(0x7f0000000000)={{0x0, {0x42, 0x43, [0x44, 0x45], 0xa, 0xb, \"aabbccdd\"}, 0x0, 0x0}, {{0x0}, \"abcd\"}})", + 0x5428, + }, + { + "syz_test$csum_ipv6_tcp(&(0x7f0000000000)={{\"00112233445566778899aabbccddeeff\", \"ffeeddccbbaa99887766554433221100\"}, {{0x0}, \"abcd\"}})", + 0x5428, }, } for i, test := range tests { diff --git a/sys/socket.txt b/sys/socket.txt index 9e86c4de7..de9f44564 100644 --- a/sys/socket.txt +++ b/sys/socket.txt @@ -216,6 +216,30 @@ tcp_pair { + +# AF_INET6: TCP support + +resource sock_tcp6[sock] + +socket$tcp6(domain const[AF_INET6], type const[SOCK_STREAM], proto const[0]) sock_tcp6 +socketpair$tcp6(domain const[AF_INET6], type const[SOCK_STREAM], proto const[0], fds ptr[out, tcp6_pair]) +accept$tcp6(fd sock_tcp6, peer ptr[out, sockaddr_in6, opt], peerlen ptr[inout, len[peer, int32]]) sock_tcp6 +accept4$tcp6(fd sock_tcp6, peer ptr[out, sockaddr_in6, opt], peerlen ptr[inout, len[peer, int32]], flags flags[accept_flags]) sock_tcp6 +bind$tcp6(fd sock_tcp6, addr ptr[in, sockaddr_in6], addrlen len[addr]) +connect$tcp6(fd sock_tcp6, addr ptr[in, sockaddr_in6], addrlen len[addr]) +sendto$tcp6(fd sock_tcp6, buf buffer[in], len len[buf], f flags[send_flags], addr ptr[in, sockaddr_in6, opt], addrlen len[addr]) +recvfrom$tcp6(fd sock_tcp6, buf buffer[out], len len[buf], f flags[recv_flags], addr ptr[in, sockaddr_in6, opt], addrlen len[addr]) +getsockname$tcp6(fd sock_tcp6, addr ptr[out, sockaddr_in6], addrlen ptr[inout, len[addr, int32]]) +getpeername$tcp6(fd sock_tcp6, peer ptr[out, sockaddr_in6], peerlen ptr[inout, len[peer, int32]]) + +tcp6_pair { + f0 sock_tcp6 + f1 sock_tcp6 +} + + + + # AF_UNIX support. resource sock_unix[sock] diff --git a/sys/test.txt b/sys/test.txt index 932ddac01..5d1d3266d 100644 --- a/sys/test.txt +++ b/sys/test.txt @@ -395,6 +395,7 @@ syz_test$bf1(a0 ptr[in, syz_bf_struct1]) syz_test$csum_encode(a0 ptr[in, syz_csum_encode]) syz_test$csum_ipv4(a0 ptr[in, syz_csum_ipv4_header]) syz_test$csum_ipv4_tcp(a0 ptr[in, syz_csum_ipv4_tcp_packet]) +syz_test$csum_ipv6_tcp(a0 ptr[in, syz_csum_ipv6_tcp_packet]) syz_csum_encode { f0 int16 @@ -408,7 +409,6 @@ syz_csum_encode { syz_csum_ipv4_header { csum csum[ipv4, int16] data syz_csum_encode - protocol int8 src_ip int32be dst_ip int32be } [packed] @@ -426,3 +426,13 @@ syz_csum_ipv4_tcp_packet { header syz_csum_ipv4_header payload syz_csum_tcp_packet } [packed] + +syz_csum_ipv6_header { + src_ip array[int8, 16] + dst_ip array[int8, 16] +} [packed] + +syz_csum_ipv6_tcp_packet { + header syz_csum_ipv6_header + payload syz_csum_tcp_packet +} [packed] diff --git a/sys/vnet.txt b/sys/vnet.txt index 5e9becc70..49582cae4 100644 --- a/sys/vnet.txt +++ b/sys/vnet.txt @@ -78,9 +78,10 @@ eth2_packet { payload eth2_payload } [packed] -eth2_payload { +eth2_payload [ ipv4 ipv4_packet -} [packed] + ipv6 ipv6_packet +] [varlen] ################################################################################ ##################################### IPv4 ##################################### @@ -242,8 +243,8 @@ ipv4_header { dscp int8:6 total_len len[ipv4_packet, int16be] id int16be - frag_off int16:13 - flags int16:3 + frag_off int16be +# TODO: frag_off is actually 13 bits, 3 bits are flags ttl int8 protocol flags[ipv4_types, int8] csum csum[ipv4, int16be] @@ -258,6 +259,122 @@ ipv4_packet { } [packed] ################################################################################ +##################################### IPv6 ##################################### +################################################################################ + +# https://tools.ietf.org/html/rfc2460#section-3 +# https://en.wikipedia.org/wiki/IPv6_packet#Fixed_header + +include <uapi/linux/in6.h> +include <uapi/linux/ipv6.h> +include <net/ipv6.h> + +ipv6_types = IPPROTO_IP, IPPROTO_ICMP, IPPROTO_IGMP, IPPROTO_IPIP, IPPROTO_TCP, IPPROTO_EGP, IPPROTO_PUP, IPPROTO_UDP, IPPROTO_IDP, IPPROTO_TP, IPPROTO_DCCP, IPPROTO_IPV6, IPPROTO_RSVP, IPPROTO_GRE, IPPROTO_ESP, IPPROTO_AH, IPPROTO_MTP, IPPROTO_BEETPH, IPPROTO_ENCAP, IPPROTO_PIM, IPPROTO_COMP, IPPROTO_SCTP, IPPROTO_UDPLITE, IPPROTO_MPLS, IPPROTO_RAW, IPPROTO_HOPOPTS, IPPROTO_ROUTING, IPPROTO_FRAGMENT, IPPROTO_ICMPV6, IPPROTO_NONE, IPPROTO_DSTOPTS, IPPROTO_MH, NEXTHDR_HOP, NEXTHDR_TCP, NEXTHDR_UDP, NEXTHDR_IPV6, NEXTHDR_ROUTING, NEXTHDR_FRAGMENT, NEXTHDR_GRE, NEXTHDR_ESP, NEXTHDR_AUTH, NEXTHDR_ICMP, NEXTHDR_NONE, NEXTHDR_DEST, NEXTHDR_SCTP, NEXTHDR_MOBILITY + +# This corresponds to LOCAL_IPV6 ("fd00::%02hxaa" % pid) in executor/common.h +ipv6_addr_local { + a0 const[0xfd, int8] + a1 array[const[0x00, int8], 13] + a2 proc[int8, 0, 1] + a3 const[0xaa, int8] +} [packed] + +# This corresponds to REMOTE_IPV6 ("fd00::%02hxbb" % pid) in executor/common.h +ipv6_addr_remote { + a0 const[0xfd, int8] + a1 array[const[0x00, int8], 13] + a2 proc[int8, 0, 1] + a3 const[0xbb, int8] +} [packed] + +ipv6_addr_loopback { + a0 const[0, int64be] + a1 const[1, int64be] +} [packed] + +ipv6_addr [ + local ipv6_addr_local + remote ipv6_addr_remote + loopback ipv6_addr_loopback +] + +# TODO: Describe more types of headers +# NEXTHDR_HOP, NEXTHDR_TCP, NEXTHDR_UDP, NEXTHDR_IPV6, NEXTHDR_ROUTING, NEXTHDR_FRAGMENT, NEXTHDR_GRE, NEXTHDR_ESP, NEXTHDR_AUTH, NEXTHDR_ICMP, NEXTHDR_NONE, NEXTHDR_DEST, NEXTHDR_SCTP, NEXTHDR_MOBILITY +# https://tools.ietf.org/html/rfc2402 +# https://tools.ietf.org/html/rfc2406 + +# https://tools.ietf.org/html/rfc2460#section-4 +# The length field in each of the extension headers specifies the +# length of the header in 8-octet units not including the first 8 octets. +ipv6_ext_header [ + hopopts ipv6_hopots_ext_header + routing ipv6_routing_ext_header + fragment ipv6_fragment_ext_header + dstopts ipv6_dstopts_ext_header +] [varlen] + +ipv6_hopots_ext_header { + next_header flags[ipv6_types, int8] + length bytesize8[options, int8] + pad array[const[0, int8], 6] + options array[ipv6_tlv_option] +} [packed, align_8] + +ipv6_routing_types = IPV6_SRCRT_STRICT, IPV6_SRCRT_TYPE_0, IPV6_SRCRT_TYPE_2 + +ipv6_routing_ext_header { + next_header flags[ipv6_types, int8] + length bytesize8[data, int8] + routing_type flags[ipv6_routing_types, int8] + segments_left int8 + reserved int32be + data array[ipv6_addr] +} [packed, align_8] + +ipv6_fragment_ext_header { + next_header flags[ipv6_types, int8] + reserved1 int8 + m_flag int16:1 + reserved2 int16:2 + fragment_offset int16be:13 + identification int32 +} [packed] + +ipv6_dstopts_ext_header { + next_header flags[ipv6_types, int8] + length bytesize8[options, int8] + pad array[const[0, int8], 6] + options array[ipv6_tlv_option] +} [packed] + +# TODO: describe particular tlv options +ipv6_tlv_option_types = IPV6_TLV_PAD1, IPV6_TLV_PADN, IPV6_TLV_ROUTERALERT, IPV6_TLV_CALIPSO, IPV6_TLV_JUMBO, IPV6_TLV_HAO, 0xff, 0xfe + +ipv6_tlv_option { + type flags[ipv6_tlv_option_types, int8] + length len[data, int8] + data array[int8] +} [packed] + +ipv6_packet { + priority int8:4 + version const[6, int8:4] + flow_label array[int8, 3] +# TODO: flow_label is actually 20 bits, 4 bits are part of priority + length len[payload, int16be] + next_header flags[ipv6_types, int8] + hop_limit int8 + src_ip ipv6_addr + dst_ip ipv6_addr + payload ipv6_packet_payload +} [packed] + +ipv6_packet_payload { + ext_headers array[ipv6_ext_header] + payload ip_payload +} [packed] + +################################################################################ ###################################### IP ###################################### ################################################################################ diff --git a/sys/vnet_amd64.const b/sys/vnet_amd64.const index 9d9a8855b..b59f7a4f3 100644 --- a/sys/vnet_amd64.const +++ b/sys/vnet_amd64.const @@ -80,27 +80,57 @@ IPPROTO_AH = 51 IPPROTO_BEETPH = 94 IPPROTO_COMP = 108 IPPROTO_DCCP = 33 +IPPROTO_DSTOPTS = 60 IPPROTO_EGP = 8 IPPROTO_ENCAP = 98 IPPROTO_ESP = 50 +IPPROTO_FRAGMENT = 44 IPPROTO_GRE = 47 +IPPROTO_HOPOPTS = 0 IPPROTO_ICMP = 1 +IPPROTO_ICMPV6 = 58 IPPROTO_IDP = 22 IPPROTO_IGMP = 2 IPPROTO_IP = 0 IPPROTO_IPIP = 4 IPPROTO_IPV6 = 41 +IPPROTO_MH = 135 IPPROTO_MPLS = 137 IPPROTO_MTP = 92 +IPPROTO_NONE = 59 IPPROTO_PIM = 103 IPPROTO_PUP = 12 IPPROTO_RAW = 255 +IPPROTO_ROUTING = 43 IPPROTO_RSVP = 46 IPPROTO_SCTP = 132 IPPROTO_TCP = 6 IPPROTO_TP = 29 IPPROTO_UDP = 17 IPPROTO_UDPLITE = 136 +IPV6_SRCRT_STRICT = 1 +IPV6_SRCRT_TYPE_0 = 0 +IPV6_SRCRT_TYPE_2 = 2 +IPV6_TLV_CALIPSO = 7 +IPV6_TLV_HAO = 201 +IPV6_TLV_JUMBO = 194 +IPV6_TLV_PAD1 = 0 +IPV6_TLV_PADN = 1 +IPV6_TLV_ROUTERALERT = 5 +NEXTHDR_AUTH = 51 +NEXTHDR_DEST = 60 +NEXTHDR_ESP = 50 +NEXTHDR_FRAGMENT = 44 +NEXTHDR_GRE = 47 +NEXTHDR_HOP = 0 +NEXTHDR_ICMP = 58 +NEXTHDR_IPV6 = 41 +NEXTHDR_MOBILITY = 135 +NEXTHDR_NONE = 59 +NEXTHDR_ROUTING = 43 +NEXTHDR_SCTP = 132 +NEXTHDR_TCP = 6 +NEXTHDR_UDP = 17 TCPHDR_ACK = 16 TCPHDR_CWR = 128 TCPHDR_ECE = 64 diff --git a/sys/vnet_arm64.const b/sys/vnet_arm64.const index 9d9a8855b..b59f7a4f3 100644 --- a/sys/vnet_arm64.const +++ b/sys/vnet_arm64.const @@ -80,27 +80,57 @@ IPPROTO_AH = 51 IPPROTO_BEETPH = 94 IPPROTO_COMP = 108 IPPROTO_DCCP = 33 +IPPROTO_DSTOPTS = 60 IPPROTO_EGP = 8 IPPROTO_ENCAP = 98 IPPROTO_ESP = 50 +IPPROTO_FRAGMENT = 44 IPPROTO_GRE = 47 +IPPROTO_HOPOPTS = 0 IPPROTO_ICMP = 1 +IPPROTO_ICMPV6 = 58 IPPROTO_IDP = 22 IPPROTO_IGMP = 2 IPPROTO_IP = 0 IPPROTO_IPIP = 4 IPPROTO_IPV6 = 41 +IPPROTO_MH = 135 IPPROTO_MPLS = 137 IPPROTO_MTP = 92 +IPPROTO_NONE = 59 IPPROTO_PIM = 103 IPPROTO_PUP = 12 IPPROTO_RAW = 255 +IPPROTO_ROUTING = 43 IPPROTO_RSVP = 46 IPPROTO_SCTP = 132 IPPROTO_TCP = 6 IPPROTO_TP = 29 IPPROTO_UDP = 17 IPPROTO_UDPLITE = 136 +IPV6_SRCRT_STRICT = 1 +IPV6_SRCRT_TYPE_0 = 0 +IPV6_SRCRT_TYPE_2 = 2 +IPV6_TLV_CALIPSO = 7 +IPV6_TLV_HAO = 201 +IPV6_TLV_JUMBO = 194 +IPV6_TLV_PAD1 = 0 +IPV6_TLV_PADN = 1 +IPV6_TLV_ROUTERALERT = 5 +NEXTHDR_AUTH = 51 +NEXTHDR_DEST = 60 +NEXTHDR_ESP = 50 +NEXTHDR_FRAGMENT = 44 +NEXTHDR_GRE = 47 +NEXTHDR_HOP = 0 +NEXTHDR_ICMP = 58 +NEXTHDR_IPV6 = 41 +NEXTHDR_MOBILITY = 135 +NEXTHDR_NONE = 59 +NEXTHDR_ROUTING = 43 +NEXTHDR_SCTP = 132 +NEXTHDR_TCP = 6 +NEXTHDR_UDP = 17 TCPHDR_ACK = 16 TCPHDR_CWR = 128 TCPHDR_ECE = 64 diff --git a/sys/vnet_ppc64le.const b/sys/vnet_ppc64le.const index 9d9a8855b..b59f7a4f3 100644 --- a/sys/vnet_ppc64le.const +++ b/sys/vnet_ppc64le.const @@ -80,27 +80,57 @@ IPPROTO_AH = 51 IPPROTO_BEETPH = 94 IPPROTO_COMP = 108 IPPROTO_DCCP = 33 +IPPROTO_DSTOPTS = 60 IPPROTO_EGP = 8 IPPROTO_ENCAP = 98 IPPROTO_ESP = 50 +IPPROTO_FRAGMENT = 44 IPPROTO_GRE = 47 +IPPROTO_HOPOPTS = 0 IPPROTO_ICMP = 1 +IPPROTO_ICMPV6 = 58 IPPROTO_IDP = 22 IPPROTO_IGMP = 2 IPPROTO_IP = 0 IPPROTO_IPIP = 4 IPPROTO_IPV6 = 41 +IPPROTO_MH = 135 IPPROTO_MPLS = 137 IPPROTO_MTP = 92 +IPPROTO_NONE = 59 IPPROTO_PIM = 103 IPPROTO_PUP = 12 IPPROTO_RAW = 255 +IPPROTO_ROUTING = 43 IPPROTO_RSVP = 46 IPPROTO_SCTP = 132 IPPROTO_TCP = 6 IPPROTO_TP = 29 IPPROTO_UDP = 17 IPPROTO_UDPLITE = 136 +IPV6_SRCRT_STRICT = 1 +IPV6_SRCRT_TYPE_0 = 0 +IPV6_SRCRT_TYPE_2 = 2 +IPV6_TLV_CALIPSO = 7 +IPV6_TLV_HAO = 201 +IPV6_TLV_JUMBO = 194 +IPV6_TLV_PAD1 = 0 +IPV6_TLV_PADN = 1 +IPV6_TLV_ROUTERALERT = 5 +NEXTHDR_AUTH = 51 +NEXTHDR_DEST = 60 +NEXTHDR_ESP = 50 +NEXTHDR_FRAGMENT = 44 +NEXTHDR_GRE = 47 +NEXTHDR_HOP = 0 +NEXTHDR_ICMP = 58 +NEXTHDR_IPV6 = 41 +NEXTHDR_MOBILITY = 135 +NEXTHDR_NONE = 59 +NEXTHDR_ROUTING = 43 +NEXTHDR_SCTP = 132 +NEXTHDR_TCP = 6 +NEXTHDR_UDP = 17 TCPHDR_ACK = 16 TCPHDR_CWR = 128 TCPHDR_ECE = 64 |
