diff options
-rw-r--r-- | sys/net/raw_cb.c | 37 | ||||
-rw-r--r-- | sys/net/raw_cb.h | 6 | ||||
-rw-r--r-- | sys/net/raw_usrreq.c | 101 | ||||
-rw-r--r-- | sys/net/rtsock.c | 4 | ||||
-rw-r--r-- | sys/netipsec/keysock.c | 3 |
5 files changed, 32 insertions, 119 deletions
diff --git a/sys/net/raw_cb.c b/sys/net/raw_cb.c index 3bbf3d2..ed34b5d 100644 --- a/sys/net/raw_cb.c +++ b/sys/net/raw_cb.c @@ -101,42 +101,5 @@ raw_detach(struct rawcb *rp) mtx_lock(&rawcb_mtx); LIST_REMOVE(rp, list); mtx_unlock(&rawcb_mtx); -#ifdef notdef - if (rp->rcb_laddr) - m_freem(dtom(rp->rcb_laddr)); - rp->rcb_laddr = 0; -#endif free((caddr_t)(rp), M_PCB); } - -/* - * Disconnect raw socket. - */ -void -raw_disconnect(struct rawcb *rp) -{ - -#ifdef notdef - if (rp->rcb_faddr) - m_freem(dtom(rp->rcb_faddr)); - rp->rcb_faddr = 0; -#endif -} - -#ifdef notdef -#include <sys/mbuf.h> - -int -raw_bind(struct socket *so, struct mbuf *nam) -{ - struct sockaddr *addr = mtod(nam, struct sockaddr *); - struct rawcb *rp; - - if (ifnet == 0) - return (EADDRNOTAVAIL); - rp = sotorawcb(so); - nam = m_copym(nam, 0, M_COPYALL, M_WAIT); - rp->rcb_laddr = mtod(nam, struct sockaddr *); - return (0); -} -#endif diff --git a/sys/net/raw_cb.h b/sys/net/raw_cb.h index 9f96bf1..34dd875 100644 --- a/sys/net/raw_cb.h +++ b/sys/net/raw_cb.h @@ -43,8 +43,6 @@ struct rawcb { LIST_ENTRY(rawcb) list; struct socket *rcb_socket; /* back pointer to socket */ - struct sockaddr *rcb_faddr; /* destination address */ - struct sockaddr *rcb_laddr; /* socket's address */ struct sockproto rcb_proto; /* protocol family, protocol */ }; @@ -72,9 +70,7 @@ pr_init_t raw_init; */ int raw_attach(struct socket *, int); void raw_detach(struct rawcb *); -void raw_disconnect(struct rawcb *); -void raw_input(struct mbuf *, struct sockproto *, struct sockaddr *, - struct sockaddr *); +void raw_input(struct mbuf *, struct sockproto *, struct sockaddr *); /* * Generic pr_usrreqs entries for raw socket protocols, usually wrapped so diff --git a/sys/net/raw_usrreq.c b/sys/net/raw_usrreq.c index fb5f429..47afb4f 100644 --- a/sys/net/raw_usrreq.c +++ b/sys/net/raw_usrreq.c @@ -67,8 +67,7 @@ raw_init(void) * Raw protocol interface. */ void -raw_input(struct mbuf *m0, struct sockproto *proto, struct sockaddr *src, - struct sockaddr *dst) +raw_input(struct mbuf *m0, struct sockproto *proto, struct sockaddr *src) { struct rawcb *rp; struct mbuf *m = m0; @@ -82,19 +81,6 @@ raw_input(struct mbuf *m0, struct sockproto *proto, struct sockaddr *src, if (rp->rcb_proto.sp_protocol && rp->rcb_proto.sp_protocol != proto->sp_protocol) continue; - /* - * We assume the lower level routines have placed the address - * in a canonical format suitable for a structure comparison. - * - * Note that if the lengths are not the same the comparison - * will fail at the first byte. - */ -#define equal(a1, a2) \ - (bcmp((caddr_t)(a1), (caddr_t)(a2), a1->sa_len) == 0) - if (rp->rcb_laddr && !equal(rp->rcb_laddr, dst)) - continue; - if (rp->rcb_faddr && !equal(rp->rcb_faddr, src)) - continue; if (last) { struct mbuf *n; n = m_copy(m, 0, (int)M_COPYALL); @@ -133,20 +119,18 @@ raw_ctlinput(int cmd, struct sockaddr *arg, void *dummy) static void raw_uabort(struct socket *so) { - struct rawcb *rp = sotorawcb(so); - KASSERT(rp != NULL, ("raw_uabort: rp == NULL")); - raw_disconnect(rp); + KASSERT(sotorawcb(so) != NULL, ("raw_uabort: rp == NULL")); + soisdisconnected(so); } static void raw_uclose(struct socket *so) { - struct rawcb *rp = sotorawcb(so); - KASSERT(rp != NULL, ("raw_uabort: rp == NULL")); - raw_disconnect(rp); + KASSERT(sotorawcb(so) != NULL, ("raw_uabort: rp == NULL")); + soisdisconnected(so); } @@ -159,16 +143,16 @@ raw_uattach(struct socket *so, int proto, struct thread *td) /* * Implementors of raw sockets will already have allocated the PCB, - * so it must be non-NULL here. + * so it must be non-NULL here. */ KASSERT(sotorawcb(so) != NULL, ("raw_uattach: so_pcb == NULL")); if (td != NULL) { error = priv_check(td, PRIV_NET_RAW); if (error) - return error; + return (error); } - return raw_attach(so, proto); + return (raw_attach(so, proto)); } static int @@ -194,20 +178,17 @@ raw_udetach(struct socket *so) struct rawcb *rp = sotorawcb(so); KASSERT(rp != NULL, ("raw_udetach: rp == NULL")); + raw_detach(rp); } static int raw_udisconnect(struct socket *so) { - struct rawcb *rp = sotorawcb(so); - KASSERT(rp != NULL, ("raw_udisconnect: rp == NULL")); - if (rp->rcb_faddr == 0) - return (ENOTCONN); - raw_disconnect(rp); - soisdisconnected(so); - return (0); + KASSERT(sotorawcb(so) != NULL, ("raw_udisconnect: rp == NULL")); + + return (ENOTCONN); } /* pru_listen is EOPNOTSUPP */ @@ -215,13 +196,10 @@ raw_udisconnect(struct socket *so) static int raw_upeeraddr(struct socket *so, struct sockaddr **nam) { - struct rawcb *rp = sotorawcb(so); - KASSERT(rp != NULL, ("raw_upeeraddr: rp == NULL")); - if (rp->rcb_faddr == 0) - return (ENOTCONN); - *nam = sodupsockaddr(rp->rcb_faddr, M_WAITOK); - return (0); + KASSERT(sotorawcb(so) != NULL, ("raw_upeeraddr: rp == NULL")); + + return (ENOTCONN); } /* pru_rcvd is EOPNOTSUPP */ @@ -231,38 +209,21 @@ static int raw_usend(struct socket *so, int flags, struct mbuf *m, struct sockaddr *nam, struct mbuf *control, struct thread *td) { - int error; - struct rawcb *rp = sotorawcb(so); - KASSERT(rp != NULL, ("raw_usend: rp == NULL")); + KASSERT(sotorawcb(so) != NULL, ("raw_usend: rp == NULL")); - if (flags & PRUS_OOB) { - error = EOPNOTSUPP; - goto release; + if ((flags & PRUS_OOB) || (control && control->m_len)) { + /* XXXRW: Should control also be freed here? */ + if (m != NULL) + m_freem(m); + return (EOPNOTSUPP); } - if (control && control->m_len) { - error = EOPNOTSUPP; - goto release; - } - if (nam) { - if (rp->rcb_faddr) { - error = EISCONN; - goto release; - } - rp->rcb_faddr = nam; - } else if (rp->rcb_faddr == 0) { - error = ENOTCONN; - goto release; - } - error = (*so->so_proto->pr_output)(m, so); - m = NULL; - if (nam) - rp->rcb_faddr = 0; -release: - if (m != NULL) - m_freem(m); - return (error); + /* + * For historical (bad?) reasons, we effectively ignore the address + * argument to sendto(2). Perhaps we should return an error instead? + */ + return ((*so->so_proto->pr_output)(m, so)); } /* pru_sense is null */ @@ -272,6 +233,7 @@ raw_ushutdown(struct socket *so) { KASSERT(sotorawcb(so) != NULL, ("raw_ushutdown: rp == NULL")); + socantsendmore(so); return (0); } @@ -279,13 +241,10 @@ raw_ushutdown(struct socket *so) static int raw_usockaddr(struct socket *so, struct sockaddr **nam) { - struct rawcb *rp = sotorawcb(so); - KASSERT(rp != NULL, ("raw_usockaddr: rp == NULL")); - if (rp->rcb_laddr == 0) - return (EINVAL); - *nam = sodupsockaddr(rp->rcb_laddr, M_WAITOK); - return (0); + KASSERT(sotorawcb(so) != NULL, ("raw_usockaddr: rp == NULL")); + + return (EINVAL); } struct pr_usrreqs raw_usrreqs = { diff --git a/sys/net/rtsock.c b/sys/net/rtsock.c index 99e0257..2f2f7cb 100644 --- a/sys/net/rtsock.c +++ b/sys/net/rtsock.c @@ -61,7 +61,6 @@ extern void sctp_addr_change(struct ifaddr *ifa, int cmd); MALLOC_DEFINE(M_RTABLE, "routetbl", "routing tables"); /* NB: these are not modified */ -static struct sockaddr route_dst = { 2, PF_ROUTE, }; static struct sockaddr route_src = { 2, PF_ROUTE, }; static struct sockaddr sa_zero = { sizeof(sa_zero), AF_INET, }; @@ -137,7 +136,7 @@ rts_input(struct mbuf *m) } else route_proto.sp_protocol = 0; - raw_input(m, &route_proto, &route_src, &route_dst); + raw_input(m, &route_proto, &route_src); } /* @@ -203,7 +202,6 @@ rts_attach(struct socket *so, int proto, struct thread *td) route_cb.ipx_count++; break; } - rp->rcb_faddr = &route_src; route_cb.any_count++; RTSOCK_UNLOCK(); soisconnected(so); diff --git a/sys/netipsec/keysock.c b/sys/netipsec/keysock.c index cc1214b..5b26b2e 100644 --- a/sys/netipsec/keysock.c +++ b/sys/netipsec/keysock.c @@ -67,7 +67,6 @@ struct key_cb { }; static struct key_cb key_cb; -static struct sockaddr key_dst = { 2, PF_KEY, }; static struct sockaddr key_src = { 2, PF_KEY, }; static int key_sendup0 __P((struct rawcb *, struct mbuf *, int)); @@ -412,8 +411,6 @@ key_attach(struct socket *so, int proto, struct thread *td) if (kp->kp_raw.rcb_proto.sp_protocol == PF_KEY) /* XXX: AF_KEY */ key_cb.key_count++; key_cb.any_count++; - kp->kp_raw.rcb_laddr = &key_src; - kp->kp_raw.rcb_faddr = &key_dst; soisconnected(so); so->so_options |= SO_USELOOPBACK; |