Deleted Added
full compact
if_var.h (257271) if_var.h (257351)
1/*-
2 * Copyright (c) 1982, 1986, 1989, 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

--- 13 unchanged lines hidden (view full) ---

22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 *
29 * From: @(#)if.h 8.1 (Berkeley) 6/10/93
1/*-
2 * Copyright (c) 1982, 1986, 1989, 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

--- 13 unchanged lines hidden (view full) ---

22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 *
29 * From: @(#)if.h 8.1 (Berkeley) 6/10/93
30 * $FreeBSD: head/sys/net/if_var.h 257271 2013-10-28 20:32:05Z glebius $
30 * $FreeBSD: head/sys/net/if_var.h 257351 2013-10-29 17:48:08Z andre $
31 */
32
33#ifndef _NET_IF_VAR_H_
34#define _NET_IF_VAR_H_
35
36/*
37 * Structures defining a network interface, providing a packet
38 * transport mechanism (ala level 0 of the PUP protocols).

--- 50 unchanged lines hidden (view full) ---

89TAILQ_HEAD(ifgrouphead, ifg_group);
90
91#ifdef _KERNEL
92VNET_DECLARE(struct pfil_head, link_pfil_hook); /* packet filter hooks */
93#define V_link_pfil_hook VNET(link_pfil_hook)
94#endif /* _KERNEL */
95
96/*
31 */
32
33#ifndef _NET_IF_VAR_H_
34#define _NET_IF_VAR_H_
35
36/*
37 * Structures defining a network interface, providing a packet
38 * transport mechanism (ala level 0 of the PUP protocols).

--- 50 unchanged lines hidden (view full) ---

89TAILQ_HEAD(ifgrouphead, ifg_group);
90
91#ifdef _KERNEL
92VNET_DECLARE(struct pfil_head, link_pfil_hook); /* packet filter hooks */
93#define V_link_pfil_hook VNET(link_pfil_hook)
94#endif /* _KERNEL */
95
96/*
97 * Structure defining a queue for a network interface.
98 */
99struct ifqueue {
100 struct mbuf *ifq_head;
101 struct mbuf *ifq_tail;
102 int ifq_len;
103 int ifq_maxlen;
104 int ifq_drops;
105 struct mtx ifq_mtx;
106};
107
108/*
109 * Structure defining a network interface.
110 *
111 * (Would like to call this struct ``if'', but C isn't PL/1.)
112 */
113
114struct ifnet {
115 void *if_softc; /* pointer to driver state */
116 void *if_l2com; /* pointer to protocol bits */

--- 86 unchanged lines hidden (view full) ---

203 * structures without changing the kernel binary interface, and must
204 * be used with care where binary compatibility is required.
205 */
206 char if_cspare[3];
207 int if_ispare[4];
208 void *if_pspare[8]; /* 1 netmap, 7 TDB */
209};
210
97 * Structure defining a network interface.
98 *
99 * (Would like to call this struct ``if'', but C isn't PL/1.)
100 */
101
102struct ifnet {
103 void *if_softc; /* pointer to driver state */
104 void *if_l2com; /* pointer to protocol bits */

--- 86 unchanged lines hidden (view full) ---

191 * structures without changing the kernel binary interface, and must
192 * be used with care where binary compatibility is required.
193 */
194 char if_cspare[3];
195 int if_ispare[4];
196 void *if_pspare[8]; /* 1 netmap, 7 TDB */
197};
198
199#include <net/ifq.h> /* XXXAO: temporary unconditional include */
200
211/*
212 * XXX These aliases are terribly dangerous because they could apply
213 * to anything.
214 */
215#define if_mtu if_data.ifi_mtu
216#define if_type if_data.ifi_type
217#define if_physical if_data.ifi_physical
218#define if_addrlen if_data.ifi_addrlen

--- 38 unchanged lines hidden (view full) ---

257 * kernel modules in order to divorce them from the internals of address list
258 * locking.
259 */
260void if_addr_rlock(struct ifnet *ifp); /* if_addrhead */
261void if_addr_runlock(struct ifnet *ifp); /* if_addrhead */
262void if_maddr_rlock(struct ifnet *ifp); /* if_multiaddrs */
263void if_maddr_runlock(struct ifnet *ifp); /* if_multiaddrs */
264
201/*
202 * XXX These aliases are terribly dangerous because they could apply
203 * to anything.
204 */
205#define if_mtu if_data.ifi_mtu
206#define if_type if_data.ifi_type
207#define if_physical if_data.ifi_physical
208#define if_addrlen if_data.ifi_addrlen

--- 38 unchanged lines hidden (view full) ---

247 * kernel modules in order to divorce them from the internals of address list
248 * locking.
249 */
250void if_addr_rlock(struct ifnet *ifp); /* if_addrhead */
251void if_addr_runlock(struct ifnet *ifp); /* if_addrhead */
252void if_maddr_rlock(struct ifnet *ifp); /* if_multiaddrs */
253void if_maddr_runlock(struct ifnet *ifp); /* if_multiaddrs */
254
265/*
266 * Output queues (ifp->if_snd) and slow device input queues (*ifp->if_slowq)
267 * are queues of messages stored on ifqueue structures
268 * (defined above). Entries are added to and deleted from these structures
269 * by these macros.
270 */
271#define IF_LOCK(ifq) mtx_lock(&(ifq)->ifq_mtx)
272#define IF_UNLOCK(ifq) mtx_unlock(&(ifq)->ifq_mtx)
273#define IF_LOCK_ASSERT(ifq) mtx_assert(&(ifq)->ifq_mtx, MA_OWNED)
274#define _IF_QFULL(ifq) ((ifq)->ifq_len >= (ifq)->ifq_maxlen)
275#define _IF_DROP(ifq) ((ifq)->ifq_drops++)
276#define _IF_QLEN(ifq) ((ifq)->ifq_len)
277
278#define _IF_ENQUEUE(ifq, m) do { \
279 (m)->m_nextpkt = NULL; \
280 if ((ifq)->ifq_tail == NULL) \
281 (ifq)->ifq_head = m; \
282 else \
283 (ifq)->ifq_tail->m_nextpkt = m; \
284 (ifq)->ifq_tail = m; \
285 (ifq)->ifq_len++; \
286} while (0)
287
288#define IF_ENQUEUE(ifq, m) do { \
289 IF_LOCK(ifq); \
290 _IF_ENQUEUE(ifq, m); \
291 IF_UNLOCK(ifq); \
292} while (0)
293
294#define _IF_PREPEND(ifq, m) do { \
295 (m)->m_nextpkt = (ifq)->ifq_head; \
296 if ((ifq)->ifq_tail == NULL) \
297 (ifq)->ifq_tail = (m); \
298 (ifq)->ifq_head = (m); \
299 (ifq)->ifq_len++; \
300} while (0)
301
302#define IF_PREPEND(ifq, m) do { \
303 IF_LOCK(ifq); \
304 _IF_PREPEND(ifq, m); \
305 IF_UNLOCK(ifq); \
306} while (0)
307
308#define _IF_DEQUEUE(ifq, m) do { \
309 (m) = (ifq)->ifq_head; \
310 if (m) { \
311 if (((ifq)->ifq_head = (m)->m_nextpkt) == NULL) \
312 (ifq)->ifq_tail = NULL; \
313 (m)->m_nextpkt = NULL; \
314 (ifq)->ifq_len--; \
315 } \
316} while (0)
317
318#define IF_DEQUEUE(ifq, m) do { \
319 IF_LOCK(ifq); \
320 _IF_DEQUEUE(ifq, m); \
321 IF_UNLOCK(ifq); \
322} while (0)
323
324#define _IF_DEQUEUE_ALL(ifq, m) do { \
325 (m) = (ifq)->ifq_head; \
326 (ifq)->ifq_head = (ifq)->ifq_tail = NULL; \
327 (ifq)->ifq_len = 0; \
328} while (0)
329
330#define IF_DEQUEUE_ALL(ifq, m) do { \
331 IF_LOCK(ifq); \
332 _IF_DEQUEUE_ALL(ifq, m); \
333 IF_UNLOCK(ifq); \
334} while (0)
335
336#define _IF_POLL(ifq, m) ((m) = (ifq)->ifq_head)
337#define IF_POLL(ifq, m) _IF_POLL(ifq, m)
338
339#define _IF_DRAIN(ifq) do { \
340 struct mbuf *m; \
341 for (;;) { \
342 _IF_DEQUEUE(ifq, m); \
343 if (m == NULL) \
344 break; \
345 m_freem(m); \
346 } \
347} while (0)
348
349#define IF_DRAIN(ifq) do { \
350 IF_LOCK(ifq); \
351 _IF_DRAIN(ifq); \
352 IF_UNLOCK(ifq); \
353} while(0)
354
355#ifdef _KERNEL
356#ifdef _SYS_EVENTHANDLER_H_
357/* interface link layer address change event */
358typedef void (*iflladdr_event_handler_t)(void *, struct ifnet *);
359EVENTHANDLER_DECLARE(iflladdr_event, iflladdr_event_handler_t);
360/* interface address change event */
361typedef void (*ifaddr_event_handler_t)(void *, struct ifnet *);
362EVENTHANDLER_DECLARE(ifaddr_event, ifaddr_event_handler_t);

