Annotation of 43BSD/sys/net/raw_cb.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1980, 1986 Regents of the University of California.
                      3:  * All rights reserved.  The Berkeley software License Agreement
                      4:  * specifies the terms and conditions for redistribution.
                      5:  *
                      6:  *     @(#)raw_cb.c    7.1 (Berkeley) 6/4/86
                      7:  */
                      8: 
                      9: #include "param.h"
                     10: #include "systm.h"
                     11: #include "mbuf.h"
                     12: #include "socket.h"
                     13: #include "socketvar.h"
                     14: #include "domain.h"
                     15: #include "protosw.h"
                     16: #include "errno.h"
                     17: 
                     18: #include "if.h"
                     19: #include "route.h"
                     20: #include "raw_cb.h"
                     21: #include "../netinet/in.h"
                     22: 
                     23: #include "../vax/mtpr.h"
                     24: 
                     25: /*
                     26:  * Routines to manage the raw protocol control blocks. 
                     27:  *
                     28:  * TODO:
                     29:  *     hash lookups by protocol family/protocol + address family
                     30:  *     take care of unique address problems per AF?
                     31:  *     redo address binding to allow wildcards
                     32:  */
                     33: 
                     34: /*
                     35:  * Allocate a control block and a nominal amount
                     36:  * of buffer space for the socket.
                     37:  */
                     38: raw_attach(so, proto)
                     39:        register struct socket *so;
                     40:        int proto;
                     41: {
                     42:        struct mbuf *m;
                     43:        register struct rawcb *rp;
                     44: 
                     45:        m = m_getclr(M_DONTWAIT, MT_PCB);
                     46:        if (m == 0)
                     47:                return (ENOBUFS);
                     48:        if (sbreserve(&so->so_snd, RAWSNDQ) == 0)
                     49:                goto bad;
                     50:        if (sbreserve(&so->so_rcv, RAWRCVQ) == 0)
                     51:                goto bad2;
                     52:        rp = mtod(m, struct rawcb *);
                     53:        rp->rcb_socket = so;
                     54:        so->so_pcb = (caddr_t)rp;
                     55:        rp->rcb_pcb = 0;
                     56:        rp->rcb_proto.sp_family = so->so_proto->pr_domain->dom_family;
                     57:        rp->rcb_proto.sp_protocol = proto;
                     58:        insque(rp, &rawcb);
                     59:        return (0);
                     60: bad2:
                     61:        sbrelease(&so->so_snd);
                     62: bad:
                     63:        (void) m_free(m);
                     64:        return (ENOBUFS);
                     65: }
                     66: 
                     67: /*
                     68:  * Detach the raw connection block and discard
                     69:  * socket resources.
                     70:  */
                     71: raw_detach(rp)
                     72:        register struct rawcb *rp;
                     73: {
                     74:        struct socket *so = rp->rcb_socket;
                     75: 
                     76:        if (rp->rcb_route.ro_rt)
                     77:                rtfree(rp->rcb_route.ro_rt);
                     78:        so->so_pcb = 0;
                     79:        sofree(so);
                     80:        remque(rp);
                     81:        if (rp->rcb_options)
                     82:                m_freem(dtom(rp->rcb_options));
                     83:        m_freem(dtom(rp));
                     84: }
                     85: 
                     86: /*
                     87:  * Disconnect and possibly release resources.
                     88:  */
                     89: raw_disconnect(rp)
                     90:        struct rawcb *rp;
                     91: {
                     92: 
                     93:        rp->rcb_flags &= ~RAW_FADDR;
                     94:        if (rp->rcb_socket->so_state & SS_NOFDREF)
                     95:                raw_detach(rp);
                     96: }
                     97: 
                     98: raw_bind(so, nam)
                     99:        register struct socket *so;
                    100:        struct mbuf *nam;
                    101: {
                    102:        struct sockaddr *addr = mtod(nam, struct sockaddr *);
                    103:        register struct rawcb *rp;
                    104: 
                    105:        if (ifnet == 0)
                    106:                return (EADDRNOTAVAIL);
                    107: /* BEGIN DUBIOUS */
                    108:        /*
                    109:         * Should we verify address not already in use?
                    110:         * Some say yes, others no.
                    111:         */
                    112:        switch (addr->sa_family) {
                    113: 
                    114: #ifdef INET
                    115:        case AF_IMPLINK:
                    116:        case AF_INET: {
                    117:                if (((struct sockaddr_in *)addr)->sin_addr.s_addr &&
                    118:                    ifa_ifwithaddr(addr) == 0)
                    119:                        return (EADDRNOTAVAIL);
                    120:                break;
                    121:        }
                    122: #endif
                    123: 
                    124:        default:
                    125:                return (EAFNOSUPPORT);
                    126:        }
                    127: /* END DUBIOUS */
                    128:        rp = sotorawcb(so);
                    129:        bcopy((caddr_t)addr, (caddr_t)&rp->rcb_laddr, sizeof (*addr));
                    130:        rp->rcb_flags |= RAW_LADDR;
                    131:        return (0);
                    132: }
                    133: 
                    134: /*
                    135:  * Associate a peer's address with a
                    136:  * raw connection block.
                    137:  */
                    138: raw_connaddr(rp, nam)
                    139:        struct rawcb *rp;
                    140:        struct mbuf *nam;
                    141: {
                    142:        struct sockaddr *addr = mtod(nam, struct sockaddr *);
                    143: 
                    144:        bcopy((caddr_t)addr, (caddr_t)&rp->rcb_faddr, sizeof(*addr));
                    145:        rp->rcb_flags |= RAW_FADDR;
                    146: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.