5 * Bart De Schuymer <bdschuym@pandora.be>
10 #include <linux/module.h>
12 #include <linux/netfilter.h>
13 #include <linux/netfilter/x_tables.h>
14 #include <linux/netfilter_bridge/ebtables.h>
15 #include <linux/netfilter_bridge/ebt_nat.h>
18 ebt_dnat_tg(struct sk_buff *skb, const struct net_device *in,
19 const struct net_device *out, unsigned int hook_nr,
20 const struct xt_target *target, const void *data)
22 const struct ebt_nat_info *info = data;
24 if (!skb_make_writable(skb, 0))
27 memcpy(eth_hdr(skb)->h_dest, info->mac, ETH_ALEN);
32 ebt_dnat_tg_check(const char *tablename, const void *entry,
33 const struct xt_target *target, void *data,
34 unsigned int hookmask)
36 const struct ebt_nat_info *info = data;
38 if (BASE_CHAIN && info->target == EBT_RETURN)
41 if ( (strcmp(tablename, "nat") ||
42 (hookmask & ~((1 << NF_BR_PRE_ROUTING) | (1 << NF_BR_LOCAL_OUT)))) &&
43 (strcmp(tablename, "broute") || hookmask & ~(1 << NF_BR_BROUTING)) )
50 static struct xt_target ebt_dnat_tg_reg __read_mostly = {
53 .family = NFPROTO_BRIDGE,
54 .target = ebt_dnat_tg,
55 .checkentry = ebt_dnat_tg_check,
56 .targetsize = XT_ALIGN(sizeof(struct ebt_nat_info)),
60 static int __init ebt_dnat_init(void)
62 return xt_register_target(&ebt_dnat_tg_reg);
65 static void __exit ebt_dnat_fini(void)
67 xt_unregister_target(&ebt_dnat_tg_reg);
70 module_init(ebt_dnat_init);
71 module_exit(ebt_dnat_fini);
72 MODULE_DESCRIPTION("Ebtables: Destination MAC address translation");
73 MODULE_LICENSE("GPL");