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 $ 35 * $DragonFly: src/sys/netinet/if_ether.h,v 1.7 2007/08/16 20:03:57 dillon Exp $ 36 */ 37 38 #ifndef _NETINET_IF_ETHER_H_ 39 #define _NETINET_IF_ETHER_H_ 40 41 #ifndef _NET_ETHERNET_H_ 42 #include <net/ethernet.h> 43 #endif 44 #ifndef _NET_IF_ARP_H_ 45 #include <net/if_arp.h> 46 #endif 47 #ifndef _NETINET_IN_H_ 48 #include <netinet/in.h> 49 #endif 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]; */ \ 75 { \ 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 */ 91 struct 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 104 struct 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 121 extern u_char ether_ipmulticast_min[ETHER_ADDR_LEN]; 122 extern u_char ether_ipmulticast_max[ETHER_ADDR_LEN]; 123 124 int arpresolve (struct ifnet *, struct rtentry *, struct mbuf *, 125 struct sockaddr *, u_char *); 126 void arp_ifinit (struct ifnet *, struct ifaddr *); 127 void arp_gratuitous (struct ifnet *, struct ifaddr *); 128 #endif 129 130 #endif 131