Annotation of 43BSDTahoe/sys/netinet/raw_ip.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 1982, 1986 Regents of the University of California.
        !             3:  * All rights reserved.
        !             4:  *
        !             5:  * Redistribution and use in source and binary forms are permitted
        !             6:  * provided that the above copyright notice and this paragraph are
        !             7:  * duplicated in all such forms and that any documentation,
        !             8:  * advertising materials, and other materials related to such
        !             9:  * distribution and use acknowledge that the software was developed
        !            10:  * by the University of California, Berkeley.  The name of the
        !            11:  * University may not be used to endorse or promote products derived
        !            12:  * from this software without specific prior written permission.
        !            13:  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
        !            14:  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
        !            15:  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
        !            16:  *
        !            17:  *     @(#)raw_ip.c    7.4 (Berkeley) 6/29/88
        !            18:  */
        !            19: 
        !            20: #include "param.h"
        !            21: #include "mbuf.h"
        !            22: #include "socket.h"
        !            23: #include "protosw.h"
        !            24: #include "socketvar.h"
        !            25: #include "errno.h"
        !            26: 
        !            27: #include "../net/if.h"
        !            28: #include "../net/route.h"
        !            29: #include "../net/raw_cb.h"
        !            30: 
        !            31: #include "in.h"
        !            32: #include "in_systm.h"
        !            33: #include "ip.h"
        !            34: #include "ip_var.h"
        !            35: 
        !            36: /*
        !            37:  * Raw interface to IP protocol.
        !            38:  */
        !            39: 
        !            40: struct sockaddr_in ripdst = { AF_INET };
        !            41: struct sockaddr_in ripsrc = { AF_INET };
        !            42: struct sockproto ripproto = { PF_INET };
        !            43: /*
        !            44:  * Setup generic address and protocol structures
        !            45:  * for raw_input routine, then pass them along with
        !            46:  * mbuf chain.
        !            47:  */
        !            48: rip_input(m)
        !            49:        struct mbuf *m;
        !            50: {
        !            51:        register struct ip *ip = mtod(m, struct ip *);
        !            52: 
        !            53:        ripproto.sp_protocol = ip->ip_p;
        !            54:        ripdst.sin_addr = ip->ip_dst;
        !            55:        ripsrc.sin_addr = ip->ip_src;
        !            56:        raw_input(m, &ripproto, (struct sockaddr *)&ripsrc,
        !            57:          (struct sockaddr *)&ripdst);
        !            58: }
        !            59: 
        !            60: /*
        !            61:  * Generate IP header and pass packet to ip_output.
        !            62:  * Tack on options user may have setup with control call.
        !            63:  */
        !            64: rip_output(m0, so)
        !            65:        struct mbuf *m0;
        !            66:        struct socket *so;
        !            67: {
        !            68:        register struct mbuf *m;
        !            69:        register struct ip *ip;
        !            70:        int len = 0, error;
        !            71:        struct rawcb *rp = sotorawcb(so);
        !            72:        struct sockaddr_in *sin;
        !            73: 
        !            74:        /*
        !            75:         * Calculate data length and get an mbuf
        !            76:         * for IP header.
        !            77:         */
        !            78:        for (m = m0; m; m = m->m_next)
        !            79:                len += m->m_len;
        !            80:        m = m_get(M_DONTWAIT, MT_HEADER);
        !            81:        if (m == 0) {
        !            82:                error = ENOBUFS;
        !            83:                goto bad;
        !            84:        }
        !            85:        
        !            86:        /*
        !            87:         * Fill in IP header as needed.
        !            88:         */
        !            89:        m->m_off = MMAXOFF - sizeof(struct ip);
        !            90:        m->m_len = sizeof(struct ip);
        !            91:        m->m_next = m0;
        !            92:        ip = mtod(m, struct ip *);
        !            93:        ip->ip_tos = 0;
        !            94:        ip->ip_off = 0;
        !            95:        ip->ip_p = rp->rcb_proto.sp_protocol;
        !            96:        ip->ip_len = sizeof(struct ip) + len;
        !            97:        if (rp->rcb_flags & RAW_LADDR) {
        !            98:                sin = (struct sockaddr_in *)&rp->rcb_laddr;
        !            99:                if (sin->sin_family != AF_INET) {
        !           100:                        error = EAFNOSUPPORT;
        !           101:                        goto bad;
        !           102:                }
        !           103:                ip->ip_src.s_addr = sin->sin_addr.s_addr;
        !           104:        } else
        !           105:                ip->ip_src.s_addr = 0;
        !           106:        ip->ip_dst = ((struct sockaddr_in *)&rp->rcb_faddr)->sin_addr;
        !           107:        ip->ip_ttl = MAXTTL;
        !           108:        return (ip_output(m, rp->rcb_options, &rp->rcb_route, 
        !           109:           (so->so_options & SO_DONTROUTE) | IP_ALLOWBROADCAST));
        !           110: bad:
        !           111:        m_freem(m);
        !           112:        return (error);
        !           113: }
        !           114: 
        !           115: /*
        !           116:  * Raw IP socket option processing.
        !           117:  */
        !           118: rip_ctloutput(op, so, level, optname, m)
        !           119:        int op;
        !           120:        struct socket *so;
        !           121:        int level, optname;
        !           122:        struct mbuf **m;
        !           123: {
        !           124:        int error = 0;
        !           125:        register struct rawcb *rp = sotorawcb(so);
        !           126: 
        !           127:        if (level != IPPROTO_IP)
        !           128:                error = EINVAL;
        !           129:        else switch (op) {
        !           130: 
        !           131:        case PRCO_SETOPT:
        !           132:                switch (optname) {
        !           133:                case IP_OPTIONS:
        !           134:                        return (ip_pcbopts(&rp->rcb_options, *m));
        !           135: 
        !           136:                default:
        !           137:                        error = EINVAL;
        !           138:                        break;
        !           139:                }
        !           140:                break;
        !           141: 
        !           142:        case PRCO_GETOPT:
        !           143:                switch (optname) {
        !           144:                case IP_OPTIONS:
        !           145:                        *m = m_get(M_WAIT, MT_SOOPTS);
        !           146:                        if (rp->rcb_options) {
        !           147:                                (*m)->m_off = rp->rcb_options->m_off;
        !           148:                                (*m)->m_len = rp->rcb_options->m_len;
        !           149:                                bcopy(mtod(rp->rcb_options, caddr_t),
        !           150:                                    mtod(*m, caddr_t), (unsigned)(*m)->m_len);
        !           151:                        } else
        !           152:                                (*m)->m_len = 0;
        !           153:                        break;
        !           154:                default:
        !           155:                        error = EINVAL;
        !           156:                        break;
        !           157:                }
        !           158:                break;
        !           159:        }
        !           160:        if (op == PRCO_SETOPT && *m)
        !           161:                (void)m_free(*m);
        !           162:        return (error);
        !           163: }

unix.superglobalmegacorp.com

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