Bring CARP into the tree. CARP = Common Address Redundancy Protocol, which
[dragonfly.git] / sys / netinet / if_ether.h
CommitLineData
984263bc
MD
1/*
2 * Copyright (c) 1982, 1986, 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. All advertising materials mentioning features or use of this software
14 * must display the following acknowledgement:
15 * This product includes software developed by the University of
16 * California, Berkeley and its contributors.
17 * 4. Neither the name of the University nor the names of its contributors
18 * may be used to endorse or promote products derived from this software
19 * without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
32 *
33 * @(#)if_ether.h 8.3 (Berkeley) 5/2/95
34 * $FreeBSD: src/sys/netinet/if_ether.h,v 1.24.2.1 2002/02/13 21:38:56 fjoe Exp $
0d16ba1d 35 * $DragonFly: src/sys/netinet/if_ether.h,v 1.7 2007/08/16 20:03:57 dillon Exp $
984263bc
MD
36 */
37
38#ifndef _NETINET_IF_ETHER_H_
39#define _NETINET_IF_ETHER_H_
40
1bd40720 41#ifndef _NET_ETHERNET_H_
984263bc 42#include <net/ethernet.h>
1bd40720
MD
43#endif
44#ifndef _NET_IF_ARP_H_
984263bc 45#include <net/if_arp.h>
1bd40720
MD
46#endif
47#ifndef _NETINET_IN_H_
48#include <netinet/in.h>
49#endif
984263bc
MD
50
51/*
52 * Macro to map an IP multicast address to an Ethernet multicast address.
53 * The high-order 25 bits of the Ethernet address are statically assigned,
54 * and the low-order 23 bits are taken from the low end of the IP address.
55 */
56#define ETHER_MAP_IP_MULTICAST(ipaddr, enaddr) \
57 /* struct in_addr *ipaddr; */ \
58 /* u_char enaddr[ETHER_ADDR_LEN]; */ \
59{ \
60 (enaddr)[0] = 0x01; \
61 (enaddr)[1] = 0x00; \
62 (enaddr)[2] = 0x5e; \
63 (enaddr)[3] = ((u_char *)ipaddr)[1] & 0x7f; \
64 (enaddr)[4] = ((u_char *)ipaddr)[2]; \
65 (enaddr)[5] = ((u_char *)ipaddr)[3]; \
66}
67/*
68 * Macro to map an IP6 multicast address to an Ethernet multicast address.
69 * The high-order 16 bits of the Ethernet address are statically assigned,
70 * and the low-order 32 bits are taken from the low end of the IP6 address.
71 */
72#define ETHER_MAP_IPV6_MULTICAST(ip6addr, enaddr) \
73/* struct in6_addr *ip6addr; */ \
74/* u_char enaddr[ETHER_ADDR_LEN]; */ \
f23061d4 75{ \
984263bc
MD
76 (enaddr)[0] = 0x33; \
77 (enaddr)[1] = 0x33; \
78 (enaddr)[2] = ((u_char *)ip6addr)[12]; \
79 (enaddr)[3] = ((u_char *)ip6addr)[13]; \
80 (enaddr)[4] = ((u_char *)ip6addr)[14]; \
81 (enaddr)[5] = ((u_char *)ip6addr)[15]; \
82}
83
84/*
85 * Ethernet Address Resolution Protocol.
86 *
87 * See RFC 826 for protocol description. Structure below is adapted
88 * to resolving internet addresses. Field names used correspond to
89 * RFC 826.
90 */
91struct ether_arp {
92 struct arphdr ea_hdr; /* fixed-size header */
93 u_char arp_sha[ETHER_ADDR_LEN]; /* sender hardware address */
94 u_char arp_spa[4]; /* sender protocol address */
95 u_char arp_tha[ETHER_ADDR_LEN]; /* target hardware address */
96 u_char arp_tpa[4]; /* target protocol address */
97};
98#define arp_hrd ea_hdr.ar_hrd
99#define arp_pro ea_hdr.ar_pro
100#define arp_hln ea_hdr.ar_hln
101#define arp_pln ea_hdr.ar_pln
102#define arp_op ea_hdr.ar_op
103
104struct sockaddr_inarp {
105 u_char sin_len;
106 u_char sin_family;
107 u_short sin_port;
108 struct in_addr sin_addr;
109 struct in_addr sin_srcaddr;
110 u_short sin_tos;
111 u_short sin_other;
112#define SIN_PROXY 1
113};
114/*
115 * IP and ethernet specific routing flags
116 */
117#define RTF_USETRAILERS RTF_PROTO1 /* use trailers */
118#define RTF_ANNOUNCE RTF_PROTO2 /* announce new arp entry */
119
120#ifdef _KERNEL
121extern u_char ether_ipmulticast_min[ETHER_ADDR_LEN];
122extern u_char ether_ipmulticast_max[ETHER_ADDR_LEN];
984263bc 123
42a7fc75 124int arpresolve (struct ifnet *, struct rtentry *, struct mbuf *,
f23061d4 125 struct sockaddr *, u_char *);
42a7fc75 126void arp_ifinit (struct ifnet *, struct ifaddr *);
0d16ba1d 127void arp_ifinit2 (struct ifnet *, struct ifaddr *, u_char *);
984263bc
MD
128#endif
129
130#endif