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