--- 53 unchanged lines hidden (view full) ---

416#define IF_AFDATA_TRYLOCK(ifp) rw_try_wlock(&(ifp)->if_afdata_lock)
417#define IF_AFDATA_DESTROY(ifp) rw_destroy(&(ifp)->if_afdata_lock)
418
419#define IF_AFDATA_LOCK_ASSERT(ifp) rw_assert(&(ifp)->if_afdata_lock, RA_LOCKED)
420#define IF_AFDATA_RLOCK_ASSERT(ifp) rw_assert(&(ifp)->if_afdata_lock, RA_RLOCKED)
421#define IF_AFDATA_WLOCK_ASSERT(ifp) rw_assert(&(ifp)->if_afdata_lock, RA_WLOCKED)
422#define IF_AFDATA_UNLOCK_ASSERT(ifp) rw_assert(&(ifp)->if_afdata_lock, RA_UNLOCKED)
423
255#ifdef _KERNEL
256#ifdef _SYS_EVENTHANDLER_H_
257/* interface link layer address change event */
258typedef void (*iflladdr_event_handler_t)(void *, struct ifnet *);
259EVENTHANDLER_DECLARE(iflladdr_event, iflladdr_event_handler_t);
260/* interface address change event */
261typedef void (*ifaddr_event_handler_t)(void *, struct ifnet *);
262EVENTHANDLER_DECLARE(ifaddr_event, ifaddr_event_handler_t);

