123173Smckusick /* 263218Sbostic * Copyright (c) 1982, 1986, 1993 363218Sbostic * The Regents of the University of California. All rights reserved. 423173Smckusick * 544472Sbostic * %sccs.include.redist.c% 632787Sbostic * 7*69162Smckusick * @(#)if_ether.h 8.3 (Berkeley) 05/02/95 823173Smckusick */ 99744Ssam 109744Ssam /* 119744Ssam * Structure of a 10Mb/s Ethernet header. 129744Ssam */ 139746Ssam struct ether_header { 1418641Skarels u_char ether_dhost[6]; 1518641Skarels u_char ether_shost[6]; 169746Ssam u_short ether_type; 179744Ssam }; 189744Ssam 1954716Ssklower #define ETHERTYPE_PUP 0x0200 /* PUP protocol */ 2054716Ssklower #define ETHERTYPE_IP 0x0800 /* IP protocol */ 2154716Ssklower #define ETHERTYPE_ARP 0x0806 /* Addr. resolution protocol */ 2254716Ssklower #define ETHERTYPE_REVARP 0x8035 /* reverse Addr. resolution protocol */ 239744Ssam 249744Ssam /* 2518641Skarels * The ETHERTYPE_NTRAILER packet types starting at ETHERTYPE_TRAIL have 2625891Skarels * (type-ETHERTYPE_TRAIL)*512 bytes of data followed 2725891Skarels * by an ETHER type (as given above) and then the (variable-length) header. 289744Ssam */ 2918641Skarels #define ETHERTYPE_TRAIL 0x1000 /* Trailer packet */ 3018641Skarels #define ETHERTYPE_NTRAILER 16 319746Ssam 329746Ssam #define ETHERMTU 1500 339746Ssam #define ETHERMIN (60-14) 3411573Ssam 3554716Ssklower #ifdef KERNEL 3611573Ssam /* 3754716Ssklower * Macro to map an IP multicast address to an Ethernet multicast address. 3854716Ssklower * The high-order 25 bits of the Ethernet address are statically assigned, 3954716Ssklower * and the low-order 23 bits are taken from the low end of the IP address. 4054716Ssklower */ 4154716Ssklower #define ETHER_MAP_IP_MULTICAST(ipaddr, enaddr) \ 4254716Ssklower /* struct in_addr *ipaddr; */ \ 4354716Ssklower /* u_char enaddr[6]; */ \ 4454716Ssklower { \ 4554716Ssklower (enaddr)[0] = 0x01; \ 4654716Ssklower (enaddr)[1] = 0x00; \ 4754716Ssklower (enaddr)[2] = 0x5e; \ 4854716Ssklower (enaddr)[3] = ((u_char *)ipaddr)[1] & 0x7f; \ 4954716Ssklower (enaddr)[4] = ((u_char *)ipaddr)[2]; \ 5054716Ssklower (enaddr)[5] = ((u_char *)ipaddr)[3]; \ 5154716Ssklower } 5254716Ssklower #endif 5354716Ssklower 5454716Ssklower /* 5511573Ssam * Ethernet Address Resolution Protocol. 5611573Ssam * 5711573Ssam * See RFC 826 for protocol description. Structure below is adapted 5811573Ssam * to resolving internet addresses. Field names used correspond to 5911573Ssam * RFC 826. 6011573Ssam */ 6111573Ssam struct ether_arp { 6225891Skarels struct arphdr ea_hdr; /* fixed-size header */ 6318641Skarels u_char arp_sha[6]; /* sender hardware address */ 6418641Skarels u_char arp_spa[4]; /* sender protocol address */ 6518641Skarels u_char arp_tha[6]; /* target hardware address */ 6618641Skarels u_char arp_tpa[4]; /* target protocol address */ 6711573Ssam }; 6825891Skarels #define arp_hrd ea_hdr.ar_hrd 6925891Skarels #define arp_pro ea_hdr.ar_pro 7025891Skarels #define arp_hln ea_hdr.ar_hln 7125891Skarels #define arp_pln ea_hdr.ar_pln 7225891Skarels #define arp_op ea_hdr.ar_op 7311573Ssam 7425891Skarels 7511573Ssam /* 7611573Ssam * Structure shared between the ethernet driver modules and 7711573Ssam * the address resolution code. For example, each ec_softc or il_softc 7811573Ssam * begins with this structure. 7911573Ssam */ 8011573Ssam struct arpcom { 8118641Skarels struct ifnet ac_if; /* network-visible interface */ 8218641Skarels u_char ac_enaddr[6]; /* ethernet hardware address */ 8354716Ssklower struct in_addr ac_ipaddr; /* copy of ip address- XXX */ 8454716Ssklower struct ether_multi *ac_multiaddrs; /* list of ether multicast addrs */ 8554716Ssklower int ac_multicnt; /* length of ac_multiaddrs list */ 8611573Ssam }; 8711573Ssam 8850136Ssklower struct llinfo_arp { 8950136Ssklower struct llinfo_arp *la_next; 9050136Ssklower struct llinfo_arp *la_prev; 9150136Ssklower struct rtentry *la_rt; 9250136Ssklower struct mbuf *la_hold; /* last packet until resolved/timeout */ 9350136Ssklower long la_asked; /* last time we QUERIED for this addr */ 9450136Ssklower #define la_timer la_rt->rt_rmx.rmx_expire /* deletion time in seconds */ 9550136Ssklower }; 9650136Ssklower 9750136Ssklower struct sockaddr_inarp { 9850136Ssklower u_char sin_len; 9950136Ssklower u_char sin_family; 10050136Ssklower u_short sin_port; 10150136Ssklower struct in_addr sin_addr; 10250136Ssklower struct in_addr sin_srcaddr; 10350136Ssklower u_short sin_tos; 10450136Ssklower u_short sin_other; 10550136Ssklower #define SIN_PROXY 1 10650136Ssklower }; 10754716Ssklower /* 10854716Ssklower * IP and ethernet specific routing flags 10954716Ssklower */ 11054716Ssklower #define RTF_USETRAILERS RTF_PROTO1 /* use trailers */ 11154716Ssklower #define RTF_ANNOUNCE RTF_PROTO2 /* announce new arp entry */ 11250136Ssklower 11312459Ssam #ifdef KERNEL 11436819Skarels u_char etherbroadcastaddr[6]; 11554716Ssklower u_char ether_ipmulticast_min[6]; 11654716Ssklower u_char ether_ipmulticast_max[6]; 11761331Sbostic struct ifqueue arpintrq; 11854716Ssklower 11950136Ssklower struct llinfo_arp llinfo_arp; /* head of the llinfo queue */ 12052275Storek 12169098Sbostic void arp_rtrequest __P((int, struct rtentry *, struct sockaddr *)); 12261331Sbostic void arpintr __P((void)); 12361331Sbostic int arpresolve __P((struct arpcom *, 12469098Sbostic struct rtentry *, struct mbuf *, struct sockaddr *, u_char *)); 12561331Sbostic void arpwhohas __P((struct arpcom *, struct in_addr *)); 12654716Ssklower 12761331Sbostic int ether_addmulti __P((struct ifreq *, struct arpcom *)); 12861331Sbostic int ether_delmulti __P((struct ifreq *, struct arpcom *)); 12961331Sbostic 13054716Ssklower /* 13154716Ssklower * Ethernet multicast address structure. There is one of these for each 13254716Ssklower * multicast address or range of multicast addresses that we are supposed 13354716Ssklower * to listen to on a particular interface. They are kept in a linked list, 13454716Ssklower * rooted in the interface's arpcom structure. (This really has nothing to 13554716Ssklower * do with ARP, or with the Internet address family, but this appears to be 13654716Ssklower * the minimally-disrupting place to put it.) 13754716Ssklower */ 13854716Ssklower struct ether_multi { 13954716Ssklower u_char enm_addrlo[6]; /* low or only address of range */ 14054716Ssklower u_char enm_addrhi[6]; /* high or only address of range */ 14154716Ssklower struct arpcom *enm_ac; /* back pointer to arpcom */ 14254716Ssklower u_int enm_refcount; /* no. claims to this addr/range */ 14354716Ssklower struct ether_multi *enm_next; /* ptr to next ether_multi */ 14454716Ssklower }; 14554716Ssklower 14654716Ssklower /* 14754716Ssklower * Structure used by macros below to remember position when stepping through 14854716Ssklower * all of the ether_multi records. 14954716Ssklower */ 15054716Ssklower struct ether_multistep { 15154716Ssklower struct ether_multi *e_enm; 15254716Ssklower }; 15354716Ssklower 15454716Ssklower /* 15554716Ssklower * Macro for looking up the ether_multi record for a given range of Ethernet 15654716Ssklower * multicast addresses connected to a given arpcom structure. If no matching 15754716Ssklower * record is found, "enm" returns NULL. 15854716Ssklower */ 15954716Ssklower #define ETHER_LOOKUP_MULTI(addrlo, addrhi, ac, enm) \ 16054716Ssklower /* u_char addrlo[6]; */ \ 16154716Ssklower /* u_char addrhi[6]; */ \ 16254716Ssklower /* struct arpcom *ac; */ \ 16354716Ssklower /* struct ether_multi *enm; */ \ 16454716Ssklower { \ 16554716Ssklower for ((enm) = (ac)->ac_multiaddrs; \ 16654716Ssklower (enm) != NULL && \ 16754716Ssklower (bcmp((enm)->enm_addrlo, (addrlo), 6) != 0 || \ 16854716Ssklower bcmp((enm)->enm_addrhi, (addrhi), 6) != 0); \ 16954716Ssklower (enm) = (enm)->enm_next); \ 17054716Ssklower } 17154716Ssklower 17254716Ssklower /* 17354716Ssklower * Macro to step through all of the ether_multi records, one at a time. 17454716Ssklower * The current position is remembered in "step", which the caller must 17554716Ssklower * provide. ETHER_FIRST_MULTI(), below, must be called to initialize "step" 17654716Ssklower * and get the first record. Both macros return a NULL "enm" when there 17754716Ssklower * are no remaining records. 17854716Ssklower */ 17954716Ssklower #define ETHER_NEXT_MULTI(step, enm) \ 18054716Ssklower /* struct ether_multistep step; */ \ 18154716Ssklower /* struct ether_multi *enm; */ \ 18254716Ssklower { \ 18354716Ssklower if (((enm) = (step).e_enm) != NULL) \ 18454716Ssklower (step).e_enm = (enm)->enm_next; \ 18554716Ssklower } 18654716Ssklower 18754716Ssklower #define ETHER_FIRST_MULTI(step, ac, enm) \ 18854716Ssklower /* struct ether_multistep step; */ \ 18954716Ssklower /* struct arpcom *ac; */ \ 19054716Ssklower /* struct ether_multi *enm; */ \ 19154716Ssklower { \ 19254716Ssklower (step).e_enm = (ac)->ac_multiaddrs; \ 19354716Ssklower ETHER_NEXT_MULTI((step), (enm)); \ 19454716Ssklower } 19561331Sbostic 19611573Ssam #endif 197