From owner-p4-projects@FreeBSD.ORG Tue Oct 30 01:51:29 2007 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 8D4EB16A421; Tue, 30 Oct 2007 01:51:29 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 2DB2F16A417 for ; Tue, 30 Oct 2007 01:51:29 +0000 (UTC) (envelope-from kmacy@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 1B32B13C48D for ; Tue, 30 Oct 2007 01:51:29 +0000 (UTC) (envelope-from kmacy@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id l9U1pSuV087624 for ; Tue, 30 Oct 2007 01:51:28 GMT (envelope-from kmacy@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id l9U1pSrh087621 for perforce@freebsd.org; Tue, 30 Oct 2007 01:51:28 GMT (envelope-from kmacy@freebsd.org) Date: Tue, 30 Oct 2007 01:51:28 GMT Message-Id: <200710300151.l9U1pSrh087621@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to kmacy@freebsd.org using -f From: Kip Macy To: Perforce Change Reviews Cc: Subject: PERFORCE change 128316 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 30 Oct 2007 01:51:29 -0000 http://perforce.freebsd.org/chv.cgi?CH=128316 Change 128316 by kmacy@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 -#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. */