IF_ETHER.H
上传用户:tjbfgc
上传日期:2013-03-31
资源大小:140k
文件大小:8k
源码类别:

网络编程

开发平台:

C/C++

  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.1 (Berkeley) 6/10/93
  34.  */
  35. /*
  36.  * Structure of a 10Mb/s Ethernet header.
  37.  */
  38. struct ether_header {
  39. u_char ether_dhost[6];
  40. u_char ether_shost[6];
  41. u_short ether_type;
  42. };
  43. #define ETHERTYPE_PUP 0x0200 /* PUP protocol */
  44. #define ETHERTYPE_IP 0x0800 /* IP protocol */
  45. #define ETHERTYPE_ARP 0x0806 /* Addr. resolution protocol */
  46. #define ETHERTYPE_REVARP 0x8035 /* reverse Addr. resolution protocol */
  47. /*
  48.  * The ETHERTYPE_NTRAILER packet types starting at ETHERTYPE_TRAIL have
  49.  * (type-ETHERTYPE_TRAIL)*512 bytes of data followed
  50.  * by an ETHER type (as given above) and then the (variable-length) header.
  51.  */
  52. #define ETHERTYPE_TRAIL 0x1000 /* Trailer packet */
  53. #define ETHERTYPE_NTRAILER 16
  54. #define ETHERMTU 1500
  55. #define ETHERMIN (60-14)
  56. #ifdef KERNEL
  57. /*
  58.  * Macro to map an IP multicast address to an Ethernet multicast address.
  59.  * The high-order 25 bits of the Ethernet address are statically assigned,
  60.  * and the low-order 23 bits are taken from the low end of the IP address.
  61.  */
  62. #define ETHER_MAP_IP_MULTICAST(ipaddr, enaddr) 
  63. /* struct in_addr *ipaddr; */ 
  64. /* u_char enaddr[6];    */ 
  65. (enaddr)[0] = 0x01; 
  66. (enaddr)[1] = 0x00; 
  67. (enaddr)[2] = 0x5e; 
  68. (enaddr)[3] = ((u_char *)ipaddr)[1] & 0x7f; 
  69. (enaddr)[4] = ((u_char *)ipaddr)[2]; 
  70. (enaddr)[5] = ((u_char *)ipaddr)[3]; 
  71. }
  72. #endif
  73. /*
  74.  * Ethernet Address Resolution Protocol.
  75.  *
  76.  * See RFC 826 for protocol description.  Structure below is adapted
  77.  * to resolving internet addresses.  Field names used correspond to 
  78.  * RFC 826.
  79.  */
  80. struct ether_arp {
  81. struct arphdr ea_hdr; /* fixed-size header */
  82. u_char arp_sha[6]; /* sender hardware address */
  83. u_char arp_spa[4]; /* sender protocol address */
  84. u_char arp_tha[6]; /* target hardware address */
  85. u_char arp_tpa[4]; /* target protocol address */
  86. };
  87. #define arp_hrd ea_hdr.ar_hrd
  88. #define arp_pro ea_hdr.ar_pro
  89. #define arp_hln ea_hdr.ar_hln
  90. #define arp_pln ea_hdr.ar_pln
  91. #define arp_op ea_hdr.ar_op
  92. /*
  93.  * Structure shared between the ethernet driver modules and
  94.  * the address resolution code.  For example, each ec_softc or il_softc
  95.  * begins with this structure.
  96.  */
  97. struct arpcom {
  98. struct  ifnet ac_if; /* network-visible interface */
  99. u_char ac_enaddr[6]; /* ethernet hardware address */
  100. struct in_addr ac_ipaddr; /* copy of ip address- XXX */
  101. struct ether_multi *ac_multiaddrs; /* list of ether multicast addrs */
  102. int ac_multicnt; /* length of ac_multiaddrs list */
  103. };
  104. struct llinfo_arp {
  105. struct llinfo_arp *la_next;
  106. struct llinfo_arp *la_prev;
  107. struct rtentry *la_rt;
  108. struct mbuf *la_hold; /* last packet until resolved/timeout */
  109. long la_asked; /* last time we QUERIED for this addr */
  110. #define la_timer la_rt->rt_rmx.rmx_expire /* deletion time in seconds */
  111. };
  112. struct sockaddr_inarp {
  113. u_char sin_len;
  114. u_char sin_family;
  115. u_short sin_port;
  116. struct in_addr sin_addr;
  117. struct in_addr sin_srcaddr;
  118. u_short sin_tos;
  119. u_short sin_other;
  120. #define SIN_PROXY 1
  121. };
  122. /*
  123.  * IP and ethernet specific routing flags
  124.  */
  125. #define RTF_USETRAILERS RTF_PROTO1 /* use trailers */
  126. #define RTF_ANNOUNCE RTF_PROTO2 /* announce new arp entry */
  127. #ifdef KERNEL
  128. u_char etherbroadcastaddr[6];
  129. u_char ether_ipmulticast_min[6];
  130. u_char ether_ipmulticast_max[6];
  131. struct ifqueue arpintrq;
  132. struct llinfo_arp *arptnew __P((struct in_addr *));
  133. struct llinfo_arp llinfo_arp; /* head of the llinfo queue */
  134. void arpwhohas __P((struct arpcom *, struct in_addr *));
  135. void arpintr __P((void));
  136. int arpresolve __P((struct arpcom *,
  137.    struct rtentry *, struct mbuf *, struct sockaddr *, u_char *));
  138. void arp_rtrequest __P((int, struct rtentry *, struct sockaddr *));
  139. void arpwhohas __P((struct arpcom *, struct in_addr *));
  140. int ether_addmulti __P((struct ifreq *, struct arpcom *));
  141. int ether_delmulti __P((struct ifreq *, struct arpcom *));
  142. /*
  143.  * Ethernet multicast address structure.  There is one of these for each
  144.  * multicast address or range of multicast addresses that we are supposed
  145.  * to listen to on a particular interface.  They are kept in a linked list,
  146.  * rooted in the interface's arpcom structure.  (This really has nothing to
  147.  * do with ARP, or with the Internet address family, but this appears to be
  148.  * the minimally-disrupting place to put it.)
  149.  */
  150. struct ether_multi {
  151. u_char enm_addrlo[6]; /* low  or only address of range */
  152. u_char enm_addrhi[6]; /* high or only address of range */
  153. struct arpcom *enm_ac; /* back pointer to arpcom */
  154. u_int enm_refcount; /* no. claims to this addr/range */
  155. struct ether_multi *enm_next; /* ptr to next ether_multi */
  156. };
  157. /*
  158.  * Structure used by macros below to remember position when stepping through
  159.  * all of the ether_multi records.
  160.  */
  161. struct ether_multistep {
  162. struct ether_multi  *e_enm;
  163. };
  164. /*
  165.  * Macro for looking up the ether_multi record for a given range of Ethernet
  166.  * multicast addresses connected to a given arpcom structure.  If no matching
  167.  * record is found, "enm" returns NULL.
  168.  */
  169. #define ETHER_LOOKUP_MULTI(addrlo, addrhi, ac, enm) 
  170. /* u_char addrlo[6]; */ 
  171. /* u_char addrhi[6]; */ 
  172. /* struct arpcom *ac; */ 
  173. /* struct ether_multi *enm; */ 
  174. for ((enm) = (ac)->ac_multiaddrs; 
  175.     (enm) != NULL && 
  176.     (bcmp((enm)->enm_addrlo, (addrlo), 6) != 0 || 
  177.      bcmp((enm)->enm_addrhi, (addrhi), 6) != 0); 
  178. (enm) = (enm)->enm_next); 
  179. }
  180. /*
  181.  * Macro to step through all of the ether_multi records, one at a time.
  182.  * The current position is remembered in "step", which the caller must
  183.  * provide.  ETHER_FIRST_MULTI(), below, must be called to initialize "step"
  184.  * and get the first record.  Both macros return a NULL "enm" when there
  185.  * are no remaining records.
  186.  */
  187. #define ETHER_NEXT_MULTI(step, enm) 
  188. /* struct ether_multistep step; */  
  189. /* struct ether_multi *enm; */  
  190. if (((enm) = (step).e_enm) != NULL) 
  191. (step).e_enm = (enm)->enm_next; 
  192. }
  193. #define ETHER_FIRST_MULTI(step, ac, enm) 
  194. /* struct ether_multistep step; */ 
  195. /* struct arpcom *ac; */ 
  196. /* struct ether_multi *enm; */ 
  197. (step).e_enm = (ac)->ac_multiaddrs; 
  198. ETHER_NEXT_MULTI((step), (enm)); 
  199. }
  200. #endif