diff options
| author | Andrey Konovalov <andreyknvl@google.com> | 2017-01-30 19:17:38 +0100 |
|---|---|---|
| committer | Andrey Konovalov <andreyknvl@google.com> | 2017-01-30 21:00:45 +0100 |
| commit | 1f7f5daef8b9d4665e463bd842c701b4db27f56b (patch) | |
| tree | 3b8af0bd368cf9ccc1ebc130c50a4f41dabf320c /sys | |
| parent | 4ee789185bc215d62e9cfa92e23a8de2760789cb (diff) | |
prog, sys: add tcp packets descriptions
Also embed tcp checksums into packets.
Diffstat (limited to 'sys')
| -rw-r--r-- | sys/decl.go | 1 | ||||
| -rw-r--r-- | sys/socket.txt | 23 | ||||
| -rw-r--r-- | sys/sys.txt | 2 | ||||
| -rw-r--r-- | sys/test.txt | 26 | ||||
| -rw-r--r-- | sys/vnet.txt | 135 | ||||
| -rw-r--r-- | sys/vnet_amd64.const | 19 | ||||
| -rw-r--r-- | sys/vnet_arm64.const | 19 | ||||
| -rw-r--r-- | sys/vnet_ppc64le.const | 19 |
8 files changed, 238 insertions, 6 deletions
diff --git a/sys/decl.go b/sys/decl.go index 57d788576..ba1806836 100644 --- a/sys/decl.go +++ b/sys/decl.go @@ -194,6 +194,7 @@ type CsumKind int const ( CsumIPv4 CsumKind = iota + CsumTCP ) type CsumType struct { diff --git a/sys/socket.txt b/sys/socket.txt index c123a5db9..9e86c4de7 100644 --- a/sys/socket.txt +++ b/sys/socket.txt @@ -138,6 +138,7 @@ sockaddr_in { family const[AF_INET, int16] port proc[int16be, 20000, 4] addr in_addr + pad array[const[0, int8], 8] } sockaddr_storage_in { @@ -193,6 +194,28 @@ cmsghdr { +# AF_INET: TCP support + +resource sock_tcp[sock] + +socket$tcp(domain const[AF_INET], type const[SOCK_STREAM], proto const[0]) sock_tcp +socketpair$tcp(domain const[AF_INET], type const[SOCK_STREAM], proto const[0], fds ptr[out, tcp_pair]) +accept$tcp(fd sock_tcp, peer ptr[out, sockaddr_in, opt], peerlen ptr[inout, len[peer, int32]]) sock_tcp +accept4$tcp(fd sock_tcp, peer ptr[out, sockaddr_in, opt], peerlen ptr[inout, len[peer, int32]], flags flags[accept_flags]) sock_tcp +bind$tcp(fd sock_tcp, addr ptr[in, sockaddr_in], addrlen len[addr]) +connect$tcp(fd sock_tcp, addr ptr[in, sockaddr_in], addrlen len[addr]) +sendto$tcp(fd sock_tcp, buf buffer[in], len len[buf], f flags[send_flags], addr ptr[in, sockaddr_in, opt], addrlen len[addr]) +recvfrom$tcp(fd sock_tcp, buf buffer[out], len len[buf], f flags[recv_flags], addr ptr[in, sockaddr_in, opt], addrlen len[addr]) +getsockname$tcp(fd sock_tcp, addr ptr[out, sockaddr_in], addrlen ptr[inout, len[addr, int32]]) +getpeername$tcp(fd sock_tcp, peer ptr[out, sockaddr_in], peerlen ptr[inout, len[peer, int32]]) + +tcp_pair { + f0 sock_tcp + f1 sock_tcp +} + + + # AF_UNIX support. resource sock_unix[sock] diff --git a/sys/sys.txt b/sys/sys.txt index be43f0786..b4e6bdf58 100644 --- a/sys/sys.txt +++ b/sys/sys.txt @@ -941,7 +941,7 @@ in_addr [ loopback const[0x7f000001, int32be] # 255.255.255.255 broadcast const[0xffffffff, int32be] -} +] in6_addr_empty { a0 const[0, int64be] diff --git a/sys/test.txt b/sys/test.txt index 75b8428fd..932ddac01 100644 --- a/sys/test.txt +++ b/sys/test.txt @@ -393,7 +393,8 @@ syz_test$bf1(a0 ptr[in, syz_bf_struct1]) # Checksums syz_test$csum_encode(a0 ptr[in, syz_csum_encode]) -syz_test$csum_ipv4(a0 ptr[in, syz_csum_ipv4]) +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_csum_encode { f0 int16 @@ -404,7 +405,24 @@ syz_csum_encode { f5 array[int8, 4] } [packed] -syz_csum_ipv4 { - f0 csum[ipv4, int16] - f1 syz_csum_encode +syz_csum_ipv4_header { + csum csum[ipv4, int16] + data syz_csum_encode + protocol int8 + src_ip int32be + dst_ip int32be +} [packed] + +syz_csum_tcp_header { + csum csum[tcp, int16] +} [packed] + +syz_csum_tcp_packet { + header syz_csum_tcp_header + payload array[int8] +} [packed] + +syz_csum_ipv4_tcp_packet { + header syz_csum_ipv4_header + payload syz_csum_tcp_packet } [packed] diff --git a/sys/vnet.txt b/sys/vnet.txt index 296d04793..5e9becc70 100644 --- a/sys/vnet.txt +++ b/sys/vnet.txt @@ -257,6 +257,139 @@ ipv4_packet { payload ip_payload } [packed] +################################################################################ +###################################### IP ###################################### +################################################################################ + ip_payload { - dummy array[int8, 0:128] + tcp tcp_packet +} [packed] + +################################################################################ +###################################### TCP ##################################### +################################################################################ + +# https://en.wikipedia.org/wiki/Transmission_Control_Protocol#TCP_segment_structure +# http://www.iana.org/assignments/tcp-parameters/tcp-parameters.xhtml + +include <net/tcp.h> +include <uapi/linux/tcp.h> + +tcp_option [ + generic tcp_generic_option + nop tcp_nop_option + eol tcp_eol_option + mss tcp_mss_option + window tcp_window_option + sack_perm tcp_sack_perm_option + sack tcp_sack_option + timestamp tcp_timestamp_option + md5sig tcp_md5sig_option + fastopen tcp_fastopen_option +# TODO: TCPOPT_EXP option +] [varlen] + +tcp_option_types = TCPOPT_NOP, TCPOPT_EOL, TCPOPT_MSS, TCPOPT_WINDOW, TCPOPT_SACK_PERM, TCPOPT_SACK, TCPOPT_TIMESTAMP, TCPOPT_MD5SIG, TCPOPT_FASTOPEN, TCPOPT_EXP + +tcp_generic_option { + type flags[tcp_option_types, int8] + length len[parent, int8] + data array[int8, 0:16] +} [packed] + +# https://tools.ietf.org/html/rfc793#section-3.1 +tcp_nop_option { + type const[TCPOPT_NOP, int8] +} [packed] + +# https://tools.ietf.org/html/rfc793#section-3.1 +tcp_eol_option { + type const[TCPOPT_EOL, int8] +} [packed] + +# https://tools.ietf.org/html/rfc793#section-3.1 +tcp_mss_option { + type const[TCPOPT_MSS, int8] + length len[parent, int8] + seg_size int16 +} [packed] + +# https://tools.ietf.org/html/rfc7323#section-2 +tcp_window_option { + type const[TCPOPT_WINDOW, int8] + length len[parent, int8] + shift int8 +} [packed] + +# https://tools.ietf.org/html/rfc2018#section-2 +tcp_sack_perm_option { + type const[TCPOPT_SACK_PERM, int8] + length len[parent, int8] +} [packed] + +# https://tools.ietf.org/html/rfc2018#section-3 +tcp_sack_option { + type const[TCPOPT_SACK, int8] + length len[parent, int8] + data array[int32be] +} [packed] + +# https://tools.ietf.org/html/rfc7323#section-3 +tcp_timestamp_option { + type const[TCPOPT_TIMESTAMP, int8] + length len[parent, int8] + tsval int32be + tsecr int32be +} [packed] + +# https://tools.ietf.org/html/rfc2385#section-3.0 +tcp_md5sig_option { + type const[TCPOPT_MD5SIG, int8] + length len[parent, int8] + md5 array[int8, 16] +} [packed] + +# https://tools.ietf.org/html/rfc7413#section-4.1.1 +tcp_fastopen_option { + type const[TCPOPT_FASTOPEN, int8] + length len[parent, int8] + data array[int8, 0:16] +} [packed] + +tcp_options { + options array[tcp_option] +} [packed, align_4] + +# TODO: extract sequence numbers from packets +tcp_seq_num [ + init const[0x56565656, int32be] + next const[0x56565657, int32be] + nextn int32be[0x56565656:0x56566000] + random int32be +] + +tcp_flags = 0, TCPHDR_FIN, TCPHDR_SYN, TCPHDR_RST, TCPHDR_PSH, TCPHDR_ACK, TCPHDR_URG, TCPHDR_ECE, TCPHDR_CWR, TCPHDR_SYN_ECN + +tcp_header { + src_port proc[int16be, 20000, 4] + dst_port proc[int16be, 20000, 4] + seq_num tcp_seq_num + ack_num tcp_seq_num + ns int8:1 + reserved const[0, int8:3] + data_off bytesize4[parent, int8:4] + flags flags[tcp_flags, int8] + window_size int16be + csum csum[tcp, int16be] + urg_ptr int16be + options tcp_options +} [packed] + +tcp_packet { + header tcp_header + payload tcp_payload +} [packed] + +tcp_payload { + payload array[int8] } [packed] diff --git a/sys/vnet_amd64.const b/sys/vnet_amd64.const index cce212a4e..9d9a8855b 100644 --- a/sys/vnet_amd64.const +++ b/sys/vnet_amd64.const @@ -101,3 +101,22 @@ IPPROTO_TCP = 6 IPPROTO_TP = 29 IPPROTO_UDP = 17 IPPROTO_UDPLITE = 136 +TCPHDR_ACK = 16 +TCPHDR_CWR = 128 +TCPHDR_ECE = 64 +TCPHDR_FIN = 1 +TCPHDR_PSH = 8 +TCPHDR_RST = 4 +TCPHDR_SYN = 2 +TCPHDR_SYN_ECN = 194 +TCPHDR_URG = 32 +TCPOPT_EOL = 0 +TCPOPT_EXP = 254 +TCPOPT_FASTOPEN = 34 +TCPOPT_MD5SIG = 19 +TCPOPT_MSS = 2 +TCPOPT_NOP = 1 +TCPOPT_SACK = 5 +TCPOPT_SACK_PERM = 4 +TCPOPT_TIMESTAMP = 8 +TCPOPT_WINDOW = 3 diff --git a/sys/vnet_arm64.const b/sys/vnet_arm64.const index cce212a4e..9d9a8855b 100644 --- a/sys/vnet_arm64.const +++ b/sys/vnet_arm64.const @@ -101,3 +101,22 @@ IPPROTO_TCP = 6 IPPROTO_TP = 29 IPPROTO_UDP = 17 IPPROTO_UDPLITE = 136 +TCPHDR_ACK = 16 +TCPHDR_CWR = 128 +TCPHDR_ECE = 64 +TCPHDR_FIN = 1 +TCPHDR_PSH = 8 +TCPHDR_RST = 4 +TCPHDR_SYN = 2 +TCPHDR_SYN_ECN = 194 +TCPHDR_URG = 32 +TCPOPT_EOL = 0 +TCPOPT_EXP = 254 +TCPOPT_FASTOPEN = 34 +TCPOPT_MD5SIG = 19 +TCPOPT_MSS = 2 +TCPOPT_NOP = 1 +TCPOPT_SACK = 5 +TCPOPT_SACK_PERM = 4 +TCPOPT_TIMESTAMP = 8 +TCPOPT_WINDOW = 3 diff --git a/sys/vnet_ppc64le.const b/sys/vnet_ppc64le.const index cce212a4e..9d9a8855b 100644 --- a/sys/vnet_ppc64le.const +++ b/sys/vnet_ppc64le.const @@ -101,3 +101,22 @@ IPPROTO_TCP = 6 IPPROTO_TP = 29 IPPROTO_UDP = 17 IPPROTO_UDPLITE = 136 +TCPHDR_ACK = 16 +TCPHDR_CWR = 128 +TCPHDR_ECE = 64 +TCPHDR_FIN = 1 +TCPHDR_PSH = 8 +TCPHDR_RST = 4 +TCPHDR_SYN = 2 +TCPHDR_SYN_ECN = 194 +TCPHDR_URG = 32 +TCPOPT_EOL = 0 +TCPOPT_EXP = 254 +TCPOPT_FASTOPEN = 34 +TCPOPT_MD5SIG = 19 +TCPOPT_MSS = 2 +TCPOPT_NOP = 1 +TCPOPT_SACK = 5 +TCPOPT_SACK_PERM = 4 +TCPOPT_TIMESTAMP = 8 +TCPOPT_WINDOW = 3 |
