From owner-p4-projects@FreeBSD.ORG Sun Jun 14 18:46:29 2009 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 8B9B8106566B; Sun, 14 Jun 2009 18:46: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 411111065676 for ; Sun, 14 Jun 2009 18:46:29 +0000 (UTC) (envelope-from anchie@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 239BD8FC12 for ; Sun, 14 Jun 2009 18:46:29 +0000 (UTC) (envelope-from anchie@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.3/8.14.3) with ESMTP id n5EIkTMh060404 for ; Sun, 14 Jun 2009 18:46:29 GMT (envelope-from anchie@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.3/8.14.3/Submit) id n5EIkTZ7060402 for perforce@freebsd.org; Sun, 14 Jun 2009 18:46:29 GMT (envelope-from anchie@FreeBSD.org) Date: Sun, 14 Jun 2009 18:46:29 GMT Message-Id: <200906141846.n5EIkTZ7060402@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to anchie@FreeBSD.org using -f From: Ana Kukec To: Perforce Change Reviews Cc: Subject: PERFORCE change 164368 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: Sun, 14 Jun 2009 18:46:30 -0000 http://perforce.freebsd.org/chv.cgi?CH=164368 Change 164368 by anchie@anchie_malimis on 2009/06/14 18:45:39 Processing of the outgoing traffic on the output hook (from ND stack in kernel to sendd in the userspace), for NS/A messages. Affected files ... .. //depot/projects/soc2009/anchie_send/send_0.2/sendd/net.c#7 edit .. //depot/projects/soc2009/anchie_send/send_0.2/sendd/proto.c#5 edit .. //depot/projects/soc2009/anchie_send/src/sys/netinet6/icmp6.c#6 edit .. //depot/projects/soc2009/anchie_send/src/sys/netinet6/nd6.c#3 edit .. //depot/projects/soc2009/anchie_send/src/sys/netinet6/send.c#8 edit Differences ... ==== //depot/projects/soc2009/anchie_send/send_0.2/sendd/net.c#7 (text+ko) ==== @@ -204,12 +204,20 @@ in = 1; /* n = RTM hdr + m as passed to nd6_ns_input() */ - m = (struct ip6_hdr *) &ifan[1]; + m = (struct rt_msghdr *) &ifan[1]; /* ToDo: Extract ifidx. */ snd_recv_pkt(m, ifidx, in); break; case RTM_SND_OUT: + in = 0; + + /* n = RTM hdr + ether_hdr + ip6_hdr + icmp6len == ND message (as sent to if_output()) */ + m = (struct rt_msghdr *) &ifan[1]; + + /* ToDo: Extract ifidx. */ + snd_recv_pkt(m, ifidx, in); + break; } break; ==== //depot/projects/soc2009/anchie_send/send_0.2/sendd/proto.c#5 (text+ko) ==== @@ -669,6 +669,14 @@ return; } */ +/* + if (!in) + if (sbuff_pull(b, sizeof (struct ether_header)) == NULL) { + DBG(&dbg_snd, "invalid pkt (not enough for ether header"); + goto drop; + } + } +*/ start = sbuff_data(b); DBG(&dbg, "%s", in ? "<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<" : ==== //depot/projects/soc2009/anchie_send/src/sys/netinet6/icmp6.c#6 (text+ko) ==== @@ -411,6 +411,7 @@ int code, sum, noff; char ip6bufs[INET6_ADDRSTRLEN], ip6bufd[INET6_ADDRSTRLEN]; int in; + int ip6len = -1; in = 1; @@ -427,6 +428,7 @@ */ ip6 = mtod(m, struct ip6_hdr *); + ip6len = ip6->ip6_plen; if (icmp6len < sizeof(struct icmp6_hdr)) { ICMP6STAT_INC(icp6s_tooshort); goto freeit; @@ -766,8 +768,6 @@ /* give up local */ /* send incoming SeND-protected/ND packet to sendd */ - if (send_input_hook != NULL) - send_input_hook(); nd6_rs_input(m, off, icmp6len); m = NULL; @@ -805,8 +805,9 @@ if ((n = m_copym(m, 0, M_COPYALL, M_DONTWAIT)) == NULL) { /* send incoming SeND-protected/ND packet to sendd */ - if (send_input_hook != NULL) - send_output_hook(in, ifp, m, icmp6len); + /* ip6len should be the same as icmp6len + off! */ + if (send_output_hook != NULL) + send_output_hook(in, ifp, m, ip6len); /* give up local */ /* nd6_ns_input() will be called in X_send_input_hook() */ nd6_ns_input(in, m, off, icmp6len); @@ -814,7 +815,7 @@ goto freeit; } if (send_output_hook != NULL) - send_output_hook(in, ifp, n, icmp6len); + send_output_hook(in, ifp, n, ip6len); /* nd6_ns_input() will be called in X_send_input_hook() */ nd6_ns_input(n, off, icmp6len); /* m stays. */ ==== //depot/projects/soc2009/anchie_send/src/sys/netinet6/nd6.c#3 (text+ko) ==== @@ -1724,8 +1724,12 @@ INIT_VNET_INET6(curvnet); struct mbuf *m = m0; struct llentry *ln = lle; + struct ip6_hdr *ip6; int error = 0; int flags = 0; + int in = -1; + + ip6 = mtod(m, struct ip6_hdr *); #ifdef INVARIANTS if (lle != NULL) { @@ -1876,6 +1880,7 @@ nd6_llinfo_settimer(ln, (long)ND_IFINFO(ifp)->retrans * hz / 1000); + nd6_ns_output(ifp, NULL, &dst->sin6_addr, ln, 0); } return (0); @@ -1900,6 +1905,12 @@ #ifdef MAC mac_netinet6_nd6_send(ifp, m); #endif + + /* send outgoing SeND/ND packet to sendd. */ + in = 0; + if (send_output_hook != NULL) + send_output_hook(in, ifp, m, ip6->ip6_plen); + /* * We were passed in a pointer to an lle with the lock held * this means that we can't call if_output as we will @@ -1907,6 +1918,8 @@ * a list of mbufs to send and transmit them in the caller * after the lock is dropped */ + + /* This will be done in the input hook.. */ if (lle != NULL) { if (*chain == NULL) *chain = m; @@ -1923,19 +1936,20 @@ return (error); } - /* send outgoing SeND/ND packet to sendd. */ - /* * In case of NS and NA, we end-up here after calling nd6_ns_output() * or nd6_na_output(). RS, RA, and Redirect do not have such output - * routines. They are handler instead by rtadvd and rtsol daemons. + * routines. They are handled instead by rtadvd and rtsol daemons. + * + * if_output() routines together with previous chaining will be called from input hook. */ - +/* if ((ifp->if_flags & IFF_LOOPBACK) != 0) { return ((*ifp->if_output)(origifp, m, (struct sockaddr *)dst, NULL)); } error = (*ifp->if_output)(ifp, m, (struct sockaddr *)dst, NULL); +*/ return (error); bad: ==== //depot/projects/soc2009/anchie_send/src/sys/netinet6/send.c#8 (text+ko) ==== @@ -20,18 +20,17 @@ /* * send module is loaded, process incoming packets passed from - * sendd to kernel. Outgoing packets are sent directly to - * corresponding node's sendd.(?) + * sendd to kernel. Outgoing packets are sent out using if_output(). */ return 0; } static int -X_send_output_hook(int in, struct ifnet *ifp, struct mbuf *m, int icmp6len) +X_send_output_hook(int in, struct ifnet *ifp, struct mbuf *m, int msglen) { /* send module is loaded, send incoming or outgoing traffic to sendd */ - rt_sndmsg(ifp, in, m, icmp6len); + rt_sndmsg(ifp, in, m, msglen); return 0; }