summaryrefslogtreecommitdiffstats
path: root/sys/net/route.c
diff options
context:
space:
mode:
authorkmacy <kmacy@FreeBSD.org>2007-12-12 20:53:25 +0000
committerkmacy <kmacy@FreeBSD.org>2007-12-12 20:53:25 +0000
commit50706577a436f552d3b0cbb86d7664db6d9231f5 (patch)
treecf3d3c627c21861f7f3ed1f081751dce3c03b24f /sys/net/route.c
parentdcdbd55c9a2abc0ab1398d2734826839ac918c13 (diff)
downloadFreeBSD-src-50706577a436f552d3b0cbb86d7664db6d9231f5.zip
FreeBSD-src-50706577a436f552d3b0cbb86d7664db6d9231f5.tar.gz
add interface for allowing consumers to register for ARP updates,
redirects, and path MTU changes Reviewed by: silby
Diffstat (limited to 'sys/net/route.c')
-rw-r--r--sys/net/route.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/sys/net/route.c b/sys/net/route.c
index 8ea2132..543383a 100644
--- a/sys/net/route.c
+++ b/sys/net/route.c
@@ -318,7 +318,7 @@ rtredirect(struct sockaddr *dst,
int flags,
struct sockaddr *src)
{
- struct rtentry *rt;
+ struct rtentry *rt, *rt0 = NULL;
int error = 0;
short *stat = NULL;
struct rt_addrinfo info;
@@ -362,8 +362,9 @@ rtredirect(struct sockaddr *dst,
* Create new route, rather than smashing route to net.
*/
create:
- if (rt)
- rtfree(rt);
+ rt0 = rt;
+ rt = NULL;
+
flags |= RTF_GATEWAY | RTF_DYNAMIC;
bzero((caddr_t)&info, sizeof(info));
info.rti_info[RTAX_DST] = dst;
@@ -371,14 +372,19 @@ rtredirect(struct sockaddr *dst,
info.rti_info[RTAX_NETMASK] = netmask;
info.rti_ifa = ifa;
info.rti_flags = flags;
- rt = NULL;
error = rtrequest1(RTM_ADD, &info, &rt);
if (rt != NULL) {
RT_LOCK(rt);
+ EVENTHANDLER_INVOKE(route_event, RTEVENT_REDIRECT_UPDATE, rt0, rt, dst);
flags = rt->rt_flags;
}
+ if (rt0)
+ RTFREE_LOCKED(rt0);
+
stat = &rtstat.rts_dynamic;
} else {
+ struct rtentry *gwrt;
+
/*
* Smash the current notion of the gateway to
* this destination. Should check about netmask!!!
@@ -390,6 +396,9 @@ rtredirect(struct sockaddr *dst,
* add the key and gateway (in one malloc'd chunk).
*/
rt_setgate(rt, rt_key(rt), gateway);
+ gwrt = rtalloc1(gateway, 1, 0);
+ EVENTHANDLER_INVOKE(route_event, RTEVENT_REDIRECT_UPDATE, rt, gwrt, dst);
+ RTFREE_LOCKED(gwrt);
}
} else
error = EHOSTUNREACH;
OpenPOWER on IntegriCloud