--- 53 unchanged lines hidden (view full) ---

316#define IF_AFDATA_TRYLOCK(ifp) rw_try_wlock(&(ifp)->if_afdata_lock)
317#define IF_AFDATA_DESTROY(ifp) rw_destroy(&(ifp)->if_afdata_lock)
318
319#define IF_AFDATA_LOCK_ASSERT(ifp) rw_assert(&(ifp)->if_afdata_lock, RA_LOCKED)
320#define IF_AFDATA_RLOCK_ASSERT(ifp) rw_assert(&(ifp)->if_afdata_lock, RA_RLOCKED)
321#define IF_AFDATA_WLOCK_ASSERT(ifp) rw_assert(&(ifp)->if_afdata_lock, RA_WLOCKED)
322#define IF_AFDATA_UNLOCK_ASSERT(ifp) rw_assert(&(ifp)->if_afdata_lock, RA_UNLOCKED)
323
424int if_handoff(struct ifqueue *ifq, struct mbuf *m, struct ifnet *ifp,
425 int adjust);
426#define IF_HANDOFF(ifq, m, ifp) \
427 if_handoff((struct ifqueue *)ifq, m, ifp, 0)
428#define IF_HANDOFF_ADJ(ifq, m, ifp, adj) \
429 if_handoff((struct ifqueue *)ifq, m, ifp, adj)
430
431void if_start(struct ifnet *);
432
433#define IFQ_ENQUEUE(ifq, m, err) \
434do { \
435 IF_LOCK(ifq); \
436 if (ALTQ_IS_ENABLED(ifq)) \
437 ALTQ_ENQUEUE(ifq, m, NULL, err); \
438 else { \
439 if (_IF_QFULL(ifq)) { \
440 m_freem(m); \
441 (err) = ENOBUFS; \
442 } else { \
443 _IF_ENQUEUE(ifq, m); \
444 (err) = 0; \
445 } \
446 } \
447 if (err) \
448 (ifq)->ifq_drops++; \
449 IF_UNLOCK(ifq); \
450} while (0)
451
452#define IFQ_DEQUEUE_NOLOCK(ifq, m) \
453do { \
454 if (TBR_IS_ENABLED(ifq)) \
455 (m) = tbr_dequeue_ptr(ifq, ALTDQ_REMOVE); \
456 else if (ALTQ_IS_ENABLED(ifq)) \
457 ALTQ_DEQUEUE(ifq, m); \
458 else \
459 _IF_DEQUEUE(ifq, m); \
460} while (0)
461
462#define IFQ_DEQUEUE(ifq, m) \
463do { \
464 IF_LOCK(ifq); \
465 IFQ_DEQUEUE_NOLOCK(ifq, m); \
466 IF_UNLOCK(ifq); \
467} while (0)
468
469#define IFQ_POLL_NOLOCK(ifq, m) \
470do { \
471 if (TBR_IS_ENABLED(ifq)) \
472 (m) = tbr_dequeue_ptr(ifq, ALTDQ_POLL); \
473 else if (ALTQ_IS_ENABLED(ifq)) \
474 ALTQ_POLL(ifq, m); \
475 else \
476 _IF_POLL(ifq, m); \
477} while (0)
478
479#define IFQ_POLL(ifq, m) \
480do { \
481 IF_LOCK(ifq); \
482 IFQ_POLL_NOLOCK(ifq, m); \
483 IF_UNLOCK(ifq); \
484} while (0)
485
486#define IFQ_PURGE_NOLOCK(ifq) \
487do { \
488 if (ALTQ_IS_ENABLED(ifq)) { \
489 ALTQ_PURGE(ifq); \
490 } else \
491 _IF_DRAIN(ifq); \
492} while (0)
493
494#define IFQ_PURGE(ifq) \
495do { \
496 IF_LOCK(ifq); \
497 IFQ_PURGE_NOLOCK(ifq); \
498 IF_UNLOCK(ifq); \
499} while (0)
500
501#define IFQ_SET_READY(ifq) \
502 do { ((ifq)->altq_flags |= ALTQF_READY); } while (0)
503
504#define IFQ_LOCK(ifq) IF_LOCK(ifq)
505#define IFQ_UNLOCK(ifq) IF_UNLOCK(ifq)
506#define IFQ_LOCK_ASSERT(ifq) IF_LOCK_ASSERT(ifq)
507#define IFQ_IS_EMPTY(ifq) ((ifq)->ifq_len == 0)
508#define IFQ_INC_LEN(ifq) ((ifq)->ifq_len++)
509#define IFQ_DEC_LEN(ifq) (--(ifq)->ifq_len)
510#define IFQ_INC_DROPS(ifq) ((ifq)->ifq_drops++)
511#define IFQ_SET_MAXLEN(ifq, len) ((ifq)->ifq_maxlen = (len))
512
513/*
514 * The IFF_DRV_OACTIVE test should really occur in the device driver, not in
515 * the handoff logic, as that flag is locked by the device driver.
516 */
517#define IFQ_HANDOFF_ADJ(ifp, m, adj, err) \
518do { \
519 int len; \
520 short mflags; \
521 \
522 len = (m)->m_pkthdr.len; \
523 mflags = (m)->m_flags; \
524 IFQ_ENQUEUE(&(ifp)->if_snd, m, err); \
525 if ((err) == 0) { \
526 (ifp)->if_obytes += len + (adj); \
527 if (mflags & M_MCAST) \
528 (ifp)->if_omcasts++; \
529 if (((ifp)->if_drv_flags & IFF_DRV_OACTIVE) == 0) \
530 if_start(ifp); \
531 } \
532} while (0)
533
534#define IFQ_HANDOFF(ifp, m, err) \
535 IFQ_HANDOFF_ADJ(ifp, m, 0, err)
536
537#define IFQ_DRV_DEQUEUE(ifq, m) \
538do { \
539 (m) = (ifq)->ifq_drv_head; \
540 if (m) { \
541 if (((ifq)->ifq_drv_head = (m)->m_nextpkt) == NULL) \
542 (ifq)->ifq_drv_tail = NULL; \
543 (m)->m_nextpkt = NULL; \
544 (ifq)->ifq_drv_len--; \
545 } else { \
546 IFQ_LOCK(ifq); \
547 IFQ_DEQUEUE_NOLOCK(ifq, m); \
548 while ((ifq)->ifq_drv_len < (ifq)->ifq_drv_maxlen) { \
549 struct mbuf *m0; \
550 IFQ_DEQUEUE_NOLOCK(ifq, m0); \
551 if (m0 == NULL) \
552 break; \
553 m0->m_nextpkt = NULL; \
554 if ((ifq)->ifq_drv_tail == NULL) \
555 (ifq)->ifq_drv_head = m0; \
556 else \
557 (ifq)->ifq_drv_tail->m_nextpkt = m0; \
558 (ifq)->ifq_drv_tail = m0; \
559 (ifq)->ifq_drv_len++; \
560 } \
561 IFQ_UNLOCK(ifq); \
562 } \
563} while (0)
564
565#define IFQ_DRV_PREPEND(ifq, m) \
566do { \
567 (m)->m_nextpkt = (ifq)->ifq_drv_head; \
568 if ((ifq)->ifq_drv_tail == NULL) \
569 (ifq)->ifq_drv_tail = (m); \
570 (ifq)->ifq_drv_head = (m); \
571 (ifq)->ifq_drv_len++; \
572} while (0)
573
574#define IFQ_DRV_IS_EMPTY(ifq) \
575 (((ifq)->ifq_drv_len == 0) && ((ifq)->ifq_len == 0))
576
577#define IFQ_DRV_PURGE(ifq) \
578do { \
579 struct mbuf *m, *n = (ifq)->ifq_drv_head; \
580 while((m = n) != NULL) { \
581 n = m->m_nextpkt; \
582 m_freem(m); \
583 } \
584 (ifq)->ifq_drv_head = (ifq)->ifq_drv_tail = NULL; \
585 (ifq)->ifq_drv_len = 0; \
586 IFQ_PURGE(ifq); \
587} while (0)
588
589#ifdef _KERNEL
590static __inline void
591if_initbaudrate(struct ifnet *ifp, uintmax_t baud)
592{
593
594 ifp->if_baudrate_pf = 0;
595 while (baud > (u_long)(~0UL)) {
596 baud /= 10;
597 ifp->if_baudrate_pf++;
598 }
599 ifp->if_baudrate = baud;
600}
601
324static __inline void
325if_initbaudrate(struct ifnet *ifp, uintmax_t baud)
326{
327
328 ifp->if_baudrate_pf = 0;
329 while (baud > (u_long)(~0UL)) {
330 baud /= 10;
331 ifp->if_baudrate_pf++;
332 }
333 ifp->if_baudrate = baud;
334}
335
602static __inline int
603drbr_enqueue(struct ifnet *ifp, struct buf_ring *br, struct mbuf *m)
604{
605 int error = 0;
606
607#ifdef ALTQ
608 if (ALTQ_IS_ENABLED(&ifp->if_snd)) {
609 IFQ_ENQUEUE(&ifp->if_snd, m, error);
610 return (error);
611 }
612#endif
613 error = buf_ring_enqueue(br, m);
614 if (error)
615 m_freem(m);
616
617 return (error);
618}
619
620static __inline void
621drbr_putback(struct ifnet *ifp, struct buf_ring *br, struct mbuf *new)
622{
623 /*
624 * The top of the list needs to be swapped
625 * for this one.
626 */
627#ifdef ALTQ
628 if (ifp != NULL && ALTQ_IS_ENABLED(&ifp->if_snd)) {
629 /*
630 * Peek in altq case dequeued it
631 * so put it back.
632 */
633 IFQ_DRV_PREPEND(&ifp->if_snd, new);
634 return;
635 }
636#endif
637 buf_ring_putback_sc(br, new);
638}
639
640static __inline struct mbuf *
641drbr_peek(struct ifnet *ifp, struct buf_ring *br)
642{
643#ifdef ALTQ
644 struct mbuf *m;
645 if (ifp != NULL && ALTQ_IS_ENABLED(&ifp->if_snd)) {
646 /*
647 * Pull it off like a dequeue
648 * since drbr_advance() does nothing
649 * for altq and drbr_putback() will
650 * use the old prepend function.
651 */
652 IFQ_DEQUEUE(&ifp->if_snd, m);
653 return (m);
654 }
655#endif
656 return(buf_ring_peek(br));
657}
658
659static __inline void
660drbr_flush(struct ifnet *ifp, struct buf_ring *br)
661{
662 struct mbuf *m;
663
664#ifdef ALTQ
665 if (ifp != NULL && ALTQ_IS_ENABLED(&ifp->if_snd))
666 IFQ_PURGE(&ifp->if_snd);
667#endif
668 while ((m = buf_ring_dequeue_sc(br)) != NULL)
669 m_freem(m);
670}
671
672static __inline void
673drbr_free(struct buf_ring *br, struct malloc_type *type)
674{
675
676 drbr_flush(NULL, br);
677 buf_ring_free(br, type);
678}
679
680static __inline struct mbuf *
681drbr_dequeue(struct ifnet *ifp, struct buf_ring *br)
682{
683#ifdef ALTQ
684 struct mbuf *m;
685
686 if (ifp != NULL && ALTQ_IS_ENABLED(&ifp->if_snd)) {
687 IFQ_DEQUEUE(&ifp->if_snd, m);
688 return (m);
689 }
690#endif
691 return (buf_ring_dequeue_sc(br));
692}
693
694static __inline void
695drbr_advance(struct ifnet *ifp, struct buf_ring *br)
696{
697#ifdef ALTQ
698 /* Nothing to do here since peek dequeues in altq case */
699 if (ifp != NULL && ALTQ_IS_ENABLED(&ifp->if_snd))
700 return;
701#endif
702 return (buf_ring_advance_sc(br));
703}
704
705
706static __inline struct mbuf *
707drbr_dequeue_cond(struct ifnet *ifp, struct buf_ring *br,
708 int (*func) (struct mbuf *, void *), void *arg)
709{
710 struct mbuf *m;
711#ifdef ALTQ
712 if (ALTQ_IS_ENABLED(&ifp->if_snd)) {
713 IFQ_LOCK(&ifp->if_snd);
714 IFQ_POLL_NOLOCK(&ifp->if_snd, m);
715 if (m != NULL && func(m, arg) == 0) {
716 IFQ_UNLOCK(&ifp->if_snd);
717 return (NULL);
718 }
719 IFQ_DEQUEUE_NOLOCK(&ifp->if_snd, m);
720 IFQ_UNLOCK(&ifp->if_snd);
721 return (m);
722 }
723#endif
724 m = buf_ring_peek(br);
725 if (m == NULL || func(m, arg) == 0)
726 return (NULL);
727
728 return (buf_ring_dequeue_sc(br));
729}
730
731static __inline int
732drbr_empty(struct ifnet *ifp, struct buf_ring *br)
733{
734#ifdef ALTQ
735 if (ALTQ_IS_ENABLED(&ifp->if_snd))
736 return (IFQ_IS_EMPTY(&ifp->if_snd));
737#endif
738 return (buf_ring_empty(br));
739}
740
741static __inline int
742drbr_needs_enqueue(struct ifnet *ifp, struct buf_ring *br)
743{
744#ifdef ALTQ
745 if (ALTQ_IS_ENABLED(&ifp->if_snd))
746 return (1);
747#endif
748 return (!buf_ring_empty(br));
749}
750
751static __inline int
752drbr_inuse(struct ifnet *ifp, struct buf_ring *br)
753{
754#ifdef ALTQ
755 if (ALTQ_IS_ENABLED(&ifp->if_snd))
756 return (ifp->if_snd.ifq_len);
757#endif
758 return (buf_ring_count(br));
759}
760#endif
761/*
762 * 72 was chosen below because it is the size of a TCP/IP
763 * header (40) + the minimum mss (32).
764 */
765#define IF_MINMTU 72
766#define IF_MAXMTU 65535
767
768#define TOEDEV(ifp) ((ifp)->if_llsoftc)

