5 * Bart De Schuymer <bdschuym@pandora.be>
10 #include <linux/module.h>
12 #include "../br_private.h"
13 #include <linux/netfilter.h>
14 #include <linux/netfilter/x_tables.h>
15 #include <linux/netfilter_bridge/ebtables.h>
16 #include <linux/netfilter_bridge/ebt_redirect.h>
19 ebt_redirect_tg(struct sk_buff
*skb
, const struct xt_target_param
*par
)
21 const struct ebt_redirect_info
*info
= par
->targinfo
;
23 if (!skb_make_writable(skb
, 0))
26 if (par
->hooknum
!= NF_BR_BROUTING
)
27 memcpy(eth_hdr(skb
)->h_dest
,
28 par
->in
->br_port
->br
->dev
->dev_addr
, ETH_ALEN
);
30 memcpy(eth_hdr(skb
)->h_dest
, par
->in
->dev_addr
, ETH_ALEN
);
31 skb
->pkt_type
= PACKET_HOST
;
35 static int ebt_redirect_tg_check(const struct xt_tgchk_param
*par
)
37 const struct ebt_redirect_info
*info
= par
->targinfo
;
38 unsigned int hook_mask
;
40 if (BASE_CHAIN
&& info
->target
== EBT_RETURN
)
43 hook_mask
= par
->hook_mask
& ~(1 << NF_BR_NUMHOOKS
);
44 if ((strcmp(par
->table
, "nat") != 0 ||
45 hook_mask
& ~(1 << NF_BR_PRE_ROUTING
)) &&
46 (strcmp(par
->table
, "broute") != 0 ||
47 hook_mask
& ~(1 << NF_BR_BROUTING
)))
54 static struct xt_target ebt_redirect_tg_reg __read_mostly
= {
57 .family
= NFPROTO_BRIDGE
,
58 .hooks
= (1 << NF_BR_NUMHOOKS
) | (1 << NF_BR_PRE_ROUTING
) |
59 (1 << NF_BR_BROUTING
),
60 .target
= ebt_redirect_tg
,
61 .checkentry
= ebt_redirect_tg_check
,
62 .targetsize
= sizeof(struct ebt_redirect_info
),
66 static int __init
ebt_redirect_init(void)
68 return xt_register_target(&ebt_redirect_tg_reg
);
71 static void __exit
ebt_redirect_fini(void)
73 xt_unregister_target(&ebt_redirect_tg_reg
);
76 module_init(ebt_redirect_init
);
77 module_exit(ebt_redirect_fini
);
78 MODULE_DESCRIPTION("Ebtables: Packet redirection to localhost");
79 MODULE_LICENSE("GPL");