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