1: /* Interface related header.
2: Copyright (C) 1997, 98, 99 Kunihiro Ishiguro
3:
4: This file is part of GNU Zebra.
5:
6: GNU Zebra is free software; you can redistribute it and/or modify
7: it under the terms of the GNU General Public License as published
8: by the Free Software Foundation; either version 2, or (at your
9: option) any later version.
10:
11: GNU Zebra is distributed in the hope that it will be useful, but
12: WITHOUT ANY WARRANTY; without even the implied warranty of
13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14: General Public License for more details.
15:
16: You should have received a copy of the GNU General Public License
17: along with GNU Zebra; see the file COPYING. If not, write to the
18: Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19: Boston, MA 02111-1307, USA. */
20:
21: #ifndef _ZEBRA_IF_H
22: #define _ZEBRA_IF_H
23:
24: #include "zebra.h"
25: #include "linklist.h"
26:
27: /* Interface link-layer type, if known. Derived from:
28: *
29: * net/if_arp.h on various platforms - Linux especially.
30: * http://www.iana.org/assignments/arp-parameters/arp-parameters.xhtml
31: *
32: * Some of the more obviously defunct technologies left out.
33: */
34: enum zebra_link_type {
35: ZEBRA_LLT_UNKNOWN = 0,
36: ZEBRA_LLT_ETHER,
37: ZEBRA_LLT_EETHER,
38: ZEBRA_LLT_AX25,
39: ZEBRA_LLT_PRONET,
40: ZEBRA_LLT_IEEE802,
41: ZEBRA_LLT_ARCNET,
42: ZEBRA_LLT_APPLETLK,
43: ZEBRA_LLT_DLCI,
44: ZEBRA_LLT_ATM,
45: ZEBRA_LLT_METRICOM,
46: ZEBRA_LLT_IEEE1394,
47: ZEBRA_LLT_EUI64,
48: ZEBRA_LLT_INFINIBAND,
49: ZEBRA_LLT_SLIP,
50: ZEBRA_LLT_CSLIP,
51: ZEBRA_LLT_SLIP6,
52: ZEBRA_LLT_CSLIP6,
53: ZEBRA_LLT_RSRVD,
54: ZEBRA_LLT_ADAPT,
55: ZEBRA_LLT_ROSE,
56: ZEBRA_LLT_X25,
57: ZEBRA_LLT_PPP,
58: ZEBRA_LLT_CHDLC,
59: ZEBRA_LLT_LAPB,
60: ZEBRA_LLT_RAWHDLC,
61: ZEBRA_LLT_IPIP,
62: ZEBRA_LLT_IPIP6,
63: ZEBRA_LLT_FRAD,
64: ZEBRA_LLT_SKIP,
65: ZEBRA_LLT_LOOPBACK,
66: ZEBRA_LLT_LOCALTLK,
67: ZEBRA_LLT_FDDI,
68: ZEBRA_LLT_SIT,
69: ZEBRA_LLT_IPDDP,
70: ZEBRA_LLT_IPGRE,
71: ZEBRA_LLT_IP6GRE,
72: ZEBRA_LLT_PIMREG,
73: ZEBRA_LLT_HIPPI,
74: ZEBRA_LLT_ECONET,
75: ZEBRA_LLT_IRDA,
76: ZEBRA_LLT_FCPP,
77: ZEBRA_LLT_FCAL,
78: ZEBRA_LLT_FCPL,
79: ZEBRA_LLT_FCFABRIC,
80: ZEBRA_LLT_IEEE802_TR,
81: ZEBRA_LLT_IEEE80211,
82: ZEBRA_LLT_IEEE80211_RADIOTAP,
83: ZEBRA_LLT_IEEE802154,
84: ZEBRA_LLT_IEEE802154_PHY,
85: };
86:
87: /*
88: Interface name length.
89:
90: Linux define value in /usr/include/linux/if.h.
91: #define IFNAMSIZ 16
92:
93: FreeBSD define value in /usr/include/net/if.h.
94: #define IFNAMSIZ 16
95: */
96:
97: #define INTERFACE_NAMSIZ 20
98: #define INTERFACE_HWADDR_MAX 20
99:
100: typedef signed int ifindex_t;
101:
102: #ifdef HAVE_PROC_NET_DEV
103: struct if_stats
104: {
105: unsigned long rx_packets; /* total packets received */
106: unsigned long tx_packets; /* total packets transmitted */
107: unsigned long rx_bytes; /* total bytes received */
108: unsigned long tx_bytes; /* total bytes transmitted */
109: unsigned long rx_errors; /* bad packets received */
110: unsigned long tx_errors; /* packet transmit problems */
111: unsigned long rx_dropped; /* no space in linux buffers */
112: unsigned long tx_dropped; /* no space available in linux */
113: unsigned long rx_multicast; /* multicast packets received */
114: unsigned long rx_compressed;
115: unsigned long tx_compressed;
116: unsigned long collisions;
117:
118: /* detailed rx_errors: */
119: unsigned long rx_length_errors;
120: unsigned long rx_over_errors; /* receiver ring buff overflow */
121: unsigned long rx_crc_errors; /* recved pkt with crc error */
122: unsigned long rx_frame_errors; /* recv'd frame alignment error */
123: unsigned long rx_fifo_errors; /* recv'r fifo overrun */
124: unsigned long rx_missed_errors; /* receiver missed packet */
125: /* detailed tx_errors */
126: unsigned long tx_aborted_errors;
127: unsigned long tx_carrier_errors;
128: unsigned long tx_fifo_errors;
129: unsigned long tx_heartbeat_errors;
130: unsigned long tx_window_errors;
131: };
132: #endif /* HAVE_PROC_NET_DEV */
133:
134: /* Interface structure */
135: struct interface
136: {
137: /* Interface name. This should probably never be changed after the
138: interface is created, because the configuration info for this interface
139: is associated with this structure. For that reason, the interface
140: should also never be deleted (to avoid losing configuration info).
141: To delete, just set ifindex to IFINDEX_INTERNAL to indicate that the
142: interface does not exist in the kernel.
143: */
144: char name[INTERFACE_NAMSIZ + 1];
145:
146: /* Interface index (should be IFINDEX_INTERNAL for non-kernel or
147: deleted interfaces). */
148: ifindex_t ifindex;
149: #define IFINDEX_INTERNAL 0
150:
151: /* Zebra internal interface status */
152: u_char status;
153: #define ZEBRA_INTERFACE_ACTIVE (1 << 0)
154: #define ZEBRA_INTERFACE_SUB (1 << 1)
155: #define ZEBRA_INTERFACE_LINKDETECTION (1 << 2)
156:
157: /* Interface flags. */
158: uint64_t flags;
159:
160: /* Interface metric */
161: int metric;
162:
163: /* Interface MTU. */
164: unsigned int mtu; /* IPv4 MTU */
165: unsigned int mtu6; /* IPv6 MTU - probably, but not neccessarily same as mtu */
166:
167: /* Link-layer information and hardware address */
168: enum zebra_link_type ll_type;
169: u_char hw_addr[INTERFACE_HWADDR_MAX];
170: int hw_addr_len;
171:
172: /* interface bandwidth, kbits */
173: unsigned int bandwidth;
174:
175: /* description of the interface. */
176: char *desc;
177:
178: /* Distribute list. */
179: void *distribute_in;
180: void *distribute_out;
181:
182: /* Connected address list. */
183: struct list *connected;
184:
185: /* Daemon specific interface data pointer. */
186: void *info;
187:
188: /* Statistics fileds. */
189: #ifdef HAVE_PROC_NET_DEV
190: struct if_stats stats;
191: #endif /* HAVE_PROC_NET_DEV */
192: #ifdef HAVE_NET_RT_IFLIST
193: struct if_data stats;
194: #endif /* HAVE_NET_RT_IFLIST */
195:
196: vrf_id_t vrf_id;
197: };
198:
199: /* Connected address structure. */
200: struct connected
201: {
202: /* Attached interface. */
203: struct interface *ifp;
204:
205: /* Flags for configuration. */
206: u_char conf;
207: #define ZEBRA_IFC_REAL (1 << 0)
208: #define ZEBRA_IFC_CONFIGURED (1 << 1)
209: #define ZEBRA_IFC_QUEUED (1 << 2)
210: /*
211: The ZEBRA_IFC_REAL flag should be set if and only if this address
212: exists in the kernel and is actually usable. (A case where it exists but
213: is not yet usable would be IPv6 with DAD)
214: The ZEBRA_IFC_CONFIGURED flag should be set if and only if this address
215: was configured by the user from inside quagga.
216: The ZEBRA_IFC_QUEUED flag should be set if and only if the address exists
217: in the kernel. It may and should be set although the address might not be
218: usable yet. (compare with ZEBRA_IFC_REAL)
219: */
220:
221: /* Flags for connected address. */
222: u_char flags;
223: #define ZEBRA_IFA_SECONDARY (1 << 0)
224: #define ZEBRA_IFA_PEER (1 << 1)
225: /* N.B. the ZEBRA_IFA_PEER flag should be set if and only if
226: a peer address has been configured. If this flag is set,
227: the destination field must contain the peer address.
228: Otherwise, if this flag is not set, the destination address
229: will either contain a broadcast address or be NULL.
230: */
231:
232: /* Address of connected network. */
233: struct prefix *address;
234:
235: /* Peer or Broadcast address, depending on whether ZEBRA_IFA_PEER is set.
236: Note: destination may be NULL if ZEBRA_IFA_PEER is not set. */
237: struct prefix *destination;
238:
239: /* Label for Linux 2.2.X and upper. */
240: char *label;
241: };
242:
243: /* Does the destination field contain a peer address? */
244: #define CONNECTED_PEER(C) CHECK_FLAG((C)->flags, ZEBRA_IFA_PEER)
245:
246: /* Prefix to insert into the RIB */
247: #define CONNECTED_PREFIX(C) \
248: (CONNECTED_PEER(C) ? (C)->destination : (C)->address)
249:
250: /* Identifying address. We guess that if there's a peer address, but the
251: local address is in the same prefix, then the local address may be unique. */
252: #define CONNECTED_ID(C) \
253: ((CONNECTED_PEER(C) && !prefix_match((C)->destination, (C)->address)) ?\
254: (C)->destination : (C)->address)
255:
256: /* Interface hook sort. */
257: #define IF_NEW_HOOK 0
258: #define IF_DELETE_HOOK 1
259:
260: /* There are some interface flags which are only supported by some
261: operating system. */
262:
263: #ifndef IFF_NOTRAILERS
264: #define IFF_NOTRAILERS 0x0
265: #endif /* IFF_NOTRAILERS */
266: #ifndef IFF_OACTIVE
267: #define IFF_OACTIVE 0x0
268: #endif /* IFF_OACTIVE */
269: #ifndef IFF_SIMPLEX
270: #define IFF_SIMPLEX 0x0
271: #endif /* IFF_SIMPLEX */
272: #ifndef IFF_LINK0
273: #define IFF_LINK0 0x0
274: #endif /* IFF_LINK0 */
275: #ifndef IFF_LINK1
276: #define IFF_LINK1 0x0
277: #endif /* IFF_LINK1 */
278: #ifndef IFF_LINK2
279: #define IFF_LINK2 0x0
280: #endif /* IFF_LINK2 */
281: #ifndef IFF_NOXMIT
282: #define IFF_NOXMIT 0x0
283: #endif /* IFF_NOXMIT */
284: #ifndef IFF_NORTEXCH
285: #define IFF_NORTEXCH 0x0
286: #endif /* IFF_NORTEXCH */
287: #ifndef IFF_IPV4
288: #define IFF_IPV4 0x0
289: #endif /* IFF_IPV4 */
290: #ifndef IFF_IPV6
291: #define IFF_IPV6 0x0
292: #endif /* IFF_IPV6 */
293: #ifndef IFF_VIRTUAL
294: #define IFF_VIRTUAL 0x0
295: #endif /* IFF_VIRTUAL */
296:
297: /* Prototypes. */
298: extern int if_cmp_func (struct interface *, struct interface *);
299: extern struct interface *if_create (const char *name, int namelen);
300: extern struct interface *if_lookup_by_index (ifindex_t);
301: extern struct interface *if_lookup_exact_address (struct in_addr);
302: extern struct interface *if_lookup_address (struct in_addr);
303: extern struct interface *if_lookup_prefix (struct prefix *prefix);
304:
305: extern struct interface *if_create_vrf (const char *name, int namelen,
306: vrf_id_t vrf_id);
307: extern struct interface *if_lookup_by_index_vrf (ifindex_t, vrf_id_t vrf_id);
308: extern struct interface *if_lookup_exact_address_vrf (struct in_addr,
309: vrf_id_t vrf_id);
310: extern struct interface *if_lookup_address_vrf (struct in_addr,
311: vrf_id_t vrf_id);
312: extern struct interface *if_lookup_prefix_vrf (struct prefix *prefix,
313: vrf_id_t vrf_id);
314:
315: /* These 2 functions are to be used when the ifname argument is terminated
316: by a '\0' character: */
317: extern struct interface *if_lookup_by_name (const char *ifname);
318: extern struct interface *if_get_by_name (const char *ifname);
319:
320: extern struct interface *if_lookup_by_name_vrf (const char *ifname,
321: vrf_id_t vrf_id);
322: extern struct interface *if_get_by_name_vrf (const char *ifname,
323: vrf_id_t vrf_id);
324:
325: /* For these 2 functions, the namelen argument should be the precise length
326: of the ifname string (not counting any optional trailing '\0' character).
327: In most cases, strnlen should be used to calculate the namelen value. */
328: extern struct interface *if_lookup_by_name_len(const char *ifname,
329: size_t namelen);
330: extern struct interface *if_get_by_name_len(const char *ifname,size_t namelen);
331:
332: extern struct interface *if_lookup_by_name_len_vrf(const char *ifname,
333: size_t namelen, vrf_id_t vrf_id);
334: extern struct interface *if_get_by_name_len_vrf(const char *ifname,
335: size_t namelen, vrf_id_t vrf_id);
336:
337:
338: /* Delete the interface, but do not free the structure, and leave it in the
339: interface list. It is often advisable to leave the pseudo interface
340: structure because there may be configuration information attached. */
341: extern void if_delete_retain (struct interface *);
342:
343: /* Delete and free the interface structure: calls if_delete_retain and then
344: deletes it from the interface list and frees the structure. */
345: extern void if_delete (struct interface *);
346:
347: extern int if_is_up (struct interface *);
348: extern int if_is_running (struct interface *);
349: extern int if_is_operative (struct interface *);
350: extern int if_is_loopback (struct interface *);
351: extern int if_is_broadcast (struct interface *);
352: extern int if_is_pointopoint (struct interface *);
353: extern int if_is_multicast (struct interface *);
354: extern void if_add_hook (int, int (*)(struct interface *));
355: extern void if_init (vrf_id_t, struct list **);
356: extern void if_terminate (vrf_id_t, struct list **);
357: extern void if_dump_all (void);
358: extern const char *if_flag_dump(unsigned long);
359: extern const char *if_link_type_str (enum zebra_link_type);
360:
361: /* Please use ifindex2ifname instead of if_indextoname where possible;
362: ifindex2ifname uses internal interface info, whereas if_indextoname must
363: make a system call. */
364: extern const char *ifindex2ifname (ifindex_t);
365: extern const char *ifindex2ifname_vrf (ifindex_t, vrf_id_t vrf_id);
366:
367: /* Please use ifname2ifindex instead of if_nametoindex where possible;
368: ifname2ifindex uses internal interface info, whereas if_nametoindex must
369: make a system call. */
370: extern ifindex_t ifname2ifindex(const char *ifname);
371: extern ifindex_t ifname2ifindex_vrf(const char *ifname, vrf_id_t vrf_id);
372:
373: /* Connected address functions. */
374: extern struct connected *connected_new (void);
375: extern void connected_free (struct connected *);
376: extern void connected_add (struct interface *, struct connected *);
377: extern struct connected *connected_add_by_prefix (struct interface *,
378: struct prefix *,
379: struct prefix *);
380: extern struct connected *connected_delete_by_prefix (struct interface *,
381: struct prefix *);
382: extern struct connected *connected_lookup_address (struct interface *,
383: struct in_addr);
384:
385: #ifndef HAVE_IF_NAMETOINDEX
386: extern ifindex_t if_nametoindex (const char *);
387: #endif
388: #ifndef HAVE_IF_INDEXTONAME
389: extern char *if_indextoname (ifindex_t, char *);
390: #endif
391:
392: /* Exported variables. */
393: extern struct list *iflist;
394: extern struct cmd_element interface_desc_cmd;
395: extern struct cmd_element no_interface_desc_cmd;
396: extern struct cmd_element interface_cmd;
397: extern struct cmd_element no_interface_cmd;
398: extern struct cmd_element interface_vrf_cmd;
399: extern struct cmd_element no_interface_vrf_cmd;
400: extern struct cmd_element interface_pseudo_cmd;
401: extern struct cmd_element no_interface_pseudo_cmd;
402: extern struct cmd_element show_address_cmd;
403: extern struct cmd_element show_address_vrf_cmd;
404: extern struct cmd_element show_address_vrf_all_cmd;
405:
406: #endif /* _ZEBRA_IF_H */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>