@@ -190,7 +190,7 @@ static try_inline int handle_exit(struct pt_regs *regs, int func)
190190}
191191
192192/* one trace may have more than one implement */
193- #define __DEFINE_KPROBE_RAW (name , func_name , skb_init ) \
193+ #define __DEFINE_KPROBE_INIT (name , func_name , skb_init ) \
194194 static try_inline int fake__##name(struct pt_regs *ctx, \
195195 struct sk_buff *skb, \
196196 int func); \
@@ -209,11 +209,15 @@ static try_inline int handle_exit(struct pt_regs *regs, int func)
209209 struct sk_buff *skb, \
210210 int func)
211211
212- #define DEFINE_KPROBE_RAW (name , skb_init ) \
213- __DEFINE_KPROBE_RAW (name, name, skb_init)
212+ #define DEFINE_KPROBE_INIT (name , skb_init ) \
213+ __DEFINE_KPROBE_INIT (name, name, skb_init)
214214
215215#define DEFINE_KPROBE (name , skb_index ) \
216- DEFINE_KPROBE_RAW(name, PT_REGS_PARM##skb_index(ctx))
216+ DEFINE_KPROBE_INIT(name, PT_REGS_PARM##skb_index(ctx))
217+
218+ #define DEFINE_KPROBE_TARGET (name , func_name , skb_index ) \
219+ __DEFINE_KPROBE_INIT(name, func_name, \
220+ PT_REGS_PARM##skb_index(ctx))
217221
218222#define KPROBE_DEFAULT (name , skb_index ) \
219223 DEFINE_KPROBE(name, skb_index) \
@@ -262,23 +266,37 @@ DEFINE_TP(kfree_skb, skb, kfree_skb, 8)
262266 return 0 ;
263267}
264268
265- __DEFINE_KPROBE_RAW (__netif_receive_skb_core_pskb , __netif_receive_skb_core ,
266- _ (* (void * * )(PT_REGS_PARM1 (ctx ))))
269+ __DEFINE_KPROBE_INIT (__netif_receive_skb_core_pskb , __netif_receive_skb_core ,
270+ _ (* (void * * )(PT_REGS_PARM1 (ctx ))))
267271{
268272 return default_handle_entry (ctx , skb , func );
269273}
270274
275+ #define bpf_ipt_do_table () \
276+ { \
277+ nf_event_t e = { \
278+ .event = { .func = func, }, \
279+ .hook = _C(state, hook), \
280+ }; \
281+ \
282+ bpf_probe_read(e.table, sizeof(e.table) - 1, _C(table, name)); \
283+ return handle_entry(ctx, skb, &e.event, sizeof(e), func); \
284+ }
285+
271286DEFINE_KPROBE (ipt_do_table , 1 )
272287{
273288 struct nf_hook_state * state = (void * )PT_REGS_PARM2 (ctx );
274289 struct xt_table * table = (void * )PT_REGS_PARM3 (ctx );
275- nf_event_t e = {
276- .event = { .func = func , },
277- .hook = _C (state , hook ),
278- };
279290
280- bpf_probe_read (e .table , sizeof (e .table ) - 1 , _C (table , name ));
281- return handle_entry (ctx , skb , & e .event , sizeof (e ), func );
291+ bpf_ipt_do_table ();
292+ }
293+
294+ DEFINE_KPROBE_TARGET (ipt_do_table_new , ipt_do_table , 2 )
295+ {
296+ struct nf_hook_state * state = (void * )PT_REGS_PARM3 (ctx );
297+ struct xt_table * table = (void * )PT_REGS_PARM1 (ctx );
298+
299+ bpf_ipt_do_table ();
282300}
283301
284302DEFINE_KPROBE (nf_hook_slow , 1 )
0 commit comments