aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--prog/checksum.go77
-rw-r--r--prog/checksum_test.go18
-rw-r--r--sys/socket.txt24
-rw-r--r--sys/test.txt12
-rw-r--r--sys/vnet.txt125
-rw-r--r--sys/vnet_amd64.const30
-rw-r--r--sys/vnet_arm64.const30
-rw-r--r--sys/vnet_ppc64le.const30
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