aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4/icmp.c
diff options
context:
space:
mode:
authorJ. Simonetti <jeroen@simonetti.nl>2005-06-13 15:19:03 -0700
committerDavid S. Miller <davem@davemloft.net>2005-06-13 15:19:03 -0700
commit1c2fb7f93cb20621772bf304f3dba0849942e5db (patch)
tree0cb992ad463ee13af28d80d6730dcf1c4532b707 /net/ipv4/icmp.c
parent6a6ddb2a9c11fcc3e8d7517841d28c9ea206ddef (diff)
downloadkernel_goldelico_gta04-1c2fb7f93cb20621772bf304f3dba0849942e5db.zip
kernel_goldelico_gta04-1c2fb7f93cb20621772bf304f3dba0849942e5db.tar.gz
kernel_goldelico_gta04-1c2fb7f93cb20621772bf304f3dba0849942e5db.tar.bz2
[IPV4]: Sysctl configurable icmp error source address.
This patch alows you to change the source address of icmp error messages. It applies cleanly to 2.6.11.11 and retains the default behaviour. In the old (default) behaviour icmp error messages are sent with the ip of the exiting interface. The new behaviour (when the sysctl variable is toggled on), it will send the message with the ip of the interface that received the packet that caused the icmp error. This is the behaviour network administrators will expect from a router. It makes debugging complicated network layouts much easier. Also, all 'vendor routers' I know of have the later behaviour. Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4/icmp.c')
-rw-r--r--net/ipv4/icmp.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/net/ipv4/icmp.c b/net/ipv4/icmp.c
index 85bf0d3..cb75948 100644
--- a/net/ipv4/icmp.c
+++ b/net/ipv4/icmp.c
@@ -207,6 +207,7 @@ int sysctl_icmp_ignore_bogus_error_responses;
int sysctl_icmp_ratelimit = 1 * HZ;
int sysctl_icmp_ratemask = 0x1818;
+int sysctl_icmp_errors_use_inbound_ifaddr;
/*
* ICMP control array. This specifies what to do with each ICMP.
@@ -511,8 +512,12 @@ void icmp_send(struct sk_buff *skb_in, int type, int code, u32 info)
*/
saddr = iph->daddr;
- if (!(rt->rt_flags & RTCF_LOCAL))
- saddr = 0;
+ if (!(rt->rt_flags & RTCF_LOCAL)) {
+ if (sysctl_icmp_errors_use_inbound_ifaddr)
+ saddr = inet_select_addr(skb_in->dev, 0, RT_SCOPE_LINK);
+ else
+ saddr = 0;
+ }
tos = icmp_pointers[type].error ? ((iph->tos & IPTOS_TOS_MASK) |
IPTOS_PREC_INTERNETCONTROL) :