aboutsummaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorAndrey Konovalov <andreyknvl@google.com>2017-02-02 19:19:32 +0100
committerAndrey Konovalov <andreyknvl@google.com>2017-02-02 19:19:32 +0100
commit13266cc0b604fed3d5f9fc73e9f804091e5c1ac6 (patch)
tree676de3f880ebdc151643c8236801dce532b1f7e7 /sys
parent1a85b51165c0be64dc8651245c2b235a4c1928ec (diff)
prog, sys: add udp description and checksum
Diffstat (limited to 'sys')
-rw-r--r--sys/decl.go1
-rw-r--r--sys/socket.txt40
-rw-r--r--sys/test.txt18
-rw-r--r--sys/vnet.txt18
4 files changed, 75 insertions, 2 deletions
diff --git a/sys/decl.go b/sys/decl.go
index ba1806836..77fbfbc51 100644
--- a/sys/decl.go
+++ b/sys/decl.go
@@ -195,6 +195,7 @@ type CsumKind int
const (
CsumIPv4 CsumKind = iota
CsumTCP
+ CsumUDP
)
type CsumType struct {
diff --git a/sys/socket.txt b/sys/socket.txt
index de9f44564..075f0536c 100644
--- a/sys/socket.txt
+++ b/sys/socket.txt
@@ -214,6 +214,26 @@ tcp_pair {
f1 sock_tcp
}
+# AF_INET: UDP support
+
+resource sock_udp[sock]
+
+socket$udp(domain const[AF_INET], type const[SOCK_DGRAM], proto const[0]) sock_udp
+socketpair$udp(domain const[AF_INET], type const[SOCK_DGRAM], proto const[0], fds ptr[out, udp_pair])
+accept$udp(fd sock_udp, peer ptr[out, sockaddr_in, opt], peerlen ptr[inout, len[peer, int32]]) sock_udp
+accept4$udp(fd sock_udp, peer ptr[out, sockaddr_in, opt], peerlen ptr[inout, len[peer, int32]], flags flags[accept_flags]) sock_udp
+bind$udp(fd sock_udp, addr ptr[in, sockaddr_in], addrlen len[addr])
+connect$udp(fd sock_udp, addr ptr[in, sockaddr_in], addrlen len[addr])
+sendto$udp(fd sock_udp, buf buffer[in], len len[buf], f flags[send_flags], addr ptr[in, sockaddr_in, opt], addrlen len[addr])
+recvfrom$udp(fd sock_udp, buf buffer[out], len len[buf], f flags[recv_flags], addr ptr[in, sockaddr_in, opt], addrlen len[addr])
+getsockname$udp(fd sock_udp, addr ptr[out, sockaddr_in], addrlen ptr[inout, len[addr, int32]])
+getpeername$udp(fd sock_udp, peer ptr[out, sockaddr_in], peerlen ptr[inout, len[peer, int32]])
+
+udp_pair {
+ f0 sock_udp
+ f1 sock_udp
+}
+
@@ -237,6 +257,26 @@ tcp6_pair {
f1 sock_tcp6
}
+# AF_INET6: UDP support
+
+resource sock_udp6[sock]
+
+socket$udp6(domain const[AF_INET6], type const[SOCK_DGRAM], proto const[0]) sock_udp6
+socketpair$udp6(domain const[AF_INET6], type const[SOCK_DGRAM], proto const[0], fds ptr[out, udp6_pair])
+accept$udp6(fd sock_udp6, peer ptr[out, sockaddr_in6, opt], peerlen ptr[inout, len[peer, int32]]) sock_udp6
+accept4$udp6(fd sock_udp6, peer ptr[out, sockaddr_in6, opt], peerlen ptr[inout, len[peer, int32]], flags flags[accept_flags]) sock_udp6
+bind$udp6(fd sock_udp6, addr ptr[in, sockaddr_in6], addrlen len[addr])
+connect$udp6(fd sock_udp6, addr ptr[in, sockaddr_in6], addrlen len[addr])
+sendto$udp6(fd sock_udp6, buf buffer[in], len len[buf], f flags[send_flags], addr ptr[in, sockaddr_in6, opt], addrlen len[addr])
+recvfrom$udp6(fd sock_udp6, buf buffer[out], len len[buf], f flags[recv_flags], addr ptr[in, sockaddr_in6, opt], addrlen len[addr])
+getsockname$udp6(fd sock_udp6, addr ptr[out, sockaddr_in6], addrlen ptr[inout, len[addr, int32]])
+getpeername$udp6(fd sock_udp6, peer ptr[out, sockaddr_in6], peerlen ptr[inout, len[peer, int32]])
+
+udp6_pair {
+ f0 sock_udp6
+ f1 sock_udp6
+}
+
diff --git a/sys/test.txt b/sys/test.txt
index 5d1d3266d..ae7b0b7f3 100644
--- a/sys/test.txt
+++ b/sys/test.txt
@@ -396,6 +396,8 @@ 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_test$csum_ipv4_udp(a0 ptr[in, syz_csum_ipv4_udp_packet])
+syz_test$csum_ipv6_udp(a0 ptr[in, syz_csum_ipv6_udp_packet])
syz_csum_encode {
f0 int16
@@ -408,7 +410,6 @@ syz_csum_encode {
syz_csum_ipv4_header {
csum csum[ipv4, int16]
- data syz_csum_encode
src_ip int32be
dst_ip int32be
} [packed]
@@ -436,3 +437,18 @@ syz_csum_ipv6_tcp_packet {
header syz_csum_ipv6_header
payload syz_csum_tcp_packet
} [packed]
+
+syz_csum_udp_packet {
+ csum csum[udp, int16]
+ payload array[int8]
+} [packed]
+
+syz_csum_ipv4_udp_packet {
+ header syz_csum_ipv4_header
+ payload syz_csum_udp_packet
+} [packed]
+
+syz_csum_ipv6_udp_packet {
+ header syz_csum_ipv6_header
+ payload syz_csum_udp_packet
+} [packed]
diff --git a/sys/vnet.txt b/sys/vnet.txt
index 49582cae4..794103282 100644
--- a/sys/vnet.txt
+++ b/sys/vnet.txt
@@ -378,8 +378,24 @@ ipv6_packet_payload {
###################################### IP ######################################
################################################################################
-ip_payload {
+ip_payload [
tcp tcp_packet
+ udp udp_packet
+] [varlen]
+
+################################################################################
+###################################### UDP #####################################
+################################################################################
+
+# https://tools.ietf.org/html/rfc768
+# https://en.wikipedia.org/wiki/User_Datagram_Protocol#Packet_structure
+
+udp_packet {
+ src_port proc[int16be, 20000, 4]
+ dst_port proc[int16be, 20000, 4]
+ length len[parent, int16be]
+ csum csum[udp, int16be]
+ data array[int8]
} [packed]
################################################################################