|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1982, 1986 Regents of the University of California. ! 3: * All rights reserved. ! 4: * ! 5: * Redistribution and use in source and binary forms are permitted ! 6: * provided that the above copyright notice and this paragraph are ! 7: * duplicated in all such forms and that any documentation, ! 8: * advertising materials, and other materials related to such ! 9: * distribution and use acknowledge that the software was developed ! 10: * by the University of California, Berkeley. The name of the ! 11: * University may not be used to endorse or promote products derived ! 12: * from this software without specific prior written permission. ! 13: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ! 14: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ! 15: * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. ! 16: * ! 17: * @(#)if.h 7.3 (Berkeley) 6/27/88 ! 18: */ ! 19: ! 20: /* ! 21: * Structures defining a network interface, providing a packet ! 22: * transport mechanism (ala level 0 of the PUP protocols). ! 23: * ! 24: * Each interface accepts output datagrams of a specified maximum ! 25: * length, and provides higher level routines with input datagrams ! 26: * received from its medium. ! 27: * ! 28: * Output occurs when the routine if_output is called, with three parameters: ! 29: * (*ifp->if_output)(ifp, m, dst) ! 30: * Here m is the mbuf chain to be sent and dst is the destination address. ! 31: * The output routine encapsulates the supplied datagram if necessary, ! 32: * and then transmits it on its medium. ! 33: * ! 34: * On input, each interface unwraps the data received by it, and either ! 35: * places it on the input queue of a internetwork datagram routine ! 36: * and posts the associated software interrupt, or passes the datagram to a raw ! 37: * packet input routine. ! 38: * ! 39: * Routines exist for locating interfaces by their addresses ! 40: * or for locating a interface on a certain network, as well as more general ! 41: * routing and gateway routines maintaining information used to locate ! 42: * interfaces. These routines live in the files if.c and route.c ! 43: */ ! 44: ! 45: /* ! 46: * Structure defining a queue for a network interface. ! 47: * ! 48: * (Would like to call this struct ``if'', but C isn't PL/1.) ! 49: */ ! 50: struct ifnet { ! 51: char *if_name; /* name, e.g. ``en'' or ``lo'' */ ! 52: short if_unit; /* sub-unit for lower level driver */ ! 53: short if_mtu; /* maximum transmission unit */ ! 54: short if_flags; /* up/down, broadcast, etc. */ ! 55: short if_timer; /* time 'til if_watchdog called */ ! 56: int if_metric; /* routing metric (external only) */ ! 57: struct ifaddr *if_addrlist; /* linked list of addresses per if */ ! 58: struct ifqueue { ! 59: struct mbuf *ifq_head; ! 60: struct mbuf *ifq_tail; ! 61: int ifq_len; ! 62: int ifq_maxlen; ! 63: int ifq_drops; ! 64: } if_snd; /* output queue */ ! 65: /* procedure handles */ ! 66: int (*if_init)(); /* init routine */ ! 67: int (*if_output)(); /* output routine */ ! 68: int (*if_ioctl)(); /* ioctl routine */ ! 69: int (*if_reset)(); /* bus reset routine */ ! 70: int (*if_watchdog)(); /* timer routine */ ! 71: /* generic interface statistics */ ! 72: int if_ipackets; /* packets received on interface */ ! 73: int if_ierrors; /* input errors on interface */ ! 74: int if_opackets; /* packets sent on interface */ ! 75: int if_oerrors; /* output errors on interface */ ! 76: int if_collisions; /* collisions on csma interfaces */ ! 77: /* end statistics */ ! 78: struct ifnet *if_next; ! 79: }; ! 80: ! 81: #define IFF_UP 0x1 /* interface is up */ ! 82: #define IFF_BROADCAST 0x2 /* broadcast address valid */ ! 83: #define IFF_DEBUG 0x4 /* turn on debugging */ ! 84: #define IFF_LOOPBACK 0x8 /* is a loopback net */ ! 85: #define IFF_POINTOPOINT 0x10 /* interface is point-to-point link */ ! 86: #define IFF_NOTRAILERS 0x20 /* avoid use of trailers */ ! 87: #define IFF_RUNNING 0x40 /* resources allocated */ ! 88: #define IFF_NOARP 0x80 /* no address resolution protocol */ ! 89: /* next two not supported now, but reserved: */ ! 90: #define IFF_PROMISC 0x100 /* receive all packets */ ! 91: #define IFF_ALLMULTI 0x200 /* receive all multicast packets */ ! 92: /* flags set internally only: */ ! 93: #define IFF_CANTCHANGE (IFF_BROADCAST | IFF_POINTOPOINT | IFF_RUNNING) ! 94: ! 95: /* ! 96: * Output queues (ifp->if_snd) and internetwork datagram level (pup level 1) ! 97: * input routines have queues of messages stored on ifqueue structures ! 98: * (defined above). Entries are added to and deleted from these structures ! 99: * by these macros, which should be called with ipl raised to splimp(). ! 100: */ ! 101: #define IF_QFULL(ifq) ((ifq)->ifq_len >= (ifq)->ifq_maxlen) ! 102: #define IF_DROP(ifq) ((ifq)->ifq_drops++) ! 103: #define IF_ENQUEUE(ifq, m) { \ ! 104: (m)->m_act = 0; \ ! 105: if ((ifq)->ifq_tail == 0) \ ! 106: (ifq)->ifq_head = m; \ ! 107: else \ ! 108: (ifq)->ifq_tail->m_act = m; \ ! 109: (ifq)->ifq_tail = m; \ ! 110: (ifq)->ifq_len++; \ ! 111: } ! 112: #define IF_PREPEND(ifq, m) { \ ! 113: (m)->m_act = (ifq)->ifq_head; \ ! 114: if ((ifq)->ifq_tail == 0) \ ! 115: (ifq)->ifq_tail = (m); \ ! 116: (ifq)->ifq_head = (m); \ ! 117: (ifq)->ifq_len++; \ ! 118: } ! 119: /* ! 120: * Packets destined for level-1 protocol input routines ! 121: * have a pointer to the receiving interface prepended to the data. ! 122: * IF_DEQUEUEIF extracts and returns this pointer when dequeueing the packet. ! 123: * IF_ADJ should be used otherwise to adjust for its presence. ! 124: */ ! 125: #define IF_ADJ(m) { \ ! 126: (m)->m_off += sizeof(struct ifnet *); \ ! 127: (m)->m_len -= sizeof(struct ifnet *); \ ! 128: if ((m)->m_len == 0) { \ ! 129: struct mbuf *n; \ ! 130: MFREE((m), n); \ ! 131: (m) = n; \ ! 132: } \ ! 133: } ! 134: #define IF_DEQUEUEIF(ifq, m, ifp) { \ ! 135: (m) = (ifq)->ifq_head; \ ! 136: if (m) { \ ! 137: if (((ifq)->ifq_head = (m)->m_act) == 0) \ ! 138: (ifq)->ifq_tail = 0; \ ! 139: (m)->m_act = 0; \ ! 140: (ifq)->ifq_len--; \ ! 141: (ifp) = *(mtod((m), struct ifnet **)); \ ! 142: IF_ADJ(m); \ ! 143: } \ ! 144: } ! 145: #define IF_DEQUEUE(ifq, m) { \ ! 146: (m) = (ifq)->ifq_head; \ ! 147: if (m) { \ ! 148: if (((ifq)->ifq_head = (m)->m_act) == 0) \ ! 149: (ifq)->ifq_tail = 0; \ ! 150: (m)->m_act = 0; \ ! 151: (ifq)->ifq_len--; \ ! 152: } \ ! 153: } ! 154: ! 155: #define IFQ_MAXLEN 50 ! 156: #define IFNET_SLOWHZ 1 /* granularity is 1 second */ ! 157: ! 158: /* ! 159: * The ifaddr structure contains information about one address ! 160: * of an interface. They are maintained by the different address families, ! 161: * are allocated and attached when an address is set, and are linked ! 162: * together so all addresses for an interface can be located. ! 163: */ ! 164: struct ifaddr { ! 165: struct sockaddr ifa_addr; /* address of interface */ ! 166: union { ! 167: struct sockaddr ifu_broadaddr; ! 168: struct sockaddr ifu_dstaddr; ! 169: } ifa_ifu; ! 170: #define ifa_broadaddr ifa_ifu.ifu_broadaddr /* broadcast address */ ! 171: #define ifa_dstaddr ifa_ifu.ifu_dstaddr /* other end of p-to-p link */ ! 172: struct ifnet *ifa_ifp; /* back-pointer to interface */ ! 173: struct ifaddr *ifa_next; /* next address for interface */ ! 174: }; ! 175: ! 176: /* ! 177: * Interface request structure used for socket ! 178: * ioctl's. All interface ioctl's must have parameter ! 179: * definitions which begin with ifr_name. The ! 180: * remainder may be interface specific. ! 181: */ ! 182: struct ifreq { ! 183: #define IFNAMSIZ 16 ! 184: char ifr_name[IFNAMSIZ]; /* if name, e.g. "en0" */ ! 185: union { ! 186: struct sockaddr ifru_addr; ! 187: struct sockaddr ifru_dstaddr; ! 188: struct sockaddr ifru_broadaddr; ! 189: short ifru_flags; ! 190: int ifru_metric; ! 191: caddr_t ifru_data; ! 192: } ifr_ifru; ! 193: #define ifr_addr ifr_ifru.ifru_addr /* address */ ! 194: #define ifr_dstaddr ifr_ifru.ifru_dstaddr /* other end of p-to-p link */ ! 195: #define ifr_broadaddr ifr_ifru.ifru_broadaddr /* broadcast address */ ! 196: #define ifr_flags ifr_ifru.ifru_flags /* flags */ ! 197: #define ifr_metric ifr_ifru.ifru_metric /* metric */ ! 198: #define ifr_data ifr_ifru.ifru_data /* for use by interface */ ! 199: }; ! 200: ! 201: /* ! 202: * Structure used in SIOCGIFCONF request. ! 203: * Used to retrieve interface configuration ! 204: * for machine (useful for programs which ! 205: * must know all networks accessible). ! 206: */ ! 207: struct ifconf { ! 208: int ifc_len; /* size of associated buffer */ ! 209: union { ! 210: caddr_t ifcu_buf; ! 211: struct ifreq *ifcu_req; ! 212: } ifc_ifcu; ! 213: #define ifc_buf ifc_ifcu.ifcu_buf /* buffer address */ ! 214: #define ifc_req ifc_ifcu.ifcu_req /* array of structures returned */ ! 215: }; ! 216: ! 217: #ifdef KERNEL ! 218: #include "../net/if_arp.h" ! 219: struct ifqueue rawintrq; /* raw packet input queue */ ! 220: struct ifnet *ifnet; ! 221: struct ifaddr *ifa_ifwithaddr(), *ifa_ifwithnet(); ! 222: struct ifaddr *ifa_ifwithdstaddr(); ! 223: #else KERNEL ! 224: #include <net/if_arp.h> ! 225: #endif KERNEL
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.