Date: Thu, 16 Jul 2009 13:12:12 GMT From: Ana Kukec <anchie@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 166165 for review Message-ID: <200907161312.n6GDCC1j075935@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=166165 Change 166165 by anchie@anchie_malimis on 2009/07/16 13:11:39 Processing of the incoming packet: ND packet goes to userspace through the netinet6/send.c: send_input(); SEND packet comes back to kernel through netinet6/send.c: send_output() which calls netinet6/nd6_nbr.c: nd6_ns_input() (and other.. nd6_**_input() functions) and icmp6_rip6_input(). Affected files ... .. //depot/projects/soc2009/anchie_send/send_0.2/sendd/net.c#19 edit .. //depot/projects/soc2009/anchie_send/send_0.2/sendd/proto.c#9 edit .. //depot/projects/soc2009/anchie_send/src/sys/net/rtsock.c#9 edit .. //depot/projects/soc2009/anchie_send/src/sys/netinet6/send.c#18 edit Differences ... ==== //depot/projects/soc2009/anchie_send/send_0.2/sendd/net.c#19 (text+ko) ==== @@ -157,6 +157,8 @@ } snd_put_buf(b); + + return; } void @@ -234,7 +236,7 @@ int n; if ((b = snd_get_buf()) == NULL) { - return; + goto done; } pi = sbuff_data(b); @@ -267,9 +269,14 @@ switch (ifan->ifan_what) { case RTM_SND_IN: applog(LOG_ERR, "RTM_SND_IN"); - /* n = RTM hdr + m as passed to nd6_ns_input() */ - b = (struct rt_msghdr *) &ifan[1]; - /* ToDo: Extract ifidx. */ + /* n = RTM hdr + SEND message */ + if (sbuff_pull(b, sizeof (struct rt_msghdr)) == NULL) { + DBG(&dbg_snd, "invalid pkt (not enough for rtm hedaer"); goto done; + } + + pi->ifinfo = p; + pi->in = SND_IN; + snd_recv_pkt(b, p->ifidx, SND_IN); break; case RTM_SND_OUT: ==== //depot/projects/soc2009/anchie_send/send_0.2/sendd/proto.c#9 (text+ko) ==== @@ -383,7 +383,11 @@ DBG(&dbg, "%s pkt (%d bytes)", drop ? "dropping" : "delivering", pi->b->len); +#if 0 os_specific_deliver_pkt(pi->os_pkt, pi->b, drop, 1); +#endif + snd_deliver_pkt(pi->os_pkt, pi->b, drop, 1); + free(pi); } @@ -431,6 +435,7 @@ os_specific_deliver_pkt(pi->os_pkt, pi->b, drop, 1); #endif snd_deliver_pkt(pi->os_pkt, pi->b, drop, 1); + free(pi); } @@ -736,13 +741,12 @@ } if (in) { - /* if (snd_is_lcl_cga(pi->cga, ifidx)) { DBG(&dbg, "is local; don't need to check"); drop = 0; goto done; } - */ + if (snd_parse_opts(&pi->ndopts, sbuff_data(b), b->len) < 0) { goto drop; } ==== //depot/projects/soc2009/anchie_send/src/sys/net/rtsock.c#9 (text+ko) ==== @@ -524,12 +524,29 @@ case RTM_SND: printf("RTM_SND!"); - m_adj(m, sizeof (struct rt_msghdr)); - printf("rtm->rtm_index = %d\n", rtm->rtm_index); - ifp = ifnet_byindex(rtm->rtm_index); - if (ifp) - send_output_hook(m, ifp, SND_OUT); - break; + struct if_announcemsghdr *ifan; + ifan = mtod(m, struct if_announcemsghdr *); + + switch (ifan->ifan_what) { + case RTM_SND_IN: + ifp = ifnet_byindex(rtm->rtm_index); + m_adj(m, sizeof (struct rt_msghdr)); + printf("rtm->rtm_index = %d\n", rtm->rtm_index); + if (ifp) + send_output_hook(m, ifp, SND_IN); + break; + case RTM_SND_OUT: + ifp = m->m_pkthdr.rcvif; + printf("rtm->rtm_index = %d\n", rtm->rtm_index); +#if 0 + ifp = ifnet_byindex(rtm->rtm_index); +#endif + m_adj(m, sizeof (struct rt_msghdr)); + if (ifp) + send_output_hook(m, ifp, SND_OUT); + break; + } + case RTM_ADD: if (info.rti_info[RTAX_GATEWAY] == NULL) senderr(EINVAL); ==== //depot/projects/soc2009/anchie_send/src/sys/netinet6/send.c#18 (text+ko) ==== @@ -22,6 +22,8 @@ { struct ip6_hdr *ip6; struct sockaddr_in6 *dst; + struct icmp6_hdr *icmp6 + int icmp6len; printf("send_output\n"); @@ -31,21 +33,38 @@ * Outgoing packets are sent out using if_output(). */ - ip6 = mtod(m, struct ip6_hdr *); - //struct in6_addr dst = ip6->ip6_dst; - //dst = &ip6->ip6_dst; + switch (in) { + case SND_IN: + icmp6len = m->m_pkthdr.len - sizeof(struct ip6_hdr); + printf("send_output: m_pkthdr.len = %d\n", m->m_pkthdr.len); + + icmp6 = (struct icmp6_hdr *)((caddr_t)ip6 + sizeof(struct ip6_hdr)); + switch (icmp6->icmp6_code) { + case ND_NEIGHBOR_SOLICIT: + /* From icmp6.c: incpm6_input(). */ + nd6_ns_input(m, sizeof(struct ip6_hdr), icmp6len); + break; + } + + //icmp6_rip6_input(&m, *offp); + + break; + case SND_OUT: + ip6 = mtod(m, struct ip6_hdr *); - dst = malloc (2 * sizeof (struct sockaddr_in6), M_TEMP, M_NOWAIT); - dst->sin6_len = sizeof(struct sockaddr_in6); - dst->sin6_family = AF_INET6; - dst->sin6_addr = ip6->ip6_dst; + dst = malloc (sizeof (struct sockaddr_in6), M_TEMP, M_NOWAIT); + dst->sin6_len = sizeof(struct sockaddr_in6); + dst->sin6_family = AF_INET6; + dst->sin6_addr = ip6->ip6_dst; - /* - * From nd6.c: nd6_output_lle(). - * ToFix: kernel panic: Duplicate free of item (mbuf). - */ - return (*ifp->if_output)(ifp, m, (struct sockaddr *)dst, NULL); - //return (0); + /* + * From nd6.c: nd6_output_lle(). + * ToFix: kernel panic: Duplicate free of item (mbuf). + */ + return (*ifp->if_output)(ifp, m, (struct sockaddr *)dst, NULL); + //return (0); + break; + } } static int
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200907161312.n6GDCC1j075935>