remove duplicate copyright crap
[unix-history] / usr / src / sys / netinet / if_ether.h
index b36ae59..2c7ae3a 100644 (file)
@@ -2,19 +2,9 @@
  * Copyright (c) 1982, 1986 Regents of the University of California.
  * All rights reserved.
  *
  * Copyright (c) 1982, 1986 Regents of the University of California.
  * All rights reserved.
  *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by the University of California, Berkeley.  The name of the
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ * %sccs.include.redist.c%
  *
  *
- *     @(#)if_ether.h  7.3 (Berkeley) %G%
+ *     @(#)if_ether.h  7.8 (Berkeley) %G%
  */
 
 /*
  */
 
 /*
@@ -26,9 +16,10 @@ struct       ether_header {
        u_short ether_type;
 };
 
        u_short ether_type;
 };
 
-#define        ETHERTYPE_PUP   0x0200          /* PUP protocol */
-#define        ETHERTYPE_IP    0x0800          /* IP protocol */
-#define ETHERTYPE_ARP  0x0806          /* Addr. resolution protocol */
+#define        ETHERTYPE_PUP           0x0200  /* PUP protocol */
+#define        ETHERTYPE_IP            0x0800  /* IP protocol */
+#define ETHERTYPE_ARP          0x0806  /* Addr. resolution protocol */
+#define ETHERTYPE_REVARP       0x8035  /* reverse Addr. resolution protocol */
 
 /*
  * The ETHERTYPE_NTRAILER packet types starting at ETHERTYPE_TRAIL have
 
 /*
  * The ETHERTYPE_NTRAILER packet types starting at ETHERTYPE_TRAIL have
@@ -41,6 +32,25 @@ struct       ether_header {
 #define        ETHERMTU        1500
 #define        ETHERMIN        (60-14)
 
 #define        ETHERMTU        1500
 #define        ETHERMIN        (60-14)
 
+#ifdef KERNEL
+/*
+ * Macro to map an IP multicast address to an Ethernet multicast address.
+ * The high-order 25 bits of the Ethernet address are statically assigned,
+ * and the low-order 23 bits are taken from the low end of the IP address.
+ */
+#define ETHER_MAP_IP_MULTICAST(ipaddr, enaddr) \
+       /* struct in_addr *ipaddr; */ \
+       /* u_char enaddr[6];       */ \
+{ \
+       (enaddr)[0] = 0x01; \
+       (enaddr)[1] = 0x00; \
+       (enaddr)[2] = 0x5e; \
+       (enaddr)[3] = ((u_char *)ipaddr)[1] & 0x7f; \
+       (enaddr)[4] = ((u_char *)ipaddr)[2]; \
+       (enaddr)[5] = ((u_char *)ipaddr)[3]; \
+}
+#endif
+
 /*
  * Ethernet Address Resolution Protocol.
  *
 /*
  * Ethernet Address Resolution Protocol.
  *
@@ -70,7 +80,9 @@ struct        ether_arp {
 struct arpcom {
        struct  ifnet ac_if;            /* network-visible interface */
        u_char  ac_enaddr[6];           /* ethernet hardware address */
 struct arpcom {
        struct  ifnet ac_if;            /* network-visible interface */
        u_char  ac_enaddr[6];           /* ethernet hardware address */
-       struct in_addr ac_ipaddr;       /* copy of ip address- XXX */
+       struct  in_addr ac_ipaddr;      /* copy of ip address- XXX */
+       struct  ether_multi *ac_multiaddrs; /* list of ether multicast addrs */
+       int     ac_multicnt;            /* length of ac_multiaddrs list */      
 };
 
 /*
 };
 
 /*
@@ -82,10 +94,123 @@ struct     arptab {
        u_char  at_timer;               /* minutes since last reference */
        u_char  at_flags;               /* flags */
        struct  mbuf *at_hold;          /* last packet until resolved/timeout */
        u_char  at_timer;               /* minutes since last reference */
        u_char  at_flags;               /* flags */
        struct  mbuf *at_hold;          /* last packet until resolved/timeout */
+}; /* XXX: only used to define SIOCGARP, which is no longer supported */
+
+struct llinfo_arp {                            
+       struct  llinfo_arp *la_next;
+       struct  llinfo_arp *la_prev;
+       struct  rtentry *la_rt;
+       struct  mbuf *la_hold;          /* last packet until resolved/timeout */
+       long    la_asked;               /* last time we QUERIED for this addr */
+#define la_timer la_rt->rt_rmx.rmx_expire /* deletion time in seconds */
 };
 
 };
 
