From 13266cc0b604fed3d5f9fc73e9f804091e5c1ac6 Mon Sep 17 00:00:00 2001 From: Andrey Konovalov Date: Thu, 2 Feb 2017 19:19:32 +0100 Subject: prog, sys: add udp description and checksum --- sys/decl.go | 1 + sys/socket.txt | 40 ++++++++++++++++++++++++++++++++++++++++ sys/test.txt | 18 +++++++++++++++++- sys/vnet.txt | 18 +++++++++++++++++- 4 files changed, 75 insertions(+), 2 deletions(-) (limited to 'sys') 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] ################################################################################ -- cgit mrf-deployment