1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 #ifndef _NET_IF_H_
36 #define _NET_IF_H_
37
38 #include <sys/queue.h>
39
40
41
42
43
44
45
46 #include <altq/if_altq.h>
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73 #include <sys/time.h>
74
75 struct mbuf;
76 struct proc;
77 struct rtentry;
78 struct socket;
79 struct ether_header;
80 struct arpcom;
81 struct rt_addrinfo;
82
83
84
85
86 struct if_clone {
87 LIST_ENTRY(if_clone) ifc_list;
88 const char *ifc_name;
89 size_t ifc_namelen;
90
91 int (*ifc_create)(struct if_clone *, int);
92 int (*ifc_destroy)(struct ifnet *);
93 };
94
95 #define IF_CLONE_INITIALIZER(name, create, destroy) \
96 { { 0 }, name, sizeof(name) - 1, create, destroy }
97
98
99
100
101 struct if_clonereq {
102 int ifcr_total;
103 int ifcr_count;
104 char *ifcr_buffer;
105 };
106
107
108
109
110
111 struct if_data {
112
113 u_char ifi_type;
114 u_char ifi_addrlen;
115 u_char ifi_hdrlen;
116 u_char ifi_link_state;
117 u_long ifi_mtu;
118 u_long ifi_metric;
119 u_long ifi_baudrate;
120
121 u_long ifi_ipackets;
122 u_long ifi_ierrors;
123 u_long ifi_opackets;
124 u_long ifi_oerrors;
125 u_long ifi_collisions;
126 u_long ifi_ibytes;
127 u_long ifi_obytes;
128 u_long ifi_imcasts;
129 u_long ifi_omcasts;
130 u_long ifi_iqdrops;
131 u_long ifi_noproto;
132 struct timeval ifi_lastchange;
133 };
134
135
136
137
138 struct ifqueue {
139 struct mbuf *ifq_head;
140 struct mbuf *ifq_tail;
141 int ifq_len;
142 int ifq_maxlen;
143 int ifq_drops;
144 struct timeout *ifq_congestion;
145 };
146
147
148
149
150 #define LINK_STATE_UNKNOWN 0
151 #define LINK_STATE_DOWN 1
152 #define LINK_STATE_UP 2
153 #define LINK_STATE_HALF_DUPLEX 3
154 #define LINK_STATE_FULL_DUPLEX 4
155 #define LINK_STATE_IS_UP(_s) ((_s) >= LINK_STATE_UP)
156
157
158
159
160
161
162 TAILQ_HEAD(ifnet_head, ifnet);
163
164
165
166
167
168 #define IFNAMSIZ 16
169 #define IF_NAMESIZE IFNAMSIZ
170
171
172
173
174 #define IFDESCRSIZE 64
175
176 struct ifnet {
177 void *if_softc;
178 TAILQ_ENTRY(ifnet) if_list;
179 TAILQ_HEAD(, ifaddr) if_addrlist;
180 TAILQ_HEAD(, ifg_list) if_groups;
181 struct hook_desc_head *if_addrhooks;
182 struct hook_desc_head *if_linkstatehooks;
183 struct hook_desc_head *if_detachhooks;
184 char if_xname[IFNAMSIZ];
185 int if_pcount;
186 caddr_t if_bpf;
187 caddr_t if_bridge;
188 caddr_t if_tp;
189 caddr_t if_pf_kif;
190 union {
191 caddr_t carp_s;
192 struct ifnet *carp_d;
193 } if_carp_ptr;
194 #define if_carp if_carp_ptr.carp_s
195 #define if_carpdev if_carp_ptr.carp_d
196 u_short if_index;
197 short if_timer;
198 short if_flags;
199 struct if_data if_data;
200 u_int32_t if_hardmtu;
201 int if_capabilities;
202 char if_description[IFDESCRSIZE];
203 u_short if_rtlabelid;
204
205
206
207 int (*if_output)(struct ifnet *, struct mbuf *, struct sockaddr *,
208 struct rtentry *);
209
210 void (*if_start)(struct ifnet *);
211
212 int (*if_ioctl)(struct ifnet *, u_long, caddr_t);
213
214 int (*if_init)(struct ifnet *);
215
216 int (*if_reset)(struct ifnet *);
217
218 void (*if_watchdog)(struct ifnet *);
219 struct ifaltq if_snd;
220 struct sockaddr_dl *if_sadl;
221
222 void *if_afdata[AF_MAX];
223 };
224 #define if_mtu if_data.ifi_mtu
225 #define if_type if_data.ifi_type
226 #define if_addrlen if_data.ifi_addrlen
227 #define if_hdrlen if_data.ifi_hdrlen
228 #define if_metric if_data.ifi_metric
229 #define if_link_state if_data.ifi_link_state
230 #define if_baudrate if_data.ifi_baudrate
231 #define if_ipackets if_data.ifi_ipackets
232 #define if_ierrors if_data.ifi_ierrors
233 #define if_opackets if_data.ifi_opackets
234 #define if_oerrors if_data.ifi_oerrors
235 #define if_collisions if_data.ifi_collisions
236 #define if_ibytes if_data.ifi_ibytes
237 #define if_obytes if_data.ifi_obytes
238 #define if_imcasts if_data.ifi_imcasts
239 #define if_omcasts if_data.ifi_omcasts
240 #define if_iqdrops if_data.ifi_iqdrops
241 #define if_noproto if_data.ifi_noproto
242 #define if_lastchange if_data.ifi_lastchange
243
244 #define IFF_UP 0x1
245 #define IFF_BROADCAST 0x2
246 #define IFF_DEBUG 0x4
247 #define IFF_LOOPBACK 0x8
248 #define IFF_POINTOPOINT 0x10
249 #define IFF_NOTRAILERS 0x20
250 #define IFF_RUNNING 0x40
251 #define IFF_NOARP 0x80
252 #define IFF_PROMISC 0x100
253 #define IFF_ALLMULTI 0x200
254 #define IFF_OACTIVE 0x400
255 #define IFF_SIMPLEX 0x800
256 #define IFF_LINK0 0x1000
257 #define IFF_LINK1 0x2000
258 #define IFF_LINK2 0x4000
259 #define IFF_MULTICAST 0x8000
260
261
262 #define IFF_CANTCHANGE \
263 (IFF_BROADCAST|IFF_POINTOPOINT|IFF_RUNNING|IFF_OACTIVE|\
264 IFF_SIMPLEX|IFF_MULTICAST|IFF_ALLMULTI)
265
266
267
268
269 #define IF_Kbps(x) ((x) * 1000)
270 #define IF_Mbps(x) (IF_Kbps((x) * 1000))
271 #define IF_Gbps(x) (IF_Mbps((x) * 1000))
272
273
274 #define IFCAP_CSUM_IPv4 0x00000001
275 #define IFCAP_CSUM_TCPv4 0x00000002
276 #define IFCAP_CSUM_UDPv4 0x00000004
277 #define IFCAP_IPSEC 0x00000008
278 #define IFCAP_VLAN_MTU 0x00000010
279 #define IFCAP_VLAN_HWTAGGING 0x00000020
280 #define IFCAP_IPCOMP 0x00000040
281 #define IFCAP_CSUM_TCPv6 0x00000080
282 #define IFCAP_CSUM_UDPv6 0x00000100
283 #define IFCAP_CSUM_TCPv4_Rx 0x00000200
284 #define IFCAP_CSUM_UDPv4_Rx 0x00000400
285
286
287
288
289
290
291
292 #define IF_QFULL(ifq) ((ifq)->ifq_len >= (ifq)->ifq_maxlen)
293 #define IF_DROP(ifq) ((ifq)->ifq_drops++)
294 #define IF_ENQUEUE(ifq, m) \
295 do { \
296 (m)->m_nextpkt = 0; \
297 if ((ifq)->ifq_tail == 0) \
298 (ifq)->ifq_head = m; \
299 else \
300 (ifq)->ifq_tail->m_nextpkt = m; \
301 (ifq)->ifq_tail = m; \
302 (ifq)->ifq_len++; \
303 } while (0)
304 #define IF_PREPEND(ifq, m) \
305 do { \
306 (m)->m_nextpkt = (ifq)->ifq_head; \
307 if ((ifq)->ifq_tail == 0) \
308 (ifq)->ifq_tail = (m); \
309 (ifq)->ifq_head = (m); \
310 (ifq)->ifq_len++; \
311 } while (0)
312 #define IF_DEQUEUE(ifq, m) \
313 do { \
314 (m) = (ifq)->ifq_head; \
315 if (m) { \
316 if (((ifq)->ifq_head = (m)->m_nextpkt) == 0) \
317 (ifq)->ifq_tail = 0; \
318 (m)->m_nextpkt = 0; \
319 (ifq)->ifq_len--; \
320 } \
321 } while (0)
322
323 #define IF_INPUT_ENQUEUE(ifq, m) \
324 do { \
325 if (IF_QFULL(ifq)) { \
326 IF_DROP(ifq); \
327 m_freem(m); \
328 if (!(ifq)->ifq_congestion) \
329 if_congestion(ifq); \
330 } else \
331 IF_ENQUEUE(ifq, m); \
332 } while (0)
333
334 #define IF_POLL(ifq, m) ((m) = (ifq)->ifq_head)
335 #define IF_PURGE(ifq) \
336 do { \
337 struct mbuf *__m0; \
338 \
339 for (;;) { \
340 IF_DEQUEUE((ifq), __m0); \
341 if (__m0 == NULL) \
342 break; \
343 else \
344 m_freem(__m0); \
345 } \
346 } while (0)
347 #define IF_IS_EMPTY(ifq) ((ifq)->ifq_len == 0)
348
349 #define IFQ_MAXLEN 256
350 #define IFNET_SLOWHZ 1
351
352
353 #define IFQCTL_LEN 1
354 #define IFQCTL_MAXLEN 2
355 #define IFQCTL_DROPS 3
356 #define IFQCTL_CONGESTION 4
357 #define IFQCTL_MAXID 5
358
359
360 #define CTL_IFQ_NAMES { \
361 { 0, 0 }, \
362 { "len", CTLTYPE_INT }, \
363 { "maxlen", CTLTYPE_INT }, \
364 { "drops", CTLTYPE_INT }, \
365 { "congestion", CTLTYPE_INT }, \
366 }
367
368
369
370
371
372
373
374 struct ifaddr {
375 struct sockaddr *ifa_addr;
376 struct sockaddr *ifa_dstaddr;
377 #define ifa_broadaddr ifa_dstaddr
378 struct sockaddr *ifa_netmask;
379 struct ifnet *ifa_ifp;
380 TAILQ_ENTRY(ifaddr) ifa_list;
381
382 void (*ifa_rtrequest)(int, struct rtentry *, struct rt_addrinfo *);
383 u_int ifa_flags;
384 u_int ifa_refcnt;
385 int ifa_metric;
386 };
387 #define IFA_ROUTE RTF_UP
388
389
390
391
392
393 struct if_msghdr {
394 u_short ifm_msglen;
395 u_char ifm_version;
396 u_char ifm_type;
397 int ifm_addrs;
398 int ifm_flags;
399 u_short ifm_index;
400 struct if_data ifm_data;
401 };
402
403
404
405
406
407 struct ifa_msghdr {
408 u_short ifam_msglen;
409 u_char ifam_version;
410 u_char ifam_type;
411 int ifam_addrs;
412 int ifam_flags;
413 u_short ifam_index;
414 int ifam_metric;
415 };
416
417
418
419
420
421 struct if_announcemsghdr {
422 u_short ifan_msglen;
423 u_char ifan_version;
424 u_char ifan_type;
425 u_short ifan_index;
426 char ifan_name[IFNAMSIZ];
427 u_short ifan_what;
428 };
429
430 #define IFAN_ARRIVAL 0
431 #define IFAN_DEPARTURE 1
432
433
434
435
436
437 #define IFG_ALL "all"
438 #define IFG_EGRESS "egress"
439
440 struct ifg_group {
441 char ifg_group[IFNAMSIZ];
442 u_int ifg_refcnt;
443 caddr_t ifg_pf_kif;
444 int ifg_carp_demoted;
445 TAILQ_HEAD(, ifg_member) ifg_members;
446 TAILQ_ENTRY(ifg_group) ifg_next;
447 };
448
449 struct ifg_member {
450 TAILQ_ENTRY(ifg_member) ifgm_next;
451 struct ifnet *ifgm_ifp;
452 };
453
454 struct ifg_list {
455 struct ifg_group *ifgl_group;
456 TAILQ_ENTRY(ifg_list) ifgl_next;
457 };
458
459 struct ifg_req {
460 union {
461 char ifgrqu_group[IFNAMSIZ];
462 char ifgrqu_member[IFNAMSIZ];
463 } ifgrq_ifgrqu;
464 #define ifgrq_group ifgrq_ifgrqu.ifgrqu_group
465 #define ifgrq_member ifgrq_ifgrqu.ifgrqu_member
466 };
467
468 struct ifg_attrib {
469 int ifg_carp_demoted;
470 };
471
472
473
474
475 struct ifgroupreq {
476 char ifgr_name[IFNAMSIZ];
477 u_int ifgr_len;
478 union {
479 char ifgru_group[IFNAMSIZ];
480 struct ifg_req *ifgru_groups;
481 struct ifg_attrib ifgru_attrib;
482 } ifgr_ifgru;
483 #define ifgr_group ifgr_ifgru.ifgru_group
484 #define ifgr_groups ifgr_ifgru.ifgru_groups
485 #define ifgr_attrib ifgr_ifgru.ifgru_attrib
486 };
487
488
489
490
491
492
493
494 struct ifreq {
495 char ifr_name[IFNAMSIZ];
496 union {
497 struct sockaddr ifru_addr;
498 struct sockaddr ifru_dstaddr;
499 struct sockaddr ifru_broadaddr;
500 short ifru_flags;
501 int ifru_metric;
502 caddr_t ifru_data;
503 } ifr_ifru;
504 #define ifr_addr ifr_ifru.ifru_addr
505 #define ifr_dstaddr ifr_ifru.ifru_dstaddr
506 #define ifr_broadaddr ifr_ifru.ifru_broadaddr
507 #define ifr_flags ifr_ifru.ifru_flags
508 #define ifr_metric ifr_ifru.ifru_metric
509 #define ifr_mtu ifr_ifru.ifru_metric
510 #define ifr_media ifr_ifru.ifru_metric
511 #define ifr_data ifr_ifru.ifru_data
512 };
513
514 struct ifaliasreq {
515 char ifra_name[IFNAMSIZ];
516 struct sockaddr ifra_addr;
517 struct sockaddr ifra_dstaddr;
518 #define ifra_broadaddr ifra_dstaddr
519 struct sockaddr ifra_mask;
520 };
521
522 struct ifmediareq {
523 char ifm_name[IFNAMSIZ];
524 int ifm_current;
525 int ifm_mask;
526 int ifm_status;
527 int ifm_active;
528 int ifm_count;
529
530 int *ifm_ulist;
531 };
532
533
534
535
536
537
538
539 struct ifconf {
540 int ifc_len;
541 union {
542 caddr_t ifcu_buf;
543 struct ifreq *ifcu_req;
544 } ifc_ifcu;
545 #define ifc_buf ifc_ifcu.ifcu_buf
546 #define ifc_req ifc_ifcu.ifcu_req
547 };
548
549
550
551
552 struct if_laddrreq {
553 char iflr_name[IFNAMSIZ];
554 unsigned int flags;
555 #define IFLR_PREFIX 0x8000
556 unsigned int prefixlen;
557 struct sockaddr_storage addr;
558 struct sockaddr_storage dstaddr;
559 };
560
561 struct if_nameindex {
562 unsigned int if_index;
563 char *if_name;
564 };
565
566 #ifndef _KERNEL
567 __BEGIN_DECLS
568 unsigned int if_nametoindex(const char *);
569 char *if_indextoname(unsigned int, char *);
570 struct if_nameindex *if_nameindex(void);
571 __END_DECLS
572 #define if_freenameindex(x) free(x)
573 #endif
574
575 #include <net/if_arp.h>
576
577 #ifdef _KERNEL
578 #define IFAFREE(ifa) \
579 do { \
580 if ((ifa)->ifa_refcnt <= 0) \
581 ifafree(ifa); \
582 else \
583 (ifa)->ifa_refcnt--; \
584 } while (0)
585
586 #ifdef ALTQ
587 #define ALTQ_DECL(x) x
588
589 #define IFQ_ENQUEUE(ifq, m, pattr, err) \
590 do { \
591 if (ALTQ_IS_ENABLED((ifq))) \
592 ALTQ_ENQUEUE((ifq), (m), (pattr), (err)); \
593 else { \
594 if (IF_QFULL((ifq))) { \
595 m_freem((m)); \
596 (err) = ENOBUFS; \
597 } else { \
598 IF_ENQUEUE((ifq), (m)); \
599 (err) = 0; \
600 } \
601 } \
602 if ((err)) \
603 (ifq)->ifq_drops++; \
604 } while (0)
605
606 #define IFQ_DEQUEUE(ifq, m) \
607 do { \
608 if (TBR_IS_ENABLED((ifq))) \
609 (m) = tbr_dequeue((ifq), ALTDQ_REMOVE); \
610 else if (ALTQ_IS_ENABLED((ifq))) \
611 ALTQ_DEQUEUE((ifq), (m)); \
612 else \
613 IF_DEQUEUE((ifq), (m)); \
614 } while (0)
615
616 #define IFQ_POLL(ifq, m) \
617 do { \
618 if (TBR_IS_ENABLED((ifq))) \
619 (m) = tbr_dequeue((ifq), ALTDQ_POLL); \
620 else if (ALTQ_IS_ENABLED((ifq))) \
621 ALTQ_POLL((ifq), (m)); \
622 else \
623 IF_POLL((ifq), (m)); \
624 } while (0)
625
626 #define IFQ_PURGE(ifq) \
627 do { \
628 if (ALTQ_IS_ENABLED((ifq))) \
629 ALTQ_PURGE((ifq)); \
630 else \
631 IF_PURGE((ifq)); \
632 } while (0)
633
634 #define IFQ_SET_READY(ifq) \
635 do { ((ifq)->altq_flags |= ALTQF_READY); } while (0)
636
637 #define IFQ_CLASSIFY(ifq, m, af, pa) \
638 do { \
639 if (ALTQ_IS_ENABLED((ifq))) { \
640 if (ALTQ_NEEDS_CLASSIFY((ifq))) \
641 (pa)->pattr_class = (*(ifq)->altq_classify) \
642 ((ifq)->altq_clfier, (m), (af)); \
643 (pa)->pattr_af = (af); \
644 (pa)->pattr_hdr = mtod((m), caddr_t); \
645 } \
646 } while (0)
647
648 #else
649 #define ALTQ_DECL(x)
650
651 #define IFQ_ENQUEUE(ifq, m, pattr, err) \
652 do { \
653 if (IF_QFULL((ifq))) { \
654 m_freem((m)); \
655 (err) = ENOBUFS; \
656 } else { \
657 IF_ENQUEUE((ifq), (m)); \
658 (err) = 0; \
659 } \
660 if ((err)) \
661 (ifq)->ifq_drops++; \
662 } while (0)
663
664 #define IFQ_DEQUEUE(ifq, m) IF_DEQUEUE((ifq), (m))
665
666 #define IFQ_POLL(ifq, m) IF_POLL((ifq), (m))
667
668 #define IFQ_PURGE(ifq) IF_PURGE((ifq))
669
670 #define IFQ_SET_READY(ifq)
671
672 #define IFQ_CLASSIFY(ifq, m, af, pa)
673
674 #endif
675
676 #define IFQ_IS_EMPTY(ifq) ((ifq)->ifq_len == 0)
677 #define IFQ_INC_LEN(ifq) ((ifq)->ifq_len++)
678 #define IFQ_DEC_LEN(ifq) (--(ifq)->ifq_len)
679 #define IFQ_INC_DROPS(ifq) ((ifq)->ifq_drops++)
680 #define IFQ_SET_MAXLEN(ifq, len) ((ifq)->ifq_maxlen = (len))
681
682 extern int ifqmaxlen;
683 extern struct ifnet_head ifnet;
684 extern struct ifnet **ifindex2ifnet;
685 extern struct ifnet *lo0ifp;
686 extern int if_indexlim;
687
688 #define ether_input_mbuf(ifp, m) ether_input((ifp), NULL, (m))
689
690 void ether_ifattach(struct ifnet *);
691 void ether_ifdetach(struct ifnet *);
692 int ether_ioctl(struct ifnet *, struct arpcom *, u_long, caddr_t);
693 void ether_input(struct ifnet *, struct ether_header *, struct mbuf *);
694 int ether_output(struct ifnet *,
695 struct mbuf *, struct sockaddr *, struct rtentry *);
696 char *ether_sprintf(u_char *);
697
698 void if_alloc_sadl(struct ifnet *);
699 void if_free_sadl(struct ifnet *);
700 void if_attach(struct ifnet *);
701 void if_attachdomain(void);
702 void if_attachtail(struct ifnet *);
703 void if_attachhead(struct ifnet *);
704 void if_detach(struct ifnet *);
705 void if_down(struct ifnet *);
706 void if_link_state_change(struct ifnet *);
707 void if_qflush(struct ifqueue *);
708 void if_slowtimo(void *);
709 void if_up(struct ifnet *);
710 int ifconf(u_long, caddr_t);
711 void ifinit(void);
712 int ifioctl(struct socket *, u_long, caddr_t, struct proc *);
713 int ifpromisc(struct ifnet *, int);
714 struct ifg_group *if_creategroup(const char *);
715 int if_addgroup(struct ifnet *, const char *);
716 int if_delgroup(struct ifnet *, const char *);
717 void if_group_routechange(struct sockaddr *, struct sockaddr *);
718 struct ifnet *ifunit(const char *);
719
720 struct ifaddr *ifa_ifwithaddr(struct sockaddr *);
721 struct ifaddr *ifa_ifwithaf(int);
722 struct ifaddr *ifa_ifwithdstaddr(struct sockaddr *);
723 struct ifaddr *ifa_ifwithnet(struct sockaddr *);
724 struct ifaddr *ifa_ifwithroute(int, struct sockaddr *,
725 struct sockaddr *);
726 struct ifaddr *ifaof_ifpforaddr(struct sockaddr *, struct ifnet *);
727 void ifafree(struct ifaddr *);
728 void link_rtrequest(int, struct rtentry *, struct rt_addrinfo *);
729
730 void if_clone_attach(struct if_clone *);
731 void if_clone_detach(struct if_clone *);
732
733 int if_clone_create(const char *);
734 int if_clone_destroy(const char *);
735
736 void if_congestion(struct ifqueue *);
737 int sysctl_ifq(int *, u_int, void *, size_t *, void *, size_t,
738 struct ifqueue *);
739
740 int loioctl(struct ifnet *, u_long, caddr_t);
741 void loopattach(int);
742 int looutput(struct ifnet *,
743 struct mbuf *, struct sockaddr *, struct rtentry *);
744 void lortrequest(int, struct rtentry *, struct rt_addrinfo *);
745 #endif
746 #endif