Index: sys/netgraph/ng_ksocket.c diff -u -p sys/netgraph/ng_ksocket.c.orig sys/netgraph/ng_ksocket.c --- sys/netgraph/ng_ksocket.c.orig Mon Sep 19 23:03:28 2005 +++ sys/netgraph/ng_ksocket.c Wed Jan 4 18:13:21 2006 @@ -87,6 +87,8 @@ struct ng_ksocket_private { u_int32_t flags; u_int32_t response_token; ng_ID_t response_addr; + struct sockaddr_in peer; + int have_peer; }; typedef struct ng_ksocket_private *priv_p; @@ -755,6 +757,14 @@ ng_ksocket_rcvmsg(node_p node, item_p it if (so == NULL) ERROUT(ENXIO); + if (sa->sa_family == AF_INET && + ((struct sockaddr_in *)sa)->sin_port == 0) { + bcopy(sa, &priv->peer, + sizeof(struct sockaddr_in)); + priv->have_peer = TRUE; + break; + } + /* Do connect */ if ((so->so_state & SS_ISCONNECTING) != 0) ERROUT(EALREADY); @@ -918,6 +928,8 @@ ng_ksocket_rcvdata(hook_p hook, item_p i NG_KSOCKET_TAG_SOCKADDR, NULL)) != NULL) && (stag->id == NG_NODE_ID(node) || stag->id == 0)) sa = &stag->sa; + else if (priv->have_peer && priv->peer.sin_port != 0) + sa = (struct sockaddr *)&priv->peer; /* Send packet */ error = (*so->so_proto->pr_usrreqs->pru_sosend)(so, sa, 0, m, 0, 0, td); @@ -1111,6 +1123,19 @@ ng_ksocket_incoming2(node_p node, hook_p if (sa != NULL) FREE(sa, M_SONAME); break; + } + + if (priv->have_peer) { + if (sa->sa_family != AF_INET || + ((struct sockaddr_in *)sa)->sin_addr.s_addr != + priv->peer.sin_addr.s_addr) { + FREE(sa, M_SONAME); + m_freem(m); + splx(s); + return; + } + priv->peer.sin_port = + ((struct sockaddr_in *)sa)->sin_port; } /*