-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathheaders.p4
More file actions
190 lines (168 loc) · 3.87 KB
/
headers.p4
File metadata and controls
190 lines (168 loc) · 3.87 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
// Copyright 2026 Oxide Computer Company
header sidecar_h {
bit<8> sc_code;
bit<8> sc_pad;
bit<16> sc_ingress;
bit<16> sc_egress;
bit<16> sc_ether_type;
bit<128> sc_payload;
}
header ethernet_h {
bit<48> dst;
bit<48> src;
bit<16> ether_type;
}
header vlan_h {
bit<3> pcp;
bit<1> dei;
bit<12> vid;
bit<16> ether_type;
}
header ipv6_h {
bit<4> version;
bit<8> traffic_class;
bit<20> flow_label;
bit<16> payload_len;
bit<8> next_hdr;
bit<8> hop_limit;
bit<128> src;
bit<128> dst;
}
header ipv4_h {
bit<4> version;
bit<4> ihl;
bit<8> diffserv;
bit<16> total_len;
bit<16> identification;
bit<3> flags;
bit<13> frag_offset;
bit<8> ttl;
bit<8> protocol;
bit<16> hdr_checksum;
bit<32> src;
bit<32> dst;
}
header udp_h {
bit<16> src_port;
bit<16> dst_port;
bit<16> len;
bit<16> checksum;
}
header tcp_h {
bit<16> src_port;
bit<16> dst_port;
bit<32> seq_no;
bit<32> ack_no;
bit<4> data_offset;
bit<4> res;
bit<8> flags;
bit<16> window;
bit<16> checksum;
bit<16> urgent_ptr;
}
header icmp_h {
bit<8> type;
bit<8> code;
bit<16> hdr_checksum;
bit<16> identifier;
bit<16> seq;
}
header geneve_h {
bit<2> version;
bit<6> opt_len;
bit<1> ctrl;
bit<1> crit;
bit<6> reserved;
bit<16> protocol;
bit<24> vni;
bit<8> reserved2;
}
header geneve_opt_h {
bit<16> class;
bit<1> crit;
bit<7> rtype;
bit<3> reserved;
bit<5> opt_len;
}
header oxg_opt_multicast_h {
bit<2> mcast_tag;
bit<30> reserved;
}
header oxg_opt_mss_h {
bit<32> mss;
}
header arp_h {
bit<16> hw_type;
bit<16> proto_type;
bit<8> hw_addr_len;
bit<8> proto_addr_len;
bit<16> opcode;
// In theory, the remaining fields should be <varbit>
// based on the the two x_len fields.
bit<48> sender_mac;
bit<32> sender_ip;
bit<48> target_mac;
bit<32> target_ip;
}
header ddm_h {
bit<8> next_header;
bit<8> header_length;
bit<8> version;
bit<1> ack;
bit<7> reserved;
}
header ddm_element_t {
bit<8> id;
bit<24> timestamp;
}
struct headers_t {
ethernet_h ethernet;
sidecar_h sidecar;
vlan_h vlan;
arp_h arp;
ipv4_h ipv4;
ipv6_h ipv6;
ddm_h ddm;
// The ddm original p4 code used a header stack, but Intel says this is not
// efficient on Tofino, and x4c does not currently support header stacks. So
// the following is an unrolled version. This is not easy on the eyes.
ddm_element_t ddm0;
ddm_element_t ddm1;
ddm_element_t ddm2;
ddm_element_t ddm3;
ddm_element_t ddm4;
ddm_element_t ddm5;
ddm_element_t ddm6;
ddm_element_t ddm7;
ddm_element_t ddm8;
ddm_element_t ddm9;
ddm_element_t ddm10;
ddm_element_t ddm11;
ddm_element_t ddm12;
ddm_element_t ddm13;
ddm_element_t ddm14;
ddm_element_t ddm15;
icmp_h icmp;
tcp_h tcp;
udp_h udp;
geneve_h geneve;
// As above, x4c does not support header stacks. We do need to inspect
// some headers (e.g., oxg_mcast) to determine correct forwarding
// behaviour for multicast traffic, which means that at least some
// headers must be well-typed. The construction here provides this, but
// allows for at most one of each option. If/when we need passthrough for
// arbitrary-sized options, we can do so using a similar design as above
// (although g_tag_0, g_chunk_0_0, g_chunk_0_1, g_chunk_0_2, ... would not
// be pretty).
geneve_opt_h oxg_external_tag;
geneve_opt_h oxg_mcast_tag;
oxg_opt_multicast_h oxg_mcast;
geneve_opt_h oxg_mss_tag;
oxg_opt_mss_h oxg_mss;
ethernet_h inner_eth;
ipv4_h inner_ipv4;
ipv6_h inner_ipv6;
icmp_h inner_icmp;
tcp_h inner_tcp;
udp_h inner_udp;
}