--- 119 unchanged lines hidden (view full) ---

888VNET_DECLARE(int, useloopback);
889
890#define V_ifnet VNET(ifnet)
891#define V_ifg_head VNET(ifg_head)
892#define V_if_index VNET(if_index)
893#define V_loif VNET(loif)
894#define V_useloopback VNET(useloopback)
895
336/*
337 * 72 was chosen below because it is the size of a TCP/IP
338 * header (40) + the minimum mss (32).
339 */
340#define IF_MINMTU 72
341#define IF_MAXMTU 65535
342
343#define TOEDEV(ifp) ((ifp)->if_llsoftc)

--- 119 unchanged lines hidden (view full) ---

463VNET_DECLARE(int, useloopback);
464
465#define V_ifnet VNET(ifnet)
466#define V_ifg_head VNET(ifg_head)
467#define V_if_index VNET(if_index)
468#define V_loif VNET(loif)
469#define V_useloopback VNET(useloopback)
470
896extern int ifqmaxlen;
897
898int if_addgroup(struct ifnet *, const char *);
899int if_delgroup(struct ifnet *, const char *);
900int if_addmulti(struct ifnet *, struct sockaddr *, struct ifmultiaddr **);
901int if_allmulti(struct ifnet *, int);
902struct ifnet* if_alloc(u_char);
903void if_attach(struct ifnet *);
904void if_dead(struct ifnet *);
905int if_delmulti(struct ifnet *, struct sockaddr *);

