Annotation of 42BSD/sys/netpup/raw_ether.c, revision 1.1.1.1

1.1       root        1: /*     %M%     %I%     %E%     */
                      2: 
                      3: #include "../h/param.h"
                      4: #include "../h/mbuf.h"
                      5: #include "../h/socket.h"
                      6: #include "../h/protosw.h"
                      7: #include "../h/socketvar.h"
                      8: #include "../h/errno.h"
                      9: 
                     10: #include "../net/if.h"
                     11: #include "../net/route.h"
                     12: #include "../net/raw_cb.h"
                     13: 
                     14: #include "../netpup/ether.h"
                     15: #include "../vaxif/if_en.h"
                     16: 
                     17: /*
                     18:  * Raw interface to 3Mb/s Ethernet.
                     19:  */
                     20: 
                     21: struct sockaddr etherlink = { AF_ETHERLINK };
                     22: /*
                     23:  * Generate Ethernet header and pass packet to output
                     24:  * routine.  The user must create a skeletal header
                     25:  * in order to message type.  Source and destination
                     26:  * field are filled in from send parameters.
                     27:  */
                     28: raw_enoutput(m, so)
                     29:        register struct mbuf *m;
                     30:        struct socket *so;
                     31: {
                     32:        register struct en_header *en;
                     33:        register struct sockaddr_en *sen;
                     34:        register struct rawcb *rp = sotorawcb(so);
                     35:        struct ifnet *ifp;
                     36:        int error = 0;
                     37: 
                     38:        /*
                     39:         * Verify user has supplied necessary space for the header.
                     40:         */
                     41:        if ((m->m_off > MMAXOFF || m->m_len < sizeof (struct en_header)) &&
                     42:            (m = m_pullup(m, sizeof (struct en_header))) == 0) {
                     43:                error = EMSGSIZE;       /* XXX */
                     44:                goto bad;
                     45:        }
                     46:        en = mtod(m, struct en_header *);
                     47:        sen = (struct sockaddr_en *)&rp->rcb_faddr;
                     48:        en->en_dhost = sen->sen_host;
                     49:        if (rp->rcb_route.ro_rt == 0)
                     50:                ifp = if_ifonnetof(sen->sen_net);
                     51:        else {
                     52:                rp->rcb_route.ro_rt->rt_use++;
                     53:                ifp = rp->rcb_route.ro_rt->rt_ifp;
                     54:        }
                     55:        if (ifp == 0) {
                     56:                error = ENETUNREACH;
                     57:                goto bad;
                     58:        }
                     59:        en->en_shost = ifp->if_host[0];
                     60:        return ((*ifp->if_output)(ifp, m, &etherlink));
                     61: bad:
                     62:        m_freem(m);
                     63:        return (error);
                     64: }

unix.superglobalmegacorp.com

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