xref: /aosp_15_r20/external/bcc/src/lua/bpf/proto.lua (revision 387f9dfdfa2baef462e92476d413c7bc2470293e)
1*387f9dfdSAndroid Build Coastguard Worker--[[
2*387f9dfdSAndroid Build Coastguard WorkerCopyright 2016 Marek Vavrusa <[email protected]>
3*387f9dfdSAndroid Build Coastguard Worker
4*387f9dfdSAndroid Build Coastguard WorkerLicensed under the Apache License, Version 2.0 (the "License");
5*387f9dfdSAndroid Build Coastguard Workeryou may not use this file except in compliance with the License.
6*387f9dfdSAndroid Build Coastguard WorkerYou may obtain a copy of the License at
7*387f9dfdSAndroid Build Coastguard Worker
8*387f9dfdSAndroid Build Coastguard Workerhttp://www.apache.org/licenses/LICENSE-2.0
9*387f9dfdSAndroid Build Coastguard Worker
10*387f9dfdSAndroid Build Coastguard WorkerUnless required by applicable law or agreed to in writing, software
11*387f9dfdSAndroid Build Coastguard Workerdistributed under the License is distributed on an "AS IS" BASIS,
12*387f9dfdSAndroid Build Coastguard WorkerWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*387f9dfdSAndroid Build Coastguard WorkerSee the License for the specific language governing permissions and
14*387f9dfdSAndroid Build Coastguard Workerlimitations under the License.
15*387f9dfdSAndroid Build Coastguard Worker]]
16*387f9dfdSAndroid Build Coastguard Workerlocal ffi = require('ffi')
17*387f9dfdSAndroid Build Coastguard Workerlocal BPF = ffi.typeof('struct bpf')
18*387f9dfdSAndroid Build Coastguard Worker
19*387f9dfdSAndroid Build Coastguard Workerffi.cdef [[
20*387f9dfdSAndroid Build Coastguard Workerstruct sk_buff {
21*387f9dfdSAndroid Build Coastguard Worker	uint32_t len;
22*387f9dfdSAndroid Build Coastguard Worker	uint32_t pkt_type;
23*387f9dfdSAndroid Build Coastguard Worker	uint32_t mark;
24*387f9dfdSAndroid Build Coastguard Worker	uint32_t queue_mapping;
25*387f9dfdSAndroid Build Coastguard Worker	uint32_t protocol;
26*387f9dfdSAndroid Build Coastguard Worker	uint32_t vlan_present;
27*387f9dfdSAndroid Build Coastguard Worker	uint32_t vlan_tci;
28*387f9dfdSAndroid Build Coastguard Worker	uint32_t vlan_proto;
29*387f9dfdSAndroid Build Coastguard Worker	uint32_t priority;
30*387f9dfdSAndroid Build Coastguard Worker	uint32_t ingress_ifindex;
31*387f9dfdSAndroid Build Coastguard Worker	uint32_t ifindex;
32*387f9dfdSAndroid Build Coastguard Worker	uint32_t tc_index;
33*387f9dfdSAndroid Build Coastguard Worker	uint32_t cb[5];
34*387f9dfdSAndroid Build Coastguard Worker	uint32_t hash;
35*387f9dfdSAndroid Build Coastguard Worker	uint32_t tc_classid;
36*387f9dfdSAndroid Build Coastguard Worker	uint32_t data;
37*387f9dfdSAndroid Build Coastguard Worker	uint32_t data_end;
38*387f9dfdSAndroid Build Coastguard Worker	uint32_t napi_id;
39*387f9dfdSAndroid Build Coastguard Worker
40*387f9dfdSAndroid Build Coastguard Worker	/* Accessed by BPF_PROG_TYPE_sk_skb types from here to ... */
41*387f9dfdSAndroid Build Coastguard Worker	uint32_t family;
42*387f9dfdSAndroid Build Coastguard Worker	uint32_t remote_ip4;	/* Stored in network byte order */
43*387f9dfdSAndroid Build Coastguard Worker	uint32_t local_ip4;	/* Stored in network byte order */
44*387f9dfdSAndroid Build Coastguard Worker	uint32_t remote_ip6[4];	/* Stored in network byte order */
45*387f9dfdSAndroid Build Coastguard Worker	uint32_t local_ip6[4];	/* Stored in network byte order */
46*387f9dfdSAndroid Build Coastguard Worker	uint32_t remote_port;	/* Stored in network byte order */
47*387f9dfdSAndroid Build Coastguard Worker	uint32_t local_port;	/* stored in host byte order */
48*387f9dfdSAndroid Build Coastguard Worker	/* ... here. */
49*387f9dfdSAndroid Build Coastguard Worker
50*387f9dfdSAndroid Build Coastguard Worker	uint32_t data_meta;
51*387f9dfdSAndroid Build Coastguard Worker};
52*387f9dfdSAndroid Build Coastguard Worker
53*387f9dfdSAndroid Build Coastguard Workerstruct net_off_t {
54*387f9dfdSAndroid Build Coastguard Worker	uint8_t  ver:4;
55*387f9dfdSAndroid Build Coastguard Worker} __attribute__((packed));
56*387f9dfdSAndroid Build Coastguard Worker
57*387f9dfdSAndroid Build Coastguard Workerstruct eth_t {
58*387f9dfdSAndroid Build Coastguard Worker	uint8_t  dst[6];
59*387f9dfdSAndroid Build Coastguard Worker	uint8_t  src[6];
60*387f9dfdSAndroid Build Coastguard Worker	uint16_t type;
61*387f9dfdSAndroid Build Coastguard Worker} __attribute__((packed));
62*387f9dfdSAndroid Build Coastguard Worker
63*387f9dfdSAndroid Build Coastguard Workerstruct dot1q_t {
64*387f9dfdSAndroid Build Coastguard Worker	uint16_t pri:3;
65*387f9dfdSAndroid Build Coastguard Worker	uint16_t cfi:1;
66*387f9dfdSAndroid Build Coastguard Worker	uint16_t vlanid:12;
67*387f9dfdSAndroid Build Coastguard Worker	uint16_t type;
68*387f9dfdSAndroid Build Coastguard Worker} __attribute__((packed));
69*387f9dfdSAndroid Build Coastguard Worker
70*387f9dfdSAndroid Build Coastguard Workerstruct arp_t {
71*387f9dfdSAndroid Build Coastguard Worker	uint16_t htype;
72*387f9dfdSAndroid Build Coastguard Worker	uint16_t ptype;
73*387f9dfdSAndroid Build Coastguard Worker	uint8_t  hlen;
74*387f9dfdSAndroid Build Coastguard Worker	uint8_t  plen;
75*387f9dfdSAndroid Build Coastguard Worker	uint16_t oper;
76*387f9dfdSAndroid Build Coastguard Worker	uint8_t  sha[6];
77*387f9dfdSAndroid Build Coastguard Worker	uint32_t spa;
78*387f9dfdSAndroid Build Coastguard Worker	uint8_t  tha[6];
79*387f9dfdSAndroid Build Coastguard Worker	uint32_t tpa;
80*387f9dfdSAndroid Build Coastguard Worker} __attribute__((packed));
81*387f9dfdSAndroid Build Coastguard Worker
82*387f9dfdSAndroid Build Coastguard Workerstruct ip_t {
83*387f9dfdSAndroid Build Coastguard Worker	uint8_t  ver:4;
84*387f9dfdSAndroid Build Coastguard Worker	uint8_t  hlen:4;
85*387f9dfdSAndroid Build Coastguard Worker	uint8_t  tos;
86*387f9dfdSAndroid Build Coastguard Worker	uint16_t tlen;
87*387f9dfdSAndroid Build Coastguard Worker	uint16_t identification;
88*387f9dfdSAndroid Build Coastguard Worker	uint16_t ffo_unused:1;
89*387f9dfdSAndroid Build Coastguard Worker	uint16_t df:1;
90*387f9dfdSAndroid Build Coastguard Worker	uint16_t mf:1;
91*387f9dfdSAndroid Build Coastguard Worker	uint16_t foffset:13;
92*387f9dfdSAndroid Build Coastguard Worker	uint8_t  ttl;
93*387f9dfdSAndroid Build Coastguard Worker	uint8_t  proto;
94*387f9dfdSAndroid Build Coastguard Worker	uint16_t hchecksum;
95*387f9dfdSAndroid Build Coastguard Worker	uint32_t src;
96*387f9dfdSAndroid Build Coastguard Worker	uint32_t dst;
97*387f9dfdSAndroid Build Coastguard Worker} __attribute__((packed));
98*387f9dfdSAndroid Build Coastguard Worker
99*387f9dfdSAndroid Build Coastguard Workerstruct icmp_t {
100*387f9dfdSAndroid Build Coastguard Worker	uint8_t  type;
101*387f9dfdSAndroid Build Coastguard Worker	uint8_t  code;
102*387f9dfdSAndroid Build Coastguard Worker	uint16_t checksum;
103*387f9dfdSAndroid Build Coastguard Worker} __attribute__((packed));
104*387f9dfdSAndroid Build Coastguard Worker
105*387f9dfdSAndroid Build Coastguard Workerstruct ip6_t {
106*387f9dfdSAndroid Build Coastguard Worker	uint32_t ver:4;
107*387f9dfdSAndroid Build Coastguard Worker	uint32_t priority:8;
108*387f9dfdSAndroid Build Coastguard Worker	uint32_t flow_label:20;
109*387f9dfdSAndroid Build Coastguard Worker	uint16_t payload_len;
110*387f9dfdSAndroid Build Coastguard Worker	uint8_t  next_header;
111*387f9dfdSAndroid Build Coastguard Worker	uint8_t  hop_limit;
112*387f9dfdSAndroid Build Coastguard Worker	uint64_t src_hi;
113*387f9dfdSAndroid Build Coastguard Worker	uint64_t src_lo;
114*387f9dfdSAndroid Build Coastguard Worker	uint64_t dst_hi;
115*387f9dfdSAndroid Build Coastguard Worker	uint64_t dst_lo;
116*387f9dfdSAndroid Build Coastguard Worker} __attribute__((packed));
117*387f9dfdSAndroid Build Coastguard Worker
118*387f9dfdSAndroid Build Coastguard Workerstruct ip6_opt_t {
119*387f9dfdSAndroid Build Coastguard Worker	uint8_t  next_header;
120*387f9dfdSAndroid Build Coastguard Worker	uint8_t  ext_len;
121*387f9dfdSAndroid Build Coastguard Worker	uint8_t  pad[6];
122*387f9dfdSAndroid Build Coastguard Worker} __attribute__((packed));
123*387f9dfdSAndroid Build Coastguard Worker
124*387f9dfdSAndroid Build Coastguard Workerstruct icmp6_t {
125*387f9dfdSAndroid Build Coastguard Worker	uint8_t  type;
126*387f9dfdSAndroid Build Coastguard Worker	uint8_t  code;
127*387f9dfdSAndroid Build Coastguard Worker	uint16_t checksum;
128*387f9dfdSAndroid Build Coastguard Worker} __attribute__((packed));
129*387f9dfdSAndroid Build Coastguard Worker
130*387f9dfdSAndroid Build Coastguard Workerstruct udp_t {
131*387f9dfdSAndroid Build Coastguard Worker	uint16_t src_port;
132*387f9dfdSAndroid Build Coastguard Worker	uint16_t dst_port;
133*387f9dfdSAndroid Build Coastguard Worker	uint16_t length;
134*387f9dfdSAndroid Build Coastguard Worker	uint16_t crc;
135*387f9dfdSAndroid Build Coastguard Worker} __attribute__((packed));
136*387f9dfdSAndroid Build Coastguard Worker
137*387f9dfdSAndroid Build Coastguard Workerstruct tcp_t {
138*387f9dfdSAndroid Build Coastguard Worker	uint16_t src_port;
139*387f9dfdSAndroid Build Coastguard Worker	uint16_t dst_port;
140*387f9dfdSAndroid Build Coastguard Worker	uint32_t seq_num;
141*387f9dfdSAndroid Build Coastguard Worker	uint32_t ack_num;
142*387f9dfdSAndroid Build Coastguard Worker	uint8_t  offset:4;
143*387f9dfdSAndroid Build Coastguard Worker	uint8_t  reserved:4;
144*387f9dfdSAndroid Build Coastguard Worker	uint8_t  flag_cwr:1;
145*387f9dfdSAndroid Build Coastguard Worker	uint8_t  flag_ece:1;
146*387f9dfdSAndroid Build Coastguard Worker	uint8_t  flag_urg:1;
147*387f9dfdSAndroid Build Coastguard Worker	uint8_t  flag_ack:1;
148*387f9dfdSAndroid Build Coastguard Worker	uint8_t  flag_psh:1;
149*387f9dfdSAndroid Build Coastguard Worker	uint8_t  flag_rst:1;
150*387f9dfdSAndroid Build Coastguard Worker	uint8_t  flag_syn:1;
151*387f9dfdSAndroid Build Coastguard Worker	uint8_t  flag_fin:1;
152*387f9dfdSAndroid Build Coastguard Worker	uint16_t rcv_wnd;
153*387f9dfdSAndroid Build Coastguard Worker	uint16_t cksum;
154*387f9dfdSAndroid Build Coastguard Worker	uint16_t urg_ptr;
155*387f9dfdSAndroid Build Coastguard Worker} __attribute__((packed));
156*387f9dfdSAndroid Build Coastguard Worker
157*387f9dfdSAndroid Build Coastguard Workerstruct vxlan_t {
158*387f9dfdSAndroid Build Coastguard Worker	uint32_t rsv1:4;
159*387f9dfdSAndroid Build Coastguard Worker	uint32_t iflag:1;
160*387f9dfdSAndroid Build Coastguard Worker	uint32_t rsv2:3;
161*387f9dfdSAndroid Build Coastguard Worker	uint32_t rsv3:24;
162*387f9dfdSAndroid Build Coastguard Worker	uint32_t key:24;
163*387f9dfdSAndroid Build Coastguard Worker	uint32_t rsv4:8;
164*387f9dfdSAndroid Build Coastguard Worker} __attribute__((packed));
165*387f9dfdSAndroid Build Coastguard Worker]]
166*387f9dfdSAndroid Build Coastguard Worker
167*387f9dfdSAndroid Build Coastguard Worker
168*387f9dfdSAndroid Build Coastguard Worker-- Architecture-specific ptrace register layout
169*387f9dfdSAndroid Build Coastguard Workerlocal S = require('syscall')
170*387f9dfdSAndroid Build Coastguard Workerlocal arch = S.abi.arch
171*387f9dfdSAndroid Build Coastguard Workerlocal parm_to_reg = {}
172*387f9dfdSAndroid Build Coastguard Workerif arch == 'x64' then
173*387f9dfdSAndroid Build Coastguard Worker	ffi.cdef [[
174*387f9dfdSAndroid Build Coastguard Worker	struct pt_regs {
175*387f9dfdSAndroid Build Coastguard Worker		unsigned long r15;
176*387f9dfdSAndroid Build Coastguard Worker		unsigned long r14;
177*387f9dfdSAndroid Build Coastguard Worker		unsigned long r13;
178*387f9dfdSAndroid Build Coastguard Worker		unsigned long r12;
179*387f9dfdSAndroid Build Coastguard Worker		unsigned long bp;
180*387f9dfdSAndroid Build Coastguard Worker		unsigned long bx;
181*387f9dfdSAndroid Build Coastguard Worker		unsigned long r11;
182*387f9dfdSAndroid Build Coastguard Worker		unsigned long r10;
183*387f9dfdSAndroid Build Coastguard Worker		unsigned long r9;
184*387f9dfdSAndroid Build Coastguard Worker		unsigned long r8;
185*387f9dfdSAndroid Build Coastguard Worker		unsigned long ax;
186*387f9dfdSAndroid Build Coastguard Worker		unsigned long cx;
187*387f9dfdSAndroid Build Coastguard Worker		unsigned long dx;
188*387f9dfdSAndroid Build Coastguard Worker		unsigned long si;
189*387f9dfdSAndroid Build Coastguard Worker		unsigned long di;
190*387f9dfdSAndroid Build Coastguard Worker		unsigned long orig_ax;
191*387f9dfdSAndroid Build Coastguard Worker		unsigned long ip;
192*387f9dfdSAndroid Build Coastguard Worker		unsigned long cs;
193*387f9dfdSAndroid Build Coastguard Worker		unsigned long flags;
194*387f9dfdSAndroid Build Coastguard Worker		unsigned long sp;
195*387f9dfdSAndroid Build Coastguard Worker		unsigned long ss;
196*387f9dfdSAndroid Build Coastguard Worker	};]]
197*387f9dfdSAndroid Build Coastguard Worker	parm_to_reg = {parm1='di', parm2='si', parm3='dx', parm4='cx', parm5='r8', ret='sp', fp='bp'}
198*387f9dfdSAndroid Build Coastguard Workerelse
199*387f9dfdSAndroid Build Coastguard Worker	ffi.cdef 'struct pt_regs {};'
200*387f9dfdSAndroid Build Coastguard Workerend
201*387f9dfdSAndroid Build Coastguard Worker-- Map symbolic registers to architecture ABI
202*387f9dfdSAndroid Build Coastguard Workerffi.metatype('struct pt_regs', {
203*387f9dfdSAndroid Build Coastguard Worker		__index = function (_ --[[t]],k)
204*387f9dfdSAndroid Build Coastguard Worker			return assert(parm_to_reg[k], 'no such register: '..k)
205*387f9dfdSAndroid Build Coastguard Worker		end,
206*387f9dfdSAndroid Build Coastguard Worker})
207*387f9dfdSAndroid Build Coastguard Worker
208*387f9dfdSAndroid Build Coastguard Workerlocal M = {}
209*387f9dfdSAndroid Build Coastguard Worker
210*387f9dfdSAndroid Build Coastguard Worker-- Dissector interface
211*387f9dfdSAndroid Build Coastguard Workerlocal function dissector(type, e, dst, src, field)
212*387f9dfdSAndroid Build Coastguard Worker	local parent = e.V[src].const
213*387f9dfdSAndroid Build Coastguard Worker	-- Create new dissector variable
214*387f9dfdSAndroid Build Coastguard Worker	e.vcopy(dst, src)
215*387f9dfdSAndroid Build Coastguard Worker	-- Compute and materialize new dissector offset from parent
216*387f9dfdSAndroid Build Coastguard Worker	e.V[dst].const = {off=e.V[src].const.off, __dissector=e.V[src].const.__dissector}
217*387f9dfdSAndroid Build Coastguard Worker	parent.__dissector[field](e, dst)
218*387f9dfdSAndroid Build Coastguard Worker	e.V[dst].const.__dissector = type
219*387f9dfdSAndroid Build Coastguard Workerend
220*387f9dfdSAndroid Build Coastguard WorkerM.dissector = dissector
221*387f9dfdSAndroid Build Coastguard Worker
222*387f9dfdSAndroid Build Coastguard Worker-- Get current effective offset, load field value at an offset relative to it and
223*387f9dfdSAndroid Build Coastguard Worker-- add its value to compute next effective offset (e.g. udp_off = ip_off + pkt[ip_off].hlen)
224*387f9dfdSAndroid Build Coastguard Workerlocal function next_offset(e, var, type, off, mask, shift)
225*387f9dfdSAndroid Build Coastguard Worker	local d = e.V[var].const
226*387f9dfdSAndroid Build Coastguard Worker	-- Materialize relative offset value in R0
227*387f9dfdSAndroid Build Coastguard Worker	local dst_reg, tmp_reg
228*387f9dfdSAndroid Build Coastguard Worker	if d.off then
229*387f9dfdSAndroid Build Coastguard Worker		dst_reg = e.vreg(var, 0, true)
230*387f9dfdSAndroid Build Coastguard Worker		tmp_reg = dst_reg -- Use target register to avoid copy
231*387f9dfdSAndroid Build Coastguard Worker		e.emit(BPF.LD + BPF.ABS + e.const_width[ffi.sizeof(type)], tmp_reg, 0, 0, d.off + off or 0)
232*387f9dfdSAndroid Build Coastguard Worker	else
233*387f9dfdSAndroid Build Coastguard Worker		tmp_reg = e.vreg(e.tmpvar, 0, true, type) -- Reserve R0 for temporary relative offset
234*387f9dfdSAndroid Build Coastguard Worker		dst_reg = e.vreg(var) -- Must rematerialize (if it was spilled by tmp var)
235*387f9dfdSAndroid Build Coastguard Worker		e.emit(BPF.LD + BPF.IND + e.const_width[ffi.sizeof(type)], tmp_reg, dst_reg, 0, off or 0)
236*387f9dfdSAndroid Build Coastguard Worker	end
237*387f9dfdSAndroid Build Coastguard Worker	-- Finalize relative offset
238*387f9dfdSAndroid Build Coastguard Worker	if mask then
239*387f9dfdSAndroid Build Coastguard Worker		e.emit(BPF.ALU + BPF.AND + BPF.K, tmp_reg, 0, 0, mask)
240*387f9dfdSAndroid Build Coastguard Worker	end
241*387f9dfdSAndroid Build Coastguard Worker	if shift and shift ~= 0 then
242*387f9dfdSAndroid Build Coastguard Worker		local op = BPF.LSH
243*387f9dfdSAndroid Build Coastguard Worker		if shift < 0 then
244*387f9dfdSAndroid Build Coastguard Worker			op = BPF.RSH
245*387f9dfdSAndroid Build Coastguard Worker			shift = -shift
246*387f9dfdSAndroid Build Coastguard Worker		end
247*387f9dfdSAndroid Build Coastguard Worker		e.emit(BPF.ALU + op + BPF.K, tmp_reg, 0, 0, shift)
248*387f9dfdSAndroid Build Coastguard Worker	end
249*387f9dfdSAndroid Build Coastguard Worker	-- Add to base offset to turn it into effective address
250*387f9dfdSAndroid Build Coastguard Worker	if dst_reg ~= tmp_reg then
251*387f9dfdSAndroid Build Coastguard Worker		e.emit(BPF.ALU + BPF.ADD + BPF.X, dst_reg, tmp_reg, 0, 0)
252*387f9dfdSAndroid Build Coastguard Worker	else
253*387f9dfdSAndroid Build Coastguard Worker		e.emit(BPF.ALU + BPF.ADD + BPF.K, dst_reg, 0, 0, d.off)
254*387f9dfdSAndroid Build Coastguard Worker	end
255*387f9dfdSAndroid Build Coastguard Worker	-- Discard temporary allocations
256*387f9dfdSAndroid Build Coastguard Worker	d.off = nil
257*387f9dfdSAndroid Build Coastguard Worker	e.V[e.tmpvar].reg = nil
258*387f9dfdSAndroid Build Coastguard Workerend
259*387f9dfdSAndroid Build Coastguard Worker
260*387f9dfdSAndroid Build Coastguard Workerlocal function next_skip(e, var, off)
261*387f9dfdSAndroid Build Coastguard Worker	local d = e.V[var].const
262*387f9dfdSAndroid Build Coastguard Worker	if not d.off then
263*387f9dfdSAndroid Build Coastguard Worker		local dst_reg = e.vreg(var)
264*387f9dfdSAndroid Build Coastguard Worker		e.emit(BPF.ALU64 + BPF.ADD + BPF.K, dst_reg, 0, 0, off)
265*387f9dfdSAndroid Build Coastguard Worker	else
266*387f9dfdSAndroid Build Coastguard Worker		d.off = d.off + off
267*387f9dfdSAndroid Build Coastguard Worker	end
268*387f9dfdSAndroid Build Coastguard Workerend
269*387f9dfdSAndroid Build Coastguard Worker
270*387f9dfdSAndroid Build Coastguard Workerlocal function skip_eth(e, dst)
271*387f9dfdSAndroid Build Coastguard Worker	-- IP starts right after ETH header (fixed size)
272*387f9dfdSAndroid Build Coastguard Worker	local d = e.V[dst].const
273*387f9dfdSAndroid Build Coastguard Worker	d.off = d.off + ffi.sizeof('struct eth_t')
274*387f9dfdSAndroid Build Coastguard Workerend
275*387f9dfdSAndroid Build Coastguard Worker
276*387f9dfdSAndroid Build Coastguard Worker-- Export types
277*387f9dfdSAndroid Build Coastguard WorkerM.type = function(typestr, t)
278*387f9dfdSAndroid Build Coastguard Worker	t = t or {}
279*387f9dfdSAndroid Build Coastguard Worker	t.__dissector=ffi.typeof(typestr)
280*387f9dfdSAndroid Build Coastguard Worker	return t
281*387f9dfdSAndroid Build Coastguard Workerend
282*387f9dfdSAndroid Build Coastguard WorkerM.skb     = M.type('struct sk_buff', {source='ptr_to_ctx'})
283*387f9dfdSAndroid Build Coastguard WorkerM.pt_regs = M.type('struct pt_regs', {source='ptr_to_probe'})
284*387f9dfdSAndroid Build Coastguard WorkerM.pkt     = M.type('struct eth_t',   {off=0, source='ptr_to_pkt'}) -- skb needs special accessors
285*387f9dfdSAndroid Build Coastguard Worker-- M.eth     = function (...) return dissector(ffi.typeof('struct eth_t'), ...) end
286*387f9dfdSAndroid Build Coastguard WorkerM.dot1q   = function (...) return dissector(ffi.typeof('struct dot1q_t'), ...) end
287*387f9dfdSAndroid Build Coastguard WorkerM.arp     = function (...) return dissector(ffi.typeof('struct arp_t'), ...) end
288*387f9dfdSAndroid Build Coastguard WorkerM.icmp    = function (...) return dissector(ffi.typeof('struct icmp_t'), ...) end
289*387f9dfdSAndroid Build Coastguard WorkerM.ip      = function (...) return dissector(ffi.typeof('struct ip_t'), ...) end
290*387f9dfdSAndroid Build Coastguard WorkerM.icmp6   = function (...) return dissector(ffi.typeof('struct icmp6_t'), ...) end
291*387f9dfdSAndroid Build Coastguard WorkerM.ip6     = function (...) return dissector(ffi.typeof('struct ip6_t'), ...) end
292*387f9dfdSAndroid Build Coastguard WorkerM.ip6_opt = function (...) return dissector(ffi.typeof('struct ip6_opt_t'), ...) end
293*387f9dfdSAndroid Build Coastguard WorkerM.udp     = function (...) return dissector(ffi.typeof('struct udp_t'), ...) end
294*387f9dfdSAndroid Build Coastguard WorkerM.tcp     = function (...) return dissector(ffi.typeof('struct tcp_t'), ...) end
295*387f9dfdSAndroid Build Coastguard WorkerM.vxlan   = function (...) return dissector(ffi.typeof('struct vxlan_t'), ...) end
296*387f9dfdSAndroid Build Coastguard WorkerM.data    = function (...) return dissector(ffi.typeof('uint8_t'), ...) end
297*387f9dfdSAndroid Build Coastguard WorkerM.net_off = function (...) return dissector(ffi.typeof('struct net_off_t'), ...) end
298*387f9dfdSAndroid Build Coastguard Worker
299*387f9dfdSAndroid Build Coastguard Worker-- Metatables
300*387f9dfdSAndroid Build Coastguard Workerffi.metatype(ffi.typeof('struct eth_t'), {
301*387f9dfdSAndroid Build Coastguard Worker	__index = {
302*387f9dfdSAndroid Build Coastguard Worker		ip = skip_eth,
303*387f9dfdSAndroid Build Coastguard Worker		ip6 = skip_eth,
304*387f9dfdSAndroid Build Coastguard Worker		net_off = function (e, dst)
305*387f9dfdSAndroid Build Coastguard Worker			next_skip(e, dst, BPF.NET_OFF)
306*387f9dfdSAndroid Build Coastguard Worker		end,
307*387f9dfdSAndroid Build Coastguard Worker	}
308*387f9dfdSAndroid Build Coastguard Worker})
309*387f9dfdSAndroid Build Coastguard Worker
310*387f9dfdSAndroid Build Coastguard Workerffi.metatype(ffi.typeof('struct net_off_t'), {
311*387f9dfdSAndroid Build Coastguard Worker	__index = {
312*387f9dfdSAndroid Build Coastguard Worker		ip = function () end,
313*387f9dfdSAndroid Build Coastguard Worker		ip6 = function () end,
314*387f9dfdSAndroid Build Coastguard Worker	}
315*387f9dfdSAndroid Build Coastguard Worker})
316*387f9dfdSAndroid Build Coastguard Worker
317*387f9dfdSAndroid Build Coastguard Workerffi.metatype(ffi.typeof('struct ip_t'), {
318*387f9dfdSAndroid Build Coastguard Worker	__index = {
319*387f9dfdSAndroid Build Coastguard Worker		-- Skip IP header length (stored as number of words)
320*387f9dfdSAndroid Build Coastguard Worker		-- e.g. hlen = 5, Header Length = 5 x sizeof(u32) = 20 octets
321*387f9dfdSAndroid Build Coastguard Worker		-- Mask first nibble and shift by 2 (multiplication by 4)
322*387f9dfdSAndroid Build Coastguard Worker		icmp = function(e, dst) next_offset(e, dst, ffi.typeof('uint8_t'), 0, 0x0f, 2) end,
323*387f9dfdSAndroid Build Coastguard Worker		udp  = function(e, dst) next_offset(e, dst, ffi.typeof('uint8_t'), 0, 0x0f, 2) end,
324*387f9dfdSAndroid Build Coastguard Worker		tcp  = function(e, dst) next_offset(e, dst, ffi.typeof('uint8_t'), 0, 0x0f, 2) end,
325*387f9dfdSAndroid Build Coastguard Worker	}
326*387f9dfdSAndroid Build Coastguard Worker})
327*387f9dfdSAndroid Build Coastguard Worker
328*387f9dfdSAndroid Build Coastguard Workerffi.metatype(ffi.typeof('struct ip6_t'), {
329*387f9dfdSAndroid Build Coastguard Worker	__index = {
330*387f9dfdSAndroid Build Coastguard Worker		-- Skip fixed IPv6 header length (40 bytes)
331*387f9dfdSAndroid Build Coastguard Worker		-- The caller must check the value of `next_header` to skip any extension headers
332*387f9dfdSAndroid Build Coastguard Worker		icmp6 = function(e, dst) next_skip(e, dst, ffi.sizeof('struct ip6_t'), 0) end,
333*387f9dfdSAndroid Build Coastguard Worker		udp  = function(e, dst) next_skip(e, dst, ffi.sizeof('struct ip6_t'), 0) end,
334*387f9dfdSAndroid Build Coastguard Worker		tcp  = function(e, dst) next_skip(e, dst, ffi.sizeof('struct ip6_t'), 0) end,
335*387f9dfdSAndroid Build Coastguard Worker		ip6_opt = function(e, dst) next_skip(e, dst, ffi.sizeof('struct ip6_t'), 0) end,
336*387f9dfdSAndroid Build Coastguard Worker	}
337*387f9dfdSAndroid Build Coastguard Worker})
338*387f9dfdSAndroid Build Coastguard Worker
339*387f9dfdSAndroid Build Coastguard Workerlocal ip6_opt_ext_len_off = ffi.offsetof('struct ip6_opt_t', 'ext_len')
340*387f9dfdSAndroid Build Coastguard Workerffi.metatype(ffi.typeof('struct ip6_opt_t'), {
341*387f9dfdSAndroid Build Coastguard Worker	__index = {
342*387f9dfdSAndroid Build Coastguard Worker		-- Skip IPv6 extension header length (field `ext_len`)
343*387f9dfdSAndroid Build Coastguard Worker		icmp6 = function(e, dst) next_offset(e, dst, ffi.typeof('uint8_t'), ip6_opt_ext_len_off) end,
344*387f9dfdSAndroid Build Coastguard Worker		udp  = function(e, dst) next_offset(e, dst, ffi.typeof('uint8_t'), ip6_opt_ext_len_off) end,
345*387f9dfdSAndroid Build Coastguard Worker		tcp  = function(e, dst) next_offset(e, dst, ffi.typeof('uint8_t'), ip6_opt_ext_len_off) end,
346*387f9dfdSAndroid Build Coastguard Worker		ip6_opt = function(e, dst) next_offset(e, dst, ffi.typeof('uint8_t'), ip6_opt_ext_len_off) end,
347*387f9dfdSAndroid Build Coastguard Worker	}
348*387f9dfdSAndroid Build Coastguard Worker})
349*387f9dfdSAndroid Build Coastguard Worker
350*387f9dfdSAndroid Build Coastguard Workerffi.metatype(ffi.typeof('struct tcp_t'), {
351*387f9dfdSAndroid Build Coastguard Worker	__index = {
352*387f9dfdSAndroid Build Coastguard Worker		-- Skip TCP header length (stored as number of words)
353*387f9dfdSAndroid Build Coastguard Worker		-- e.g. hlen = 5, Header Length = 5 x sizeof(u32) = 20 octets
354*387f9dfdSAndroid Build Coastguard Worker		data = function(e, dst)
355*387f9dfdSAndroid Build Coastguard Worker			next_offset(e, dst, ffi.typeof('uint8_t'), ffi.offsetof('struct tcp_t', 'offset'), 0xf0, -2)
356*387f9dfdSAndroid Build Coastguard Worker		end,
357*387f9dfdSAndroid Build Coastguard Worker	}
358*387f9dfdSAndroid Build Coastguard Worker})
359*387f9dfdSAndroid Build Coastguard Worker
360*387f9dfdSAndroid Build Coastguard Workerffi.metatype(ffi.typeof('struct udp_t'), {
361*387f9dfdSAndroid Build Coastguard Worker	__index = {
362*387f9dfdSAndroid Build Coastguard Worker		-- Skip UDP header length (8 octets)
363*387f9dfdSAndroid Build Coastguard Worker		data = function(e, dst)
364*387f9dfdSAndroid Build Coastguard Worker			next_skip(e, dst, ffi.sizeof('struct udp_t'))
365*387f9dfdSAndroid Build Coastguard Worker		end,
366*387f9dfdSAndroid Build Coastguard Worker	}
367*387f9dfdSAndroid Build Coastguard Worker})
368*387f9dfdSAndroid Build Coastguard Worker
369*387f9dfdSAndroid Build Coastguard Worker-- Constants
370*387f9dfdSAndroid Build Coastguard WorkerM.c = {
371*387f9dfdSAndroid Build Coastguard Worker	eth = { -- Constants http://standards.ieee.org/regauth/ethertype
372*387f9dfdSAndroid Build Coastguard Worker		ip     = 0x0800, -- IP (v4) protocol
373*387f9dfdSAndroid Build Coastguard Worker		ip6    = 0x86dd, -- IP (v6) protocol
374*387f9dfdSAndroid Build Coastguard Worker		arp    = 0x0806, -- Address resolution protocol
375*387f9dfdSAndroid Build Coastguard Worker		revarp = 0x8035, -- Reverse addr resolution protocol
376*387f9dfdSAndroid Build Coastguard Worker		vlan   = 0x8100, -- IEEE 802.1Q VLAN tagging
377*387f9dfdSAndroid Build Coastguard Worker	},
378*387f9dfdSAndroid Build Coastguard Worker	ip = {
379*387f9dfdSAndroid Build Coastguard Worker		-- Reserved Addresses
380*387f9dfdSAndroid Build Coastguard Worker		addr_any         = 0x00000000, -- 0.0.0.0
381*387f9dfdSAndroid Build Coastguard Worker		addr_broadcast   = 0xffffffff, -- 255.255.255.255
382*387f9dfdSAndroid Build Coastguard Worker		addr_loopback    = 0x7f000001, -- 127.0.0.1
383*387f9dfdSAndroid Build Coastguard Worker		addr_mcast_all   = 0xe0000001, -- 224.0.0.1
384*387f9dfdSAndroid Build Coastguard Worker		addr_mcast_local = 0xe00000ff, -- 224.0.0.255
385*387f9dfdSAndroid Build Coastguard Worker		-- Type of service (ip_tos), RFC 1349 ("obsoleted by RFC 2474")
386*387f9dfdSAndroid Build Coastguard Worker		tos_default      = 0x00, -- default
387*387f9dfdSAndroid Build Coastguard Worker		tos_lowdelay     = 0x10, -- low delay
388*387f9dfdSAndroid Build Coastguard Worker		tos_throughput   = 0x08, -- high throughput
389*387f9dfdSAndroid Build Coastguard Worker		tos_reliability  = 0x04, -- high reliability
390*387f9dfdSAndroid Build Coastguard Worker		tos_lowcost      = 0x02, -- low monetary cost - XXX
391*387f9dfdSAndroid Build Coastguard Worker		tos_ect          = 0x02, -- ECN-capable transport
392*387f9dfdSAndroid Build Coastguard Worker		tos_ce           = 0x01, -- congestion experienced
393*387f9dfdSAndroid Build Coastguard Worker		-- Fragmentation flags (ip_off)
394*387f9dfdSAndroid Build Coastguard Worker		rf = 0x8000, -- reserved
395*387f9dfdSAndroid Build Coastguard Worker		df = 0x4000, -- don't fragment
396*387f9dfdSAndroid Build Coastguard Worker		mf = 0x2000, -- more fragments (not last frag)
397*387f9dfdSAndroid Build Coastguard Worker		offmask  = 0x1fff, -- mask for fragment offset
398*387f9dfdSAndroid Build Coastguard Worker		-- Time-to-live (ip_ttl), seconds
399*387f9dfdSAndroid Build Coastguard Worker		ttl_default = 64,  -- default ttl, RFC 1122, RFC 1340
400*387f9dfdSAndroid Build Coastguard Worker		ttl_max     = 255, -- maximum ttl
401*387f9dfdSAndroid Build Coastguard Worker		-- Protocol (ip_p) - http://www.iana.org/assignments/protocol-numbers
402*387f9dfdSAndroid Build Coastguard Worker		proto_ip      = 0,  -- dummy for IP
403*387f9dfdSAndroid Build Coastguard Worker		proto_hopopts = 0,  -- IPv6 hop-by-hop options
404*387f9dfdSAndroid Build Coastguard Worker		proto_icmp    = 1,  -- ICMP
405*387f9dfdSAndroid Build Coastguard Worker		proto_igmp    = 2,  -- IGMP
406*387f9dfdSAndroid Build Coastguard Worker		proto_ggp     = 3,  -- gateway-gateway protocol
407*387f9dfdSAndroid Build Coastguard Worker		proto_ipip    = 4,  -- IP in IP
408*387f9dfdSAndroid Build Coastguard Worker		proto_st      = 5,  -- ST datagram mode
409*387f9dfdSAndroid Build Coastguard Worker		proto_tcp     = 6,  -- TCP
410*387f9dfdSAndroid Build Coastguard Worker		proto_cbt     = 7,  -- CBT
411*387f9dfdSAndroid Build Coastguard Worker		proto_egp     = 8,  -- exterior gateway protocol
412*387f9dfdSAndroid Build Coastguard Worker		proto_igp     = 9,  -- interior gateway protocol
413*387f9dfdSAndroid Build Coastguard Worker		proto_bbnrcc  = 10,  -- BBN RCC monitoring
414*387f9dfdSAndroid Build Coastguard Worker		proto_nvp     = 11,  -- Network Voice Protocol
415*387f9dfdSAndroid Build Coastguard Worker		proto_pup     = 12,  -- PARC universal packet
416*387f9dfdSAndroid Build Coastguard Worker		proto_argus   = 13,  -- ARGUS
417*387f9dfdSAndroid Build Coastguard Worker		proto_emcon   = 14,  -- EMCON
418*387f9dfdSAndroid Build Coastguard Worker		proto_xnet    = 15,  -- Cross Net Debugger
419*387f9dfdSAndroid Build Coastguard Worker		proto_chaos   = 16,  -- Chaos
420*387f9dfdSAndroid Build Coastguard Worker		proto_udp     = 17,  -- UDP
421*387f9dfdSAndroid Build Coastguard Worker		proto_mux     = 18,  -- multiplexing
422*387f9dfdSAndroid Build Coastguard Worker		proto_dcnmeas = 19,  -- DCN measurement
423*387f9dfdSAndroid Build Coastguard Worker		proto_hmp     = 20,  -- Host Monitoring Protocol
424*387f9dfdSAndroid Build Coastguard Worker		proto_prm     = 21,  -- Packet Radio Measurement
425*387f9dfdSAndroid Build Coastguard Worker		proto_idp     = 22,  -- Xerox NS IDP
426*387f9dfdSAndroid Build Coastguard Worker		proto_trunk1  = 23,  -- Trunk-1
427*387f9dfdSAndroid Build Coastguard Worker		proto_trunk2  = 24,  -- Trunk-2
428*387f9dfdSAndroid Build Coastguard Worker		proto_leaf1   = 25,  -- Leaf-1
429*387f9dfdSAndroid Build Coastguard Worker		proto_leaf2   = 26,  -- Leaf-2
430*387f9dfdSAndroid Build Coastguard Worker		proto_rdp     = 27,  -- "Reliable Datagram" proto
431*387f9dfdSAndroid Build Coastguard Worker		proto_irtp    = 28,  -- Inet Reliable Transaction
432*387f9dfdSAndroid Build Coastguard Worker		proto_tp      = 29,  -- ISO TP class 4
433*387f9dfdSAndroid Build Coastguard Worker		proto_netblt  = 30,  -- Bulk Data Transfer
434*387f9dfdSAndroid Build Coastguard Worker		proto_mfpnsp  = 31,  -- MFE Network Services
435*387f9dfdSAndroid Build Coastguard Worker		proto_meritinp= 32,  -- Merit Internodal Protocol
436*387f9dfdSAndroid Build Coastguard Worker		proto_sep     = 33,  -- Sequential Exchange proto
437*387f9dfdSAndroid Build Coastguard Worker		proto_3pc     = 34,  -- Third Party Connect proto
438*387f9dfdSAndroid Build Coastguard Worker		proto_idpr    = 35,  -- Interdomain Policy Route
439*387f9dfdSAndroid Build Coastguard Worker		proto_xtp     = 36,  -- Xpress Transfer Protocol
440*387f9dfdSAndroid Build Coastguard Worker		proto_ddp     = 37,  -- Datagram Delivery Proto
441*387f9dfdSAndroid Build Coastguard Worker		proto_cmtp    = 38,  -- IDPR Ctrl Message Trans
442*387f9dfdSAndroid Build Coastguard Worker		proto_tppp    = 39,  -- TP++ Transport Protocol
443*387f9dfdSAndroid Build Coastguard Worker		proto_il      = 40,  -- IL Transport Protocol
444*387f9dfdSAndroid Build Coastguard Worker		proto_ip6     = 41,  -- IPv6
445*387f9dfdSAndroid Build Coastguard Worker		proto_sdrp    = 42,  -- Source Demand Routing
446*387f9dfdSAndroid Build Coastguard Worker		proto_routing = 43,  -- IPv6 routing header
447*387f9dfdSAndroid Build Coastguard Worker		proto_fragment= 44,  -- IPv6 fragmentation header
448*387f9dfdSAndroid Build Coastguard Worker		proto_rsvp    = 46,  -- Reservation protocol
449*387f9dfdSAndroid Build Coastguard Worker		proto_gre     = 47,  -- General Routing Encap
450*387f9dfdSAndroid Build Coastguard Worker		proto_mhrp    = 48,  -- Mobile Host Routing
451*387f9dfdSAndroid Build Coastguard Worker		proto_ena     = 49,  -- ENA
452*387f9dfdSAndroid Build Coastguard Worker		proto_esp     = 50,  -- Encap Security Payload
453*387f9dfdSAndroid Build Coastguard Worker		proto_ah      = 51,  -- Authentication Header
454*387f9dfdSAndroid Build Coastguard Worker		proto_inlsp   = 52,  -- Integated Net Layer Sec
455*387f9dfdSAndroid Build Coastguard Worker		proto_swipe   = 53,  -- SWIPE
456*387f9dfdSAndroid Build Coastguard Worker		proto_narp    = 54,  -- NBMA Address Resolution
457*387f9dfdSAndroid Build Coastguard Worker		proto_mobile  = 55,  -- Mobile IP, RFC 2004
458*387f9dfdSAndroid Build Coastguard Worker		proto_tlsp    = 56,  -- Transport Layer Security
459*387f9dfdSAndroid Build Coastguard Worker		proto_skip    = 57,  -- SKIP
460*387f9dfdSAndroid Build Coastguard Worker		proto_icmp6   = 58,  -- ICMP for IPv6
461*387f9dfdSAndroid Build Coastguard Worker		proto_none    = 59,  -- IPv6 no next header
462*387f9dfdSAndroid Build Coastguard Worker		proto_dstopts = 60,  -- IPv6 destination options
463*387f9dfdSAndroid Build Coastguard Worker		proto_anyhost = 61,  -- any host internal proto
464*387f9dfdSAndroid Build Coastguard Worker		proto_cftp    = 62,  -- CFTP
465*387f9dfdSAndroid Build Coastguard Worker		proto_anynet  = 63,  -- any local network
466*387f9dfdSAndroid Build Coastguard Worker		proto_expak   = 64,  -- SATNET and Backroom EXPAK
467*387f9dfdSAndroid Build Coastguard Worker		proto_kryptolan = 65,  -- Kryptolan
468*387f9dfdSAndroid Build Coastguard Worker		proto_rvd     = 66,  -- MIT Remote Virtual Disk
469*387f9dfdSAndroid Build Coastguard Worker		proto_ippc    = 67,  -- Inet Pluribus Packet Core
470*387f9dfdSAndroid Build Coastguard Worker		proto_distfs  = 68,  -- any distributed fs
471*387f9dfdSAndroid Build Coastguard Worker		proto_satmon  = 69,  -- SATNET Monitoring
472*387f9dfdSAndroid Build Coastguard Worker		proto_visa    = 70,  -- VISA Protocol
473*387f9dfdSAndroid Build Coastguard Worker		proto_ipcv    = 71,  -- Inet Packet Core Utility
474*387f9dfdSAndroid Build Coastguard Worker		proto_cpnx    = 72,  -- Comp Proto Net Executive
475*387f9dfdSAndroid Build Coastguard Worker		proto_cphb    = 73,  -- Comp Protocol Heart Beat
476*387f9dfdSAndroid Build Coastguard Worker		proto_wsn     = 74,  -- Wang Span Network
477*387f9dfdSAndroid Build Coastguard Worker		proto_pvp     = 75,  -- Packet Video Protocol
478*387f9dfdSAndroid Build Coastguard Worker		proto_brsatmon= 76,  -- Backroom SATNET Monitor
479*387f9dfdSAndroid Build Coastguard Worker		proto_sunnd   = 77,  -- SUN ND Protocol
480*387f9dfdSAndroid Build Coastguard Worker		proto_wbmon   = 78,  -- WIDEBAND Monitoring
481*387f9dfdSAndroid Build Coastguard Worker		proto_wbexpak = 79,  -- WIDEBAND EXPAK
482*387f9dfdSAndroid Build Coastguard Worker		proto_eon     = 80,  -- ISO CNLP
483*387f9dfdSAndroid Build Coastguard Worker		proto_vmtp    = 81,  -- Versatile Msg Transport
484*387f9dfdSAndroid Build Coastguard Worker		proto_svmtp   = 82,  -- Secure VMTP
485*387f9dfdSAndroid Build Coastguard Worker		proto_vines   = 83,  -- VINES
486*387f9dfdSAndroid Build Coastguard Worker		proto_ttp     = 84,  -- TTP
487*387f9dfdSAndroid Build Coastguard Worker		proto_nsfigp  = 85,  -- NSFNET-IGP
488*387f9dfdSAndroid Build Coastguard Worker		proto_dgp     = 86,  -- Dissimilar Gateway Proto
489*387f9dfdSAndroid Build Coastguard Worker		proto_tcf     = 87,  -- TCF
490*387f9dfdSAndroid Build Coastguard Worker		proto_eigrp   = 88,  -- EIGRP
491*387f9dfdSAndroid Build Coastguard Worker		proto_ospf    = 89,  -- Open Shortest Path First
492*387f9dfdSAndroid Build Coastguard Worker		proto_spriterpc= 90,  -- Sprite RPC Protocol
493*387f9dfdSAndroid Build Coastguard Worker		proto_larp    = 91,  -- Locus Address Resolution
494*387f9dfdSAndroid Build Coastguard Worker		proto_mtp     = 92,  -- Multicast Transport Proto
495*387f9dfdSAndroid Build Coastguard Worker		proto_ax25    = 93,  -- AX.25 Frames
496*387f9dfdSAndroid Build Coastguard Worker		proto_ipipencap= 94,  -- yet-another IP encap
497*387f9dfdSAndroid Build Coastguard Worker		proto_micp    = 95,  -- Mobile Internet Ctrl
498*387f9dfdSAndroid Build Coastguard Worker		proto_sccsp   = 96,  -- Semaphore Comm Sec Proto
499*387f9dfdSAndroid Build Coastguard Worker		proto_etherip = 97,  -- Ethernet in IPv4
500*387f9dfdSAndroid Build Coastguard Worker		proto_encap   = 98,  -- encapsulation header
501*387f9dfdSAndroid Build Coastguard Worker		proto_anyenc  = 99,  -- private encryption scheme
502*387f9dfdSAndroid Build Coastguard Worker		proto_gmtp    = 100,  -- GMTP
503*387f9dfdSAndroid Build Coastguard Worker		proto_ifmp    = 101,  -- Ipsilon Flow Mgmt Proto
504*387f9dfdSAndroid Build Coastguard Worker		proto_pnni    = 102,  -- PNNI over IP
505*387f9dfdSAndroid Build Coastguard Worker		proto_pim     = 103,  -- Protocol Indep Multicast
506*387f9dfdSAndroid Build Coastguard Worker		proto_aris    = 104,  -- ARIS
507*387f9dfdSAndroid Build Coastguard Worker		proto_scps    = 105,  -- SCPS
508*387f9dfdSAndroid Build Coastguard Worker		proto_qnx     = 106,  -- QNX
509*387f9dfdSAndroid Build Coastguard Worker		proto_an      = 107,  -- Active Networks
510*387f9dfdSAndroid Build Coastguard Worker		proto_ipcomp  = 108,  -- IP Payload Compression
511*387f9dfdSAndroid Build Coastguard Worker		proto_snp     = 109,  -- Sitara Networks Protocol
512*387f9dfdSAndroid Build Coastguard Worker		proto_compaqpeer= 110,  -- Compaq Peer Protocol
513*387f9dfdSAndroid Build Coastguard Worker		proto_ipxip   = 111,  -- IPX in IP
514*387f9dfdSAndroid Build Coastguard Worker		proto_vrrp    = 112,  -- Virtual Router Redundancy
515*387f9dfdSAndroid Build Coastguard Worker		proto_pgm     = 113,  -- PGM Reliable Transport
516*387f9dfdSAndroid Build Coastguard Worker		proto_any0hop = 114,  -- 0-hop protocol
517*387f9dfdSAndroid Build Coastguard Worker		proto_l2tp    = 115,  -- Layer 2 Tunneling Proto
518*387f9dfdSAndroid Build Coastguard Worker		proto_ddx     = 116,  -- D-II Data Exchange (DDX)
519*387f9dfdSAndroid Build Coastguard Worker		proto_iatp    = 117,  -- Interactive Agent Xfer
520*387f9dfdSAndroid Build Coastguard Worker		proto_stp     = 118,  -- Schedule Transfer Proto
521*387f9dfdSAndroid Build Coastguard Worker		proto_srp     = 119,  -- SpectraLink Radio Proto
522*387f9dfdSAndroid Build Coastguard Worker		proto_uti     = 120,  -- UTI
523*387f9dfdSAndroid Build Coastguard Worker		proto_smp     = 121,  -- Simple Message Protocol
524*387f9dfdSAndroid Build Coastguard Worker		proto_sm      = 122,  -- SM
525*387f9dfdSAndroid Build Coastguard Worker		proto_ptp     = 123,  -- Performance Transparency
526*387f9dfdSAndroid Build Coastguard Worker		proto_isis    = 124,  -- ISIS over IPv4
527*387f9dfdSAndroid Build Coastguard Worker		proto_fire    = 125,  -- FIRE
528*387f9dfdSAndroid Build Coastguard Worker		proto_crtp    = 126,  -- Combat Radio Transport
529*387f9dfdSAndroid Build Coastguard Worker		proto_crudp   = 127,  -- Combat Radio UDP
530*387f9dfdSAndroid Build Coastguard Worker		proto_sscopmce= 128,  -- SSCOPMCE
531*387f9dfdSAndroid Build Coastguard Worker		proto_iplt    = 129,  -- IPLT
532*387f9dfdSAndroid Build Coastguard Worker		proto_sps     = 130,  -- Secure Packet Shield
533*387f9dfdSAndroid Build Coastguard Worker		proto_pipe    = 131,  -- Private IP Encap in IP
534*387f9dfdSAndroid Build Coastguard Worker		proto_sctp    = 132,  -- Stream Ctrl Transmission
535*387f9dfdSAndroid Build Coastguard Worker		proto_fc      = 133,  -- Fibre Channel
536*387f9dfdSAndroid Build Coastguard Worker		proto_rsvpign = 134,  -- RSVP-E2E-IGNORE
537*387f9dfdSAndroid Build Coastguard Worker		proto_raw     = 255,  -- Raw IP packets
538*387f9dfdSAndroid Build Coastguard Worker		proto_reserved= 255,  -- Reserved
539*387f9dfdSAndroid Build Coastguard Worker	},
540*387f9dfdSAndroid Build Coastguard Worker}
541*387f9dfdSAndroid Build Coastguard Worker
542*387f9dfdSAndroid Build Coastguard Workerreturn M