--- 4 unchanged lines hidden (view full) ---

910void if_delallmulti(struct ifnet *);
911void if_down(struct ifnet *);
912struct ifmultiaddr *
913 if_findmulti(struct ifnet *, struct sockaddr *);
914void if_free(struct ifnet *);
915void if_initname(struct ifnet *, const char *, int);
916void if_link_state_change(struct ifnet *, int);
917int if_printf(struct ifnet *, const char *, ...) __printflike(2, 3);
471int if_addgroup(struct ifnet *, const char *);
472int if_delgroup(struct ifnet *, const char *);
473int if_addmulti(struct ifnet *, struct sockaddr *, struct ifmultiaddr **);
474int if_allmulti(struct ifnet *, int);
475struct ifnet* if_alloc(u_char);
476void if_attach(struct ifnet *);
477void if_dead(struct ifnet *);
478int if_delmulti(struct ifnet *, struct sockaddr *);

--- 4 unchanged lines hidden (view full) ---

483void if_delallmulti(struct ifnet *);
484void if_down(struct ifnet *);
485struct ifmultiaddr *
486 if_findmulti(struct ifnet *, struct sockaddr *);
487void if_free(struct ifnet *);
488void if_initname(struct ifnet *, const char *, int);
489void if_link_state_change(struct ifnet *, int);
490int if_printf(struct ifnet *, const char *, ...) __printflike(2, 3);
918void if_qflush(struct ifnet *);
919void if_ref(struct ifnet *);
920void if_rele(struct ifnet *);
921int if_setlladdr(struct ifnet *, const u_char *, int);
922void if_up(struct ifnet *);
923int ifioctl(struct socket *, u_long, caddr_t, struct thread *);
924int ifpromisc(struct ifnet *, int);
925struct ifnet *ifunit(const char *);
926struct ifnet *ifunit_ref(const char *);
927
491void if_ref(struct ifnet *);
492void if_rele(struct ifnet *);
493int if_setlladdr(struct ifnet *, const u_char *, int);
494void if_up(struct ifnet *);
495int ifioctl(struct socket *, u_long, caddr_t, struct thread *);
496int ifpromisc(struct ifnet *, int);
497struct ifnet *ifunit(const char *);
498struct ifnet *ifunit_ref(const char *);
499
928void ifq_init(struct ifaltq *, struct ifnet *ifp);
929void ifq_delete(struct ifaltq *);
930
931int ifa_add_loopback_route(struct ifaddr *, struct sockaddr *);
932int ifa_del_loopback_route(struct ifaddr *, struct sockaddr *);
933
934struct ifaddr *ifa_ifwithaddr(struct sockaddr *);
935int ifa_ifwithaddr_check(struct sockaddr *);
936struct ifaddr *ifa_ifwithbroadaddr(struct sockaddr *);
937struct ifaddr *ifa_ifwithdstaddr(struct sockaddr *);
938struct ifaddr *ifa_ifwithnet(struct sockaddr *, int);

