1*6fcfe96eSJiayuan Chen // SPDX-License-Identifier: GPL-2.0 2*6fcfe96eSJiayuan Chen #include <linux/bpf.h> 3*6fcfe96eSJiayuan Chen #include <bpf/bpf_helpers.h> 4*6fcfe96eSJiayuan Chen #include <bpf/bpf_endian.h> 5*6fcfe96eSJiayuan Chen int verdict_max_size = 10000; 6*6fcfe96eSJiayuan Chen struct { 7*6fcfe96eSJiayuan Chen __uint(type, BPF_MAP_TYPE_SOCKMAP); 8*6fcfe96eSJiayuan Chen __uint(max_entries, 20); 9*6fcfe96eSJiayuan Chen __type(key, int); 10*6fcfe96eSJiayuan Chen __type(value, int); 11*6fcfe96eSJiayuan Chen } sock_map SEC(".maps"); 12*6fcfe96eSJiayuan Chen 13*6fcfe96eSJiayuan Chen SEC("sk_skb/stream_verdict") prog_skb_verdict(struct __sk_buff * skb)14*6fcfe96eSJiayuan Chenint prog_skb_verdict(struct __sk_buff *skb) 15*6fcfe96eSJiayuan Chen { 16*6fcfe96eSJiayuan Chen __u32 one = 1; 17*6fcfe96eSJiayuan Chen 18*6fcfe96eSJiayuan Chen if (skb->len > verdict_max_size) 19*6fcfe96eSJiayuan Chen return SK_PASS; 20*6fcfe96eSJiayuan Chen 21*6fcfe96eSJiayuan Chen return bpf_sk_redirect_map(skb, &sock_map, one, 0); 22*6fcfe96eSJiayuan Chen } 23*6fcfe96eSJiayuan Chen 24*6fcfe96eSJiayuan Chen SEC("sk_skb/stream_verdict") prog_skb_verdict_pass(struct __sk_buff * skb)25*6fcfe96eSJiayuan Chenint prog_skb_verdict_pass(struct __sk_buff *skb) 26*6fcfe96eSJiayuan Chen { 27*6fcfe96eSJiayuan Chen return SK_PASS; 28*6fcfe96eSJiayuan Chen } 29*6fcfe96eSJiayuan Chen 30*6fcfe96eSJiayuan Chen SEC("sk_skb/stream_parser") prog_skb_parser(struct __sk_buff * skb)31*6fcfe96eSJiayuan Chenint prog_skb_parser(struct __sk_buff *skb) 32*6fcfe96eSJiayuan Chen { 33*6fcfe96eSJiayuan Chen return skb->len; 34*6fcfe96eSJiayuan Chen } 35*6fcfe96eSJiayuan Chen 36*6fcfe96eSJiayuan Chen SEC("sk_skb/stream_parser") prog_skb_parser_partial(struct __sk_buff * skb)37*6fcfe96eSJiayuan Chenint prog_skb_parser_partial(struct __sk_buff *skb) 38*6fcfe96eSJiayuan Chen { 39*6fcfe96eSJiayuan Chen /* agreement with the test program on a 4-byte size header 40*6fcfe96eSJiayuan Chen * and 6-byte body. 41*6fcfe96eSJiayuan Chen */ 42*6fcfe96eSJiayuan Chen if (skb->len < 4) { 43*6fcfe96eSJiayuan Chen /* need more header to determine full length */ 44*6fcfe96eSJiayuan Chen return 0; 45*6fcfe96eSJiayuan Chen } 46*6fcfe96eSJiayuan Chen /* return full length decoded from header. 47*6fcfe96eSJiayuan Chen * the return value may be larger than skb->len which 48*6fcfe96eSJiayuan Chen * means framework must wait body coming. 49*6fcfe96eSJiayuan Chen */ 50*6fcfe96eSJiayuan Chen return 10; 51*6fcfe96eSJiayuan Chen } 52*6fcfe96eSJiayuan Chen 53*6fcfe96eSJiayuan Chen char _license[] SEC("license") = "GPL"; 54