+struct sockaddr_inarp {
+       u_char  sin_len;
+       u_char  sin_family;
+       u_short sin_port;
+       struct  in_addr sin_addr;
+       struct  in_addr sin_srcaddr;
+       u_short sin_tos;
+       u_short sin_other;
+#define SIN_PROXY 1
+};
+/*
+ * IP and ethernet specific routing flags
+ */
+#define        RTF_USETRAILERS RTF_PROTO1      /* use trailers */
+#define RTF_ANNOUNCE   RTF_PROTO2      /* announce new arp entry */
+
 #ifdef KERNEL
 #ifdef KERNEL
-u_char etherbroadcastaddr[6];
-struct arptab *arptnew();
-char *ether_sprintf();
+u_char etherbroadcastaddr[6];
+#if defined(ISO) && !defined(MULTICAST)
+#define MULTICAST 1
+#endif
+#ifdef MULTICAST
+u_char ether_ipmulticast_min[6];
+u_char ether_ipmulticast_max[6];
+#endif
+
+struct llinfo_arp *arptnew __P((struct in_addr *));
+struct llinfo_arp llinfo_arp;          /* head of the llinfo queue */
+int    ether_output __P((struct ifnet *, struct mbuf *, struct sockaddr *,
+                         struct rtentry *));
+int    ether_input __P((struct ifnet *, struct ether_header *, struct mbuf *));
+char   *ether_sprintf __P((u_char *));
+void   arp_rtrequest __P((int, struct rtentry *, struct sockaddr *));
+struct ifqueue arpintrq;
+
+/* XXX These probably belong elsewhere */
+void   in_arpinput __P((struct mbuf *));
+void   arpwhohas __P((struct arpcom *, struct in_addr *));
+
+#ifdef MULTICAST
+/*
+ * Ethernet multicast address structure.  There is one of these for each
+ * multicast address or range of multicast addresses that we are supposed
+ * to listen to on a particular interface.  They are kept in a linked list,
+ * rooted in the interface's arpcom structure.  (This really has nothing to
+ * do with ARP, or with the Internet address family, but this appears to be
+ * the minimally-disrupting place to put it.)
+ */
+struct ether_multi {
+       u_char  enm_addrlo[6];          /* low  or only address of range */
+       u_char  enm_addrhi[6];          /* high or only address of range */
+       struct  arpcom *enm_ac;         /* back pointer to arpcom */
+       u_int   enm_refcount;           /* no. claims to this addr/range */
+       struct  ether_multi *enm_next;  /* ptr to next ether_multi */
+};
+
+#ifdef KERNEL
+/*
+ * Structure used by macros below to remember position when stepping through
+ * all of the ether_multi records.
+ */
+struct ether_multistep {
+       struct ether_multi  *e_enm;
+};
+
+/*
+ * Macro for looking up the ether_multi record for a given range of Ethernet
+ * multicast addresses connected to a given arpcom structure.  If no matching
+ * record is found, "enm" returns NULL.
+ */
+#define ETHER_LOOKUP_MULTI(addrlo, addrhi, ac, enm) \
+       /* u_char addrlo[6]; */ \
+       /* u_char addrhi[6]; */ \
+       /* struct arpcom *ac; */ \
+       /* struct ether_multi *enm; */ \
+{ \
+       for ((enm) = (ac)->ac_multiaddrs; \
+           (enm) != NULL && \
+           (bcmp((enm)->enm_addrlo, (addrlo), 6) != 0 || \
+            bcmp((enm)->enm_addrhi, (addrhi), 6) != 0); \
+               (enm) = (enm)->enm_next); \
+}
+
+/*
+ * Macro to step through all of the ether_multi records, one at a time.
+ * The current position is remembered in "step", which the caller must
+ * provide.  ETHER_FIRST_MULTI(), below, must be called to initialize "step"
+ * and get the first record.  Both macros return a NULL "enm" when there
+ * are no remaining records.
+ */
+#define ETHER_NEXT_MULTI(step, enm) \
+       /* struct ether_multistep step; */  \
+       /* struct ether_multi *enm; */  \
+{ \
+       if (((enm) = (step).e_enm) != NULL) \
+               (step).e_enm = (enm)->enm_next; \
+}
+
+#define ETHER_FIRST_MULTI(step, ac, enm) \
+       /* struct ether_multistep step; */ \
+       /* struct arpcom *ac; */ \
+       /* struct ether_multi *enm; */ \
+{ \
+       (step).e_enm = (ac)->ac_multiaddrs; \
+       ETHER_NEXT_MULTI((step), (enm)); \
+}
+#endif
+#endif
 #endif
 #endif