Annotation of embedaddon/mrouted/ipip.c, revision 1.1

1.1     ! misho       1: /*
        !             2:  * The mrouted program is covered by the license in the accompanying file
        !             3:  * named "LICENSE".  Use of the mrouted program represents acceptance of
        !             4:  * the terms and conditions listed in that file.
        !             5:  *
        !             6:  * The mrouted program is COPYRIGHT 1989 by The Board of Trustees of
        !             7:  * Leland Stanford Junior University.
        !             8:  */
        !             9: 
        !            10: #include "defs.h"
        !            11: 
        !            12: /*
        !            13:  * Exported variables.
        !            14:  */
        !            15: #ifdef notyet
        !            16: int            raw_socket;                 /* socket for raw network I/O  */
        !            17: #endif
        !            18: /*
        !            19:  *XXX For now, we just use the IGMP socket to send packets.
        !            20:  * This is legal in BSD, because the protocol # is not checked
        !            21:  * on raw sockets.  The k_* interfaces need to gain a socket
        !            22:  * argument so that we can call them on the raw_socket also.
        !            23:  */
        !            24: #define        raw_socket      igmp_socket
        !            25: 
        !            26: /*
        !            27:  * Private variables.
        !            28:  */
        !            29: static int rawid = 0;
        !            30: 
        !            31: /*
        !            32:  * Open and initialize the raw socket.
        !            33:  */
        !            34: void init_ipip(void)
        !            35: {
        !            36: #ifdef notyet
        !            37:     if ((raw_socket = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0)
        !            38:        logit(LOG_ERR, errno, "Raw IP socket");
        !            39: #endif
        !            40: }
        !            41: 
        !            42: /*
        !            43:  * Allocate and fill in static IP header for encapsulating on a tunnel.
        !            44:  */
        !            45: void init_ipip_on_vif(struct uvif *v)
        !            46: {
        !            47:     struct ip *ip;
        !            48: 
        !            49:     ip = v->uv_encap_hdr = (struct ip *)malloc(sizeof(struct ip));
        !            50:     if (ip == NULL)
        !            51:        logit(LOG_ERR, 0, "out of memory");
        !            52:     memset(ip, 0, sizeof(struct ip));
        !            53:     /*
        !            54:      * Fields zeroed that aren't filled in later:
        !            55:      * - IP ID (let the kernel fill it in)
        !            56:      * - Offset (we don't send fragments)
        !            57:      * - Checksum (let the kernel fill it in)
        !            58:      */
        !            59:     ip->ip_v   = IPVERSION;
        !            60:     ip->ip_hl  = sizeof(struct ip) >> 2;
        !            61:     ip->ip_tos = 0xc0;         /* Internet Control */
        !            62:     ip->ip_ttl = MAXTTL;       /* applies to unicasts only */
        !            63:     ip->ip_p   = IPPROTO_IPIP;
        !            64:     ip->ip_src.s_addr = v->uv_lcl_addr;
        !            65:     ip->ip_dst.s_addr = v->uv_rmt_addr;
        !            66: }
        !            67: 
        !            68: /*
        !            69:  * Call build_igmp() to build an IGMP message in the output packet buffer.
        !            70:  * Then fill in the fields of the IP packet that build_igmp() left for the
        !            71:  * kernel to fill in, and encapsulate the original packet with the
        !            72:  * pre-created ip header for this vif.
        !            73:  */
        !            74: void send_ipip(u_int32 src, u_int32 dst, int type, int code, u_int32 group, int datalen, struct uvif *v)
        !            75: {
        !            76:     struct msghdr msg;
        !            77:     struct iovec iov[2];
        !            78:     struct sockaddr_in sdst;
        !            79:     struct ip *ip;
        !            80: 
        !            81:     build_igmp(src, dst, type, code, group, datalen);
        !            82:     ip = (struct ip *)send_buf;
        !            83:     ip->ip_id = htons(rawid++);
        !            84:     ip->ip_sum = 0;
        !            85:     ip->ip_sum = inet_cksum((u_int16_t *)ip, ip->ip_hl << 2);
        !            86: 
        !            87:     ip = v->uv_encap_hdr;
        !            88:     ip->ip_len = 2 * MIN_IP_HEADER_LEN + IGMP_MINLEN + datalen;
        !            89:     ip->ip_len = htons(ip->ip_len);
        !            90: 
        !            91:     memset(&sdst, 0, sizeof(sdst));
        !            92:     sdst.sin_family = AF_INET;
        !            93: #ifdef HAVE_SA_LEN
        !            94:     sdst.sin_len = sizeof(sdst);
        !            95: #endif
        !            96:     sdst.sin_addr = ip->ip_dst;
        !            97: 
        !            98:     iov[0].iov_base = (caddr_t)v->uv_encap_hdr;
        !            99:     iov[0].iov_len = sizeof(struct ip);
        !           100:     iov[1].iov_base = (caddr_t)send_buf;
        !           101:     iov[1].iov_len = MIN_IP_HEADER_LEN + IGMP_MINLEN + datalen;
        !           102: 
        !           103:     memset(&msg, 0, sizeof(msg));
        !           104:     msg.msg_name = (caddr_t)&sdst;
        !           105:     msg.msg_namelen = sizeof(sdst);
        !           106:     msg.msg_iov = iov;
        !           107:     msg.msg_iovlen = 2;
        !           108:     if (sendmsg(raw_socket, &msg, 0) < 0) {
        !           109:        if (errno == ENETDOWN)
        !           110:            check_vif_state();
        !           111:        else
        !           112:            logit(LOG_WARNING, errno,
        !           113:                "sendmsg to %s on %s",
        !           114:                inet_fmt(sdst.sin_addr.s_addr, s1, sizeof(s1)), inet_fmt(src, s2, sizeof(s2)));
        !           115:     }
        !           116: 
        !           117:     IF_DEBUG(DEBUG_PKT|igmp_debug_kind(type, code))
        !           118:     logit(LOG_DEBUG, 0, "SENT %s from %-15s to %s encaped to %s",
        !           119:        igmp_packet_kind(type, code), src == INADDR_ANY ? "INADDR_ANY" :
        !           120:                                 inet_fmt(src, s1, sizeof(s1)), inet_fmt(dst, s2, sizeof(s2)),
        !           121:                                 inet_fmt(sdst.sin_addr.s_addr, s3, sizeof(s3)));
        !           122: }
        !           123: 
        !           124: /**
        !           125:  * Local Variables:
        !           126:  *  version-control: t
        !           127:  *  indent-tabs-mode: t
        !           128:  *  c-file-style: "ellemtel"
        !           129:  *  c-basic-offset: 4
        !           130:  * End:
        !           131:  */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>