: revert MASQUERADE optimization for mostly static IPs
Subsystems (2)
PATCH 7/18 : revert MASQUERADE optimization for mostly static IPs
Revert MASQUERADE optimization for mostly static IPs since it it broken in its current form.
# This is a BitKeeper generated diff -Nru style patch. #
# ChangeSet
# 2004/12/05 22:46:31+01:00 [email protected]
# [NETFILTER]: revert MASQUERADE optimization for mostly static IPs
#
# Signed-off-by: Phil Oester <[email protected]>
# Signed-off-by: Patrick McHardy <[email protected]>
#
# net/ipv4/netfilter/ipt_MASQUERADE.c
# 2004/12/05 22:46:30+01:00 [email protected] +41 -14
# [NETFILTER]: revert MASQUERADE optimization for mostly static IPs
#
# Signed-off-by: Phil Oester <[email protected]>
# Signed-off-by: Patrick McHardy <[email protected]>
#
net/ipv4/netfilter/ipt_MASQUERADE.c +41 -14
@@ -125,35 +125,58 @@ }static inline int -device_cmp (const struct ip_conntrack *i,void *_ina) +device_cmp (const struct ip_conntrack *i,void *ifindex) { -int ret =0 ; -struct in_ifaddr *ina = _ina; +int ret;READ_LOCK (&masq_lock); -/* If it's masquerading out this interface with a different address, -* or we don't know the new address of this interface. */ -if (i->nat.masq_index == ina->ifa_dev->dev->ifindex - && i->tuplehash[IP_CT_DIR_REPLY ].tuple.dst.ip != ina->ifa_address) - ret =1 ; + ret = (i->nat.masq_index == (int )(long )ifindex);READ_UNLOCK (&masq_lock);return ret; } +static int masq_device_event (struct notifier_block *this, +unsigned long event, +void *ptr) +{ +struct net_device *dev = ptr; + +if (event ==NETDEV_DOWN ) { +/* Device was downed. Search entire table for +conntracks which were associated with that device, +and forget them. */ +IP_NF_ASSERT (dev->ifindex !=0 ); + +ip_ct_selective_cleanup (device_cmp, (void *)(long )dev->ifindex); + } + +return NOTIFY_DONE ; +} + +static int masq_inet_event (struct notifier_block *this,unsigned long event,void *ptr) { -/* For some configurations, interfaces often come back with -* the same address. If not, clean up old conntrack -* entries. */ -if (event ==NETDEV_UP ) -ip_ct_selective_cleanup (device_cmp, ptr); +struct net_device *dev = ((struct in_ifaddr *)ptr)->ifa_dev->dev; + +if (event ==NETDEV_DOWN ) { +/* IP address was deleted. Search entire table for +conntracks which were associated with that device, +and forget them. */ +IP_NF_ASSERT (dev->ifindex !=0 ); + +ip_ct_selective_cleanup (device_cmp, (void *)(long )dev->ifindex); + }return NOTIFY_DONE ; } +static struct notifier_block masq_dev_notifier = { + .notifier_call = masq_device_event, +}; +static struct notifier_block masq_inet_notifier = { .notifier_call = masq_inet_event };
@@ -168,9 +191,12 @@ ret =ipt_register_target (&masquerade); -if (ret ==0 ) +if (ret ==0 ) { +/* Register for device down reports */ +register_netdevice_notifier (&masq_dev_notifier);/* Register IP address change reports */ register_inetaddr_notifier (&masq_inet_notifier); + }return ret; }
@@ -178,6 +204,7 @@ static void __exit fini(void) {ipt_unregister_target (&masquerade); +unregister_netdevice_notifier (&masq_dev_notifier);unregister_inetaddr_notifier (&masq_inet_notifier); }