Annotation of embedaddon/mrouted/ipip.c, revision 1.1.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>