@@ -49,42 +49,16 @@ struct ipv6_ph_part {
4949 __u8 nexthdr ;
5050} __attribute__((packed ));
5151
52- struct sk_buff * mimic_inspect_skb (struct __sk_buff * ) __ksym ;
53- int mimic_change_csum_offset (struct __sk_buff * , __u16 ) __ksym ;
52+ struct sk_buff * mimic_inspect_skb (struct __sk_buff * skb ) __ksym ;
53+ int mimic_change_csum_offset (struct __sk_buff * skb , __u16 protocol ) __ksym ;
5454
5555// clang-format off
5656#define QUARTET_DEF struct iphdr* ipv4, struct ipv6hdr* ipv6, struct udphdr* udp, struct tcphdr* tcp
5757#define QUARTET_UDP ipv4, ipv6, udp, NULL
5858#define QUARTET_TCP ipv4, ipv6, NULL, tcp
5959// clang-format on
6060
61- static inline bool matches_whitelist (QUARTET_DEF , bool ingress ) {
62- struct pkt_filter local = {.origin = ORIGIN_LOCAL }, remote = {.origin = ORIGIN_REMOTE };
63- if (udp ) {
64- local .port = udp -> source ;
65- remote .port = udp -> dest ;
66- } else if (tcp ) {
67- local .port = tcp -> source ;
68- remote .port = tcp -> dest ;
69- }
70- if (ipv4 ) {
71- local .protocol = remote .protocol = PROTO_IPV4 ;
72- local .ip .v4 = ipv4 -> saddr ;
73- remote .ip .v4 = ipv4 -> daddr ;
74- } else if (ipv6 ) {
75- local .protocol = remote .protocol = PROTO_IPV6 ;
76- local .ip .v6 = ipv6 -> saddr ;
77- remote .ip .v6 = ipv6 -> daddr ;
78- }
79- if (ingress ) {
80- struct pkt_filter t = local ;
81- local = remote ;
82- remote = t ;
83- local .origin = ORIGIN_LOCAL ;
84- remote .origin = ORIGIN_REMOTE ;
85- }
86- return bpf_map_lookup_elem (& mimic_whitelist , & local ) || bpf_map_lookup_elem (& mimic_whitelist , & remote );
87- }
61+ bool matches_whitelist (QUARTET_DEF , bool ingress );
8862
8963static inline struct conn_tuple gen_conn_key (QUARTET_DEF , bool ingress ) {
9064 struct conn_tuple key = {};
@@ -115,62 +89,42 @@ static inline struct conn_tuple gen_conn_key(QUARTET_DEF, bool ingress) {
11589 return key ;
11690}
11791
118- static inline struct connection * get_conn (struct conn_tuple * conn_key ) {
119- struct connection * conn = bpf_map_lookup_elem (& mimic_conns , conn_key );
92+ static inline struct connection * get_conn (struct conn_tuple * key ) {
93+ struct connection * conn = bpf_map_lookup_elem (& mimic_conns , key );
12094 if (!conn ) {
12195 struct connection conn_value = {};
122- if (bpf_map_update_elem (& mimic_conns , conn_key , & conn_value , BPF_ANY )) return NULL ;
123- conn = bpf_map_lookup_elem (& mimic_conns , conn_key );
96+ if (bpf_map_update_elem (& mimic_conns , key , & conn_value , BPF_ANY )) return NULL ;
97+ conn = bpf_map_lookup_elem (& mimic_conns , key );
12498 if (!conn ) return NULL ;
12599 }
126100 return conn ;
127101}
128102
129- static inline void log_any (__u32 log_verbosity , enum log_level level , bool ingress , enum log_type type ,
130- union log_info info ) {
131- if (log_verbosity < level ) return ;
132- struct rb_item * item = bpf_ringbuf_reserve (& mimic_rb , sizeof (* item ), 0 );
133- if (!item ) return ;
134- item -> type = RB_ITEM_LOG_EVENT ;
135- item -> log_event .level = level ;
136- item -> log_event .type = type ;
137- item -> log_event .ingress = ingress ;
138- item -> log_event .info = info ;
139- bpf_ringbuf_submit (item , 0 );
140- }
103+ int log_any (__u32 log_verbosity , enum log_level level , bool ingress , enum log_type type , union log_info * info );
141104
142- static inline void log_quartet (__u32 log_verbosity , enum log_level level , bool ingress , enum log_type type ,
143- struct conn_tuple quartet ) {
144- log_any (log_verbosity , level , ingress , type , (union log_info ){.quartet = quartet });
105+ static inline int log_conn (__u32 log_verbosity , enum log_level level , bool ingress , enum log_type type ,
106+ struct conn_tuple * conn ) {
107+ if (!conn ) return -1 ;
108+ return log_any (log_verbosity , level , ingress , type , & (union log_info ){.conn = * conn });
145109}
146110
147- static __always_inline void log_tcp (__u32 log_verbosity , enum log_level level , bool ingress , enum log_type type ,
148- enum conn_state state , __u32 seq , __u32 ack_seq ) {
149- log_any (log_verbosity , level , ingress , type ,
150- (union log_info ){.tcp = {.state = state , .seq = seq , .ack_seq = ack_seq }});
111+ static inline int log_tcp (__u32 log_verbosity , enum log_level level , bool ingress , enum log_type type ,
112+ enum conn_state state , __u32 seq , __u32 ack_seq ) {
113+ return log_any (log_verbosity , level , ingress , type ,
114+ & (union log_info ){.tcp = {.state = state , .seq = seq , .ack_seq = ack_seq }});
151115}
152116
153- static __always_inline void send_ctrl_packet (struct conn_tuple c , bool syn , bool ack , bool rst , __u32 seq ,
154- __u32 ack_seq ) {
155- struct rb_item * item = bpf_ringbuf_reserve (& mimic_rb , sizeof (* item ), 0 );
156- if (!item ) return ;
157- item -> type = RB_ITEM_SEND_OPTIONS ;
158- item -> send_options = (struct send_options ){
159- .c = c ,
160- .syn = syn ,
161- .ack = ack ,
162- .rst = rst ,
163- .seq = seq ,
164- .ack_seq = ack_seq ,
165- };
166- bpf_ringbuf_submit (item , 0 );
167- }
117+ #define SYN 1
118+ #define ACK 1 << 1
119+ #define RST 1 << 2
120+
121+ int send_ctrl_packet (struct conn_tuple * conn , __u32 flags , __u32 seq , __u32 ack_seq );
168122
169123#define _log_a (_0 , _1 , _2 , _3 , N , ...) _##N
170- #define _log_b_0 () (u64 [0]){}, 0
171- #define _log_b_1 (_a ) (u64 [1]){(u64 )(_a)}, sizeof(u64 )
172- #define _log_b_2 (_a , _b ) (u64 [2]){(u64 )(_a), (u64 )(_b)}, 2 * sizeof(u64 )
173- #define _log_b_3 (_a , _b , _c ) (u64 [2]){(u64 )(_a), (u64 )(_b), (u64 )(_c)}, 3 * sizeof(u64 )
124+ #define _log_b_0 () (__u64 [0]){}, 0
125+ #define _log_b_1 (_a ) (__u64 [1]){(__u64 )(_a)}, sizeof(__u64 )
126+ #define _log_b_2 (_a , _b ) (__u64 [2]){(__u64 )(_a), (__u64 )(_b)}, 2 * sizeof(__u64 )
127+ #define _log_b_3 (_a , _b , _c ) (__u64 [2]){(__u64 )(_a), (__u64 )(_b), (__u64 )(_c)}, 3 * sizeof(__u64 )
174128#define _log_c (...) _log_a(__VA_ARGS__, 3, 2, 1, 0)
175129#define _log_d (_x , _y ) _x##_y
176130#define _log_e (_x , _y ) _log_d(_x, _y)
0 commit comments