PERFORCE change 128316 for review
Kip Macy
kmacy at FreeBSD.org
Mon Oct 29 18:51:29 PDT 2007
http://perforce.freebsd.org/chv.cgi?CH=128316
Change 128316 by kmacy at kmacy:storage:toestack on 2007/10/30 01:50:45
add eventhandlers for pmtu changes and redirects
Affected files ...
.. //depot/projects/toestack/sys/net/route.c#5 edit
.. //depot/projects/toestack/sys/net/route.h#5 edit
.. //depot/projects/toestack/sys/netinet/ip_icmp.c#4 edit
Differences ...
==== //depot/projects/toestack/sys/net/route.c#5 (text+ko) ====
@@ -496,9 +496,11 @@
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, rt);
flags = rt->rt_flags;
}
stat = &rtstat.rts_dynamic;
@@ -514,6 +516,7 @@
* add the key and gateway (in one malloc'd chunk).
*/
rt_setgate(rt, rt_key(rt), gateway);
+ EVENTHANDLER_INVOKE(route_event, RTEVENT_REDIRECT_UPDATE, rt);
}
} else
error = EHOSTUNREACH;
==== //depot/projects/toestack/sys/net/route.h#5 (text+ko) ====
@@ -367,7 +367,9 @@
#include <sys/eventhandler.h>
-#define RTEVENT_ARP_UPDATE 1
+#define RTEVENT_ARP_UPDATE 1
+#define RTEVENT_PMTU_UPDATE 2
+#define RTEVENT_REDIRECT_UPDATE 3
typedef void (*rtevent_fn)(void *, int, struct rtentry *);
EVENTHANDLER_DECLARE(route_event, rtevent_fn);
==== //depot/projects/toestack/sys/netinet/ip_icmp.c#4 (text+ko) ====
@@ -136,6 +136,33 @@
extern struct protosw inetsw[];
+static void
+rt_mtu_update(struct sockaddr *icmpsrc, struct icmp *icp)
+{
+ struct rtentry *rt;
+ int mtu;
+
+ rt = rtalloc1(icmpsrc, 0, RTF_CLONING);
+ if (rt && (rt->rt_flags & RTF_HOST)) {
+ mtu = ntohs(icp->icmp_nextmtu);
+ if (!mtu)
+ mtu = ip_next_mtu(rt->rt_rmx.rmx_mtu,
+ 1);
+#ifdef DEBUG_MTUDISC
+ printf("MTU for %s reduced to %d\n",
+ inet_ntoa(icmpsrc.sin_addr), mtu);
+#endif
+ if (mtu >= 296 && rt->rt_rmx.rmx_mtu > mtu) {
+ rt->rt_rmx.rmx_mtu = mtu;
+ EVENTHANDLER_INVOKE(route_event, RTEVENT_PMTU_UPDATE, rt);
+ }
+ }
+ if (rt)
+ RTFREE(rt);
+}
+
+
+
/*
* Generate an error packet of type error
* in response to bad packet ip.
@@ -442,6 +469,11 @@
#endif
icmpsrc.sin_addr = icp->icmp_ip.ip_dst;
/*
+ * Update the route directly for use by protocol offload
+ */
+ if (code == PRC_MSGSIZE)
+ rt_mtu_update((struct sockaddr *)&icmpsrc, icp);
+ /*
* XXX if the packet contains [IPv4 AH TCP], we can't make a
* notification to TCP layer.
*/
More information about the p4-projects
mailing list