--- 7 unchanged lines hidden (view full) ---

946typedef void *if_com_alloc_t(u_char type, struct ifnet *ifp);
947typedef void if_com_free_t(void *com, u_char type);
948void if_register_com_alloc(u_char type, if_com_alloc_t *a, if_com_free_t *f);
949void if_deregister_com_alloc(u_char type);
950
951#define IF_LLADDR(ifp) \
952 LLADDR((struct sockaddr_dl *)((ifp)->if_addr->ifa_addr))
953
500int ifa_add_loopback_route(struct ifaddr *, struct sockaddr *);
501int ifa_del_loopback_route(struct ifaddr *, struct sockaddr *);
502
503struct ifaddr *ifa_ifwithaddr(struct sockaddr *);
504int ifa_ifwithaddr_check(struct sockaddr *);
505struct ifaddr *ifa_ifwithbroadaddr(struct sockaddr *);
506struct ifaddr *ifa_ifwithdstaddr(struct sockaddr *);
507struct ifaddr *ifa_ifwithnet(struct sockaddr *, int);

--- 7 unchanged lines hidden (view full) ---

515typedef void *if_com_alloc_t(u_char type, struct ifnet *ifp);
516typedef void if_com_free_t(void *com, u_char type);
517void if_register_com_alloc(u_char type, if_com_alloc_t *a, if_com_free_t *f);
518void if_deregister_com_alloc(u_char type);
519
520#define IF_LLADDR(ifp) \
521 LLADDR((struct sockaddr_dl *)((ifp)->if_addr->ifa_addr))
522
954#ifdef DEVICE_POLLING
955enum poll_cmd { POLL_ONLY, POLL_AND_CHECK_STATUS };
956
957typedef int poll_handler_t(struct ifnet *ifp, enum poll_cmd cmd, int count);
958int ether_poll_register(poll_handler_t *h, struct ifnet *ifp);
959int ether_poll_deregister(struct ifnet *ifp);
960#endif /* DEVICE_POLLING */
961
962#endif /* _KERNEL */
963
964#endif /* !_NET_IF_VAR_H_ */
523#endif /* _KERNEL */
524
525#endif /* !_NET_IF_VAR_H_ */