ebt_dnat.c revision 2d06d4a5cc107046508d860a0b47dbc43b829b79
11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * ebt_dnat 31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Authors: 51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Bart De Schuymer <bdschuym@pandora.be> 61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * June, 2002 81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1018219d3f7d6a5bc43825a41e0763158efbdb80d3Jan Engelhardt#include <linux/module.h> 1118219d3f7d6a5bc43825a41e0763158efbdb80d3Jan Engelhardt#include <net/sock.h> 122ca7b0ac022aa0158599178fe1056b1ba9ec8b97Herbert Xu#include <linux/netfilter.h> 1318219d3f7d6a5bc43825a41e0763158efbdb80d3Jan Engelhardt#include <linux/netfilter/x_tables.h> 141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/netfilter_bridge/ebtables.h> 151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/netfilter_bridge/ebt_nat.h> 161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 172d06d4a5cc107046508d860a0b47dbc43b829b79Jan Engelhardtstatic unsigned int 182d06d4a5cc107046508d860a0b47dbc43b829b79Jan Engelhardtebt_dnat_tg(struct sk_buff *skb, const struct net_device *in, 192d06d4a5cc107046508d860a0b47dbc43b829b79Jan Engelhardt const struct net_device *out, unsigned int hook_nr, 202d06d4a5cc107046508d860a0b47dbc43b829b79Jan Engelhardt const struct xt_target *target, const void *data) 211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 22abfdf1c48907f78ad7d943b77ea180bf5504564fJan Engelhardt const struct ebt_nat_info *info = data; 231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 24eb1197bc0e20d3ceb450883dbd181460252f0306Joonwoo Park if (!skb_make_writable(skb, 0)) 251b04ab4597725f75f94942da9aa40daa7b9a4bd9Joonwoo Park return EBT_DROP; 261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 273db05fea51cdb162cfa8f69e9cfb9e228919d2a9Herbert Xu memcpy(eth_hdr(skb)->h_dest, info->mac, ETH_ALEN); 281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return info->target; 291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 312d06d4a5cc107046508d860a0b47dbc43b829b79Jan Engelhardtstatic bool 322d06d4a5cc107046508d860a0b47dbc43b829b79Jan Engelhardtebt_dnat_tg_check(const char *tablename, const void *entry, 332d06d4a5cc107046508d860a0b47dbc43b829b79Jan Engelhardt const struct xt_target *target, void *data, 342d06d4a5cc107046508d860a0b47dbc43b829b79Jan Engelhardt unsigned int hookmask) 351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 36abfdf1c48907f78ad7d943b77ea180bf5504564fJan Engelhardt const struct ebt_nat_info *info = data; 371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (BASE_CHAIN && info->target == EBT_RETURN) 3919eda879a136889110c692dec4c2ab59e0e43cefJan Engelhardt return false; 401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds CLEAR_BASE_CHAIN_BIT; 411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if ( (strcmp(tablename, "nat") || 421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (hookmask & ~((1 << NF_BR_PRE_ROUTING) | (1 << NF_BR_LOCAL_OUT)))) && 431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (strcmp(tablename, "broute") || hookmask & ~(1 << NF_BR_BROUTING)) ) 4419eda879a136889110c692dec4c2ab59e0e43cefJan Engelhardt return false; 451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (INVALID_TARGET) 4619eda879a136889110c692dec4c2ab59e0e43cefJan Engelhardt return false; 4719eda879a136889110c692dec4c2ab59e0e43cefJan Engelhardt return true; 481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5030083c9500b8aa3bc48579eaadb5068ad057afbdJan Engelhardtstatic struct ebt_target dnat __read_mostly = { 511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .name = EBT_DNAT_TARGET, 52001a18d369f4813ed792629ff4a9a6ade2a4a031Jan Engelhardt .revision = 0, 53001a18d369f4813ed792629ff4a9a6ade2a4a031Jan Engelhardt .family = NFPROTO_BRIDGE, 542d06d4a5cc107046508d860a0b47dbc43b829b79Jan Engelhardt .target = ebt_dnat_tg, 552d06d4a5cc107046508d860a0b47dbc43b829b79Jan Engelhardt .checkentry = ebt_dnat_tg_check, 5618219d3f7d6a5bc43825a41e0763158efbdb80d3Jan Engelhardt .targetsize = XT_ALIGN(sizeof(struct ebt_nat_info)), 571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .me = THIS_MODULE, 581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6065b4b4e81a5094d52cbe372b887b1779abe53f9bAndrew Mortonstatic int __init ebt_dnat_init(void) 611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return ebt_register_target(&dnat); 631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6565b4b4e81a5094d52cbe372b887b1779abe53f9bAndrew Mortonstatic void __exit ebt_dnat_fini(void) 661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ebt_unregister_target(&dnat); 681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7065b4b4e81a5094d52cbe372b887b1779abe53f9bAndrew Mortonmodule_init(ebt_dnat_init); 7165b4b4e81a5094d52cbe372b887b1779abe53f9bAndrew Mortonmodule_exit(ebt_dnat_fini); 72f776c4cda449bab463f5388eb07bd63dc52e2b13Jan EngelhardtMODULE_DESCRIPTION("Ebtables: Destination MAC address translation"); 731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_LICENSE("GPL"); 74