Date: Tue, 30 Mar 2010 16:33:53 GMT From: Ana Kukec <anchie@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 176287 for review Message-ID: <201003301633.o2UGXrEA078596@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://p4web.freebsd.org/chv.cgi?CH=176287 Change 176287 by anchie@anchie_malimis on 2010/03/30 16:33:48 Got rid of panic in soreceive_generic(). Messages flow now in both directions. There are still some issues -- ndp does not store ndp records properly yet. Affected files ... .. //depot/projects/soc2009/anchie_send/src/sys/netinet6/icmp6.c#33 edit .. //depot/projects/soc2009/anchie_send/src/sys/netinet6/send.c#37 edit Differences ... ==== //depot/projects/soc2009/anchie_send/src/sys/netinet6/icmp6.c#33 (text+ko) ==== @@ -793,7 +793,7 @@ if (send_input_hook != NULL) { IP6_EXTHDR_CHECK(m, off, icmp6len, IPPROTO_DONE); printf("send_sendso_input_hook\n"); - send_sendso_input_hook(V_send_so, m, SND_IN, ip6len); + send_sendso_input_hook(V_send_so, n, SND_IN, ip6len); return (IPPROTO_DONE); } else nd6_rs_input(n, off, icmp6len); @@ -819,7 +819,7 @@ goto freeit; } if (send_input_hook != NULL) { - send_sendso_input_hook(V_send_so, m, SND_IN, ip6len); + send_sendso_input_hook(V_send_so, n, SND_IN, ip6len); return (IPPROTO_DONE); } else nd6_ra_input(n, off, icmp6len); @@ -847,7 +847,7 @@ if (send_input_hook != NULL) { /* Send incoming SeND/ND packet to user space. */ printf("%s: send_input_hook n=%p\n", __func__, n); - send_sendso_input_hook(V_send_so, m, SND_IN, ip6len); + send_sendso_input_hook(V_send_so, n, SND_IN, ip6len); } else nd6_ns_input(n, off, icmp6len); /* m stays. */ @@ -873,7 +873,7 @@ goto freeit; } if (send_input_hook != NULL) - send_sendso_input_hook(V_send_so, m, SND_IN, ip6len); + send_sendso_input_hook(V_send_so, n, SND_IN, ip6len); else nd6_na_input(n, off, icmp6len); /* m stays. */ @@ -899,7 +899,7 @@ goto freeit; } if (send_input_hook != NULL) { - send_sendso_input_hook(V_send_so, m, SND_IN, ip6len); + send_sendso_input_hook(V_send_so, n, SND_IN, ip6len); return (IPPROTO_DONE); } else icmp6_redirect_input(n, off); ==== //depot/projects/soc2009/anchie_send/src/sys/netinet6/send.c#37 (text+ko) ==== @@ -198,34 +198,48 @@ static int send_uattach(struct socket *so, int proto, struct thread *td) { - int error = 0; printf("send_uattach: proto = %d\n", proto); + if (V_send_so != NULL) + return (EEXIST); + + /* XXX: Revisit this, hardocoded! */ + so->so_snd.sb_hiwat = 8192; + V_send_so = so; - return error; + return (0); } static int -sosend_rcv(struct socket *so, int flags, struct mbuf *m, struct sockaddr *nam, - struct mbuf *control, struct thread *td) +sosend_rcv(struct socket *so, int flags, struct mbuf *m, struct sockaddr *addr, + struct mbuf *control, struct thread *td) { - //struct ifnet *ifp = NULL; + struct ifnet *ifp; struct snd_hdr *snd_hdr; - printf("sosend_rcv \n"); + printf("sosend_rcv, mbuf len: %d \n", m->m_len); snd_hdr = mtod(m, struct snd_hdr *); printf("direction: %d, ifidx: %d \n", snd_hdr->direction, snd_hdr->ifidx); - //send_ifnet_setbyindex(snd_hdr->ifidx, ifp); -#if 0 - ifnet_setbyindex(snd_hdr->ifidx, ifp); - m_adj(n, sizeof(struct snd_hdr)); - if (ifp) - send_output_hook(m, ifp, snd_hdr->direction); -#endif + + struct mbuf *m0; + m0 = m_getcl(M_NOWAIT, MT_DATA, M_PKTHDR); + if (m0 == NULL) { + m_freem(m); + return (ENOBUFS); + } + m_move_pkthdr(m, m0); - return 0; + ifp = ifnet_byindex_ref(snd_hdr->ifidx); + m_adj(m, sizeof(struct snd_hdr)); + if (ifp) { + int error = send_output(m, ifp, snd_hdr->direction); + printf("error: %d\n", error); + if_rele(ifp); + return (0); + } else + return (ENETUNREACH); } /* @@ -253,29 +267,14 @@ if (len != msglen) printf("XXX-BZ %s: (m)len=%u (ip6)msglen=%d", __func__, len, msglen); -printf("M_LEADINGSPACE(%d) >= SEND_HDR_LEN(%d)?\n", M_LEADINGSPACE(m), SEND_HDR_LEN); - if (M_LEADINGSPACE(m) >= SEND_HDR_LEN) { - M_PREPEND(m, SEND_HDR_LEN, M_PKTHDR|M_DONTWAIT); - snd_hdr = mtod(m, struct snd_hdr *); - snd_hdr->direction = direction; - snd_hdr->ifidx = -1; - } else { - struct mbuf *n; - MGET(n, M_PKTHDR|M_DONTWAIT, MT_DATA); - if (n == NULL) { - m_freem(m); - return ENOBUFS; - } - - snd_hdr = mtod(n, struct snd_hdr *); - snd_hdr->direction = direction; - snd_hdr->ifidx = -1; - - n->m_len = SEND_HDR_LEN; - n->m_next = m->m_next; - m->m_next = n; - m->m_pkthdr.len += SEND_HDR_LEN; + m = m_prepend(m, SEND_HDR_LEN, M_PKTHDR|M_DONTWAIT); + if (m == NULL) { + printf("m_prepend() failed!\n"); + return (ENOBUFS); } + snd_hdr = mtod(m, struct snd_hdr *); + snd_hdr->direction = direction; + snd_hdr->ifidx = -1; /* * Send incoming or outgoing traffic to the user space either to be @@ -286,6 +285,9 @@ sbappendrecord_locked(&s->so_rcv, m); sorwakeup_locked(s); return 0; + } else { + m_freem(m); + return 0; } return -1; @@ -308,7 +310,7 @@ }; struct protosw send_protosw = { - .pr_type = SOCK_RAW, + .pr_type = SOCK_RAW, .pr_protocol = IPPROTO_SEND, .pr_usrreqs = &send_usrreqs };
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201003301633.o2UGXrEA078596>