-
-/*
- * Intercept operations required to
- * maintain interface pointer used on output.
- */
-rimp_usrreq(so, req, m, addr)
- struct socket *so;
- int req;
- struct mbuf *m;
- caddr_t addr;
-{
- register struct rawcb *rp = sotorawcb(so);
- register struct sockaddr_in *sin;
- register struct ifnet *ifp;
-
-COUNT(RIMP_USRREQ);
- if (rp == 0 && req != PRU_ATTACH)
- return (EINVAL);
-
- switch (req) {
-
- /*
- * Verify address has an interface to go with it.
- */
- case PRU_CONNECT:
- if (rp->rcb_pcb)
- return (EISCONN);
- sin = (struct sockaddr_in *)addr;
- ifp = if_ifonnetof(sin->sin_addr);
- if (ifp == 0) {
- ifp = if_gatewayfor(sin->sin_addr);
- if (ifp == 0)
- return (EADDRNOTAVAIL); /* XXX */
- }
- rp->rcb_pcb = (caddr_t)ifp;
- break;
-
- case PRU_DISCONNECT:
- rp->rcb_pcb = 0;
- break;
-
- case PRU_CONTROL:
- return (EOPNOTSUPP);
- }
- return (raw_usrreq(so, req, m, addr));
-}