Project

General

Profile

Statistics
| Revision:

root / lab4 / .minix-src / include / net / if.h @ 13

History | View | Annotate | Download (35.1 KB)

1
/*        $NetBSD: if.h,v 1.193 2015/10/02 03:08:26 ozaki-r Exp $        */
2

    
3
/*-
4
 * Copyright (c) 1999, 2000, 2001 The NetBSD Foundation, Inc.
5
 * All rights reserved.
6
 *
7
 * This code is derived from software contributed to The NetBSD Foundation
8
 * by William Studenmund and Jason R. Thorpe.
9
 *
10
 * Redistribution and use in source and binary forms, with or without
11
 * modification, are permitted provided that the following conditions
12
 * are met:
13
 * 1. Redistributions of source code must retain the above copyright
14
 *    notice, this list of conditions and the following disclaimer.
15
 * 2. Redistributions in binary form must reproduce the above copyright
16
 *    notice, this list of conditions and the following disclaimer in the
17
 *    documentation and/or other materials provided with the distribution.
18
 *
19
 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20
 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21
 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29
 * POSSIBILITY OF SUCH DAMAGE.
30
 */
31

    
32
/*
33
 * Copyright (c) 1982, 1986, 1989, 1993
34
 *        The Regents of the University of California.  All rights reserved.
35
 *
36
 * Redistribution and use in source and binary forms, with or without
37
 * modification, are permitted provided that the following conditions
38
 * are met:
39
 * 1. Redistributions of source code must retain the above copyright
40
 *    notice, this list of conditions and the following disclaimer.
41
 * 2. Redistributions in binary form must reproduce the above copyright
42
 *    notice, this list of conditions and the following disclaimer in the
43
 *    documentation and/or other materials provided with the distribution.
44
 * 3. Neither the name of the University nor the names of its contributors
45
 *    may be used to endorse or promote products derived from this software
46
 *    without specific prior written permission.
47
 *
48
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
49
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
50
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
51
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
52
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
53
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
54
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
55
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
56
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
57
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
58
 * SUCH DAMAGE.
59
 *
60
 *        @(#)if.h        8.3 (Berkeley) 2/9/95
61
 */
62

    
63
#ifndef _NET_IF_H_
64
#define _NET_IF_H_
65

    
66
#if !defined(_KERNEL) && !defined(_STANDALONE)
67
#include <stdbool.h>
68
#endif
69

    
70
#include <sys/featuretest.h>
71

    
72
/*
73
 * Length of interface external name, including terminating '\0'.
74
 * Note: this is the same size as a generic device's external name.
75
 */
76
#define IF_NAMESIZE 16
77

    
78
#if defined(_NETBSD_SOURCE)
79

    
80
#include <sys/socket.h>
81
#include <sys/queue.h>
82
#include <sys/mutex.h>
83

    
84
#include <net/dlt.h>
85
#include <net/pfil.h>
86
#ifdef _KERNEL
87
#include <net/pktqueue.h>
88
#endif
89

    
90
/*
91
 * Always include ALTQ glue here -- we use the ALTQ interface queue
92
 * structure even when ALTQ is not configured into the kernel so that
93
 * the size of struct ifnet does not changed based on the option.  The
94
 * ALTQ queue structure is API-compatible with the legacy ifqueue.
95
 */
96
#include <altq/if_altq.h>
97

    
98
/*
99
 * Structures defining a network interface, providing a packet
100
 * transport mechanism (ala level 0 of the PUP protocols).
101
 *
102
 * Each interface accepts output datagrams of a specified maximum
103
 * length, and provides higher level routines with input datagrams
104
 * received from its medium.
105
 *
106
 * Output occurs when the routine if_output is called, with four parameters:
107
 *        (*ifp->if_output)(ifp, m, dst, rt)
108
 * Here m is the mbuf chain to be sent and dst is the destination address.
109
 * The output routine encapsulates the supplied datagram if necessary,
110
 * and then transmits it on its medium.
111
 *
112
 * On input, each interface unwraps the data received by it, and either
113
 * places it on the input queue of a internetwork datagram routine
114
 * and posts the associated software interrupt, or passes the datagram to a raw
115
 * packet input routine.
116
 *
117
 * Routines exist for locating interfaces by their addresses
118
 * or for locating a interface on a certain network, as well as more general
119
 * routing and gateway routines maintaining information used to locate
120
 * interfaces.  These routines live in the files if.c and route.c
121
 */
122
#include <sys/time.h>
123

    
124
#if defined(_KERNEL_OPT)
125
#include "opt_compat_netbsd.h"
126
#include "opt_gateway.h"
127
#endif
128

    
129
struct mbuf;
130
struct proc;
131
struct rtentry;
132
struct socket;
133
struct ether_header;
134
struct ifaddr;
135
struct ifnet;
136
struct rt_addrinfo;
137

    
138
#define        IFNAMSIZ        IF_NAMESIZE
139

    
140
/*
141
 * Structure describing a `cloning' interface.
142
 */
143
struct if_clone {
144
        LIST_ENTRY(if_clone) ifc_list;        /* on list of cloners */
145
        const char *ifc_name;                /* name of device, e.g. `gif' */
146
        size_t ifc_namelen;                /* length of name */
147

    
148
        int        (*ifc_create)(struct if_clone *, int);
149
        int        (*ifc_destroy)(struct ifnet *);
150
};
151

    
152
#define        IF_CLONE_INITIALIZER(name, create, destroy)                        \
153
        { { NULL, NULL }, name, sizeof(name) - 1, create, destroy }
154

    
155
/*
156
 * Structure used to query names of interface cloners.
157
 */
158
struct if_clonereq {
159
        int        ifcr_total;                /* total cloners (out) */
160
        int        ifcr_count;                /* room for this many in user buffer */
161
        char        *ifcr_buffer;                /* buffer for cloner names */
162
};
163

    
164
/*
165
 * Structure defining statistics and other data kept regarding a network
166
 * interface.
167
 */
168
struct if_data {
169
        /* generic interface information */
170
        u_char        ifi_type;                /* ethernet, tokenring, etc. */
171
        u_char        ifi_addrlen;                /* media address length */
172
        u_char        ifi_hdrlen;                /* media header length */
173
        int        ifi_link_state;                /* current link state */
174
        uint64_t ifi_mtu;                /* maximum transmission unit */
175
        uint64_t ifi_metric;                /* routing metric (external only) */
176
        uint64_t ifi_baudrate;                /* linespeed */
177
        /* volatile statistics */
178
        uint64_t ifi_ipackets;                /* packets received on interface */
179
        uint64_t ifi_ierrors;                /* input errors on interface */
180
        uint64_t ifi_opackets;                /* packets sent on interface */
181
        uint64_t ifi_oerrors;                /* output errors on interface */
182
        uint64_t ifi_collisions;        /* collisions on csma interfaces */
183
        uint64_t ifi_ibytes;                /* total number of octets received */
184
        uint64_t ifi_obytes;                /* total number of octets sent */
185
        uint64_t ifi_imcasts;                /* packets received via multicast */
186
        uint64_t ifi_omcasts;                /* packets sent via multicast */
187
        uint64_t ifi_iqdrops;                /* dropped on input, this interface */
188
        uint64_t ifi_noproto;                /* destined for unsupported protocol */
189
        struct        timespec ifi_lastchange;/* last operational state change */
190
};
191

    
192
/*
193
 * Values for if_link_state.
194
 */
195
#define        LINK_STATE_UNKNOWN        0        /* link invalid/unknown */
196
#define        LINK_STATE_DOWN                1        /* link is down */
197
#define        LINK_STATE_UP                2        /* link is up */
198

    
199
/*
200
 * Structure defining a queue for a network interface.
201
 */
202
struct ifqueue {
203
        struct                mbuf *ifq_head;
204
        struct                mbuf *ifq_tail;
205
        int                ifq_len;
206
        int                ifq_maxlen;
207
        int                ifq_drops;
208
        kmutex_t        *ifq_lock;
209
};
210

    
211
struct ifnet_lock;
212

    
213
#ifdef _KERNEL
214
#include <sys/condvar.h>
215
#include <sys/percpu.h>
216
#include <sys/callout.h>
217
#ifdef GATEWAY
218
#include <sys/mutex.h>
219
#else
220
#include <sys/rwlock.h>
221
#endif
222

    
223
struct ifnet_lock {
224
        kmutex_t il_lock;        /* Protects the critical section. */
225
        uint64_t il_nexit;        /* Counts threads across all CPUs who
226
                                 * have exited the critical section.
227
                                 * Access to il_nexit is synchronized
228
                                 * by il_lock.
229
                                 */
230
        percpu_t *il_nenter;        /* Counts threads on each CPU who have
231
                                 * entered or who wait to enter the
232
                                 * critical section protected by il_lock.
233
                                 * Synchronization is not required.
234
                                 */
235
        kcondvar_t il_emptied;        /* The ifnet_lock user must arrange for
236
                                 * the last threads in the critical
237
                                 * section to signal this condition variable
238
                                 * before they leave.
239
                                 */
240
};
241
#endif /* _KERNEL */
242

    
243
/*
244
 * Structure defining a queue for a network interface.
245
 *
246
 * (Would like to call this struct ``if'', but C isn't PL/1.)
247
 */
248
TAILQ_HEAD(ifnet_head, ifnet);                /* the actual queue head */
249

    
250
struct bridge_softc;
251
struct bridge_iflist;
252
struct callout;
253
struct krwlock;
254

    
255
typedef struct ifnet {
256
        void        *if_softc;                /* lower-level data for this if */
257
        TAILQ_ENTRY(ifnet) if_list;        /* all struct ifnets are chained */
258
        TAILQ_HEAD(, ifaddr) if_addrlist; /* linked list of addresses per if */
259
        char        if_xname[IFNAMSIZ];        /* external name (name + unit) */
260
        int        if_pcount;                /* number of promiscuous listeners */
261
        struct bpf_if *if_bpf;                /* packet filter structure */
262
        u_short        if_index;                /* numeric abbreviation for this if */
263
        short        if_timer;                /* time 'til if_slowtimo called */
264
        short        if_flags;                /* up/down, broadcast, etc. */
265
        short        if__pad1;                /* be nice to m68k ports */
266
        struct        if_data if_data;        /* statistics and other data about if */
267
        /*
268
         * Procedure handles.  If you add more of these, don't forget the
269
         * corresponding NULL stub in if.c.
270
         */
271
        int        (*if_output)                /* output routine (enqueue) */
272
                    (struct ifnet *, struct mbuf *, const struct sockaddr *,
273
                     struct rtentry *);
274
        void        (*if_input)                /* input routine (from h/w driver) */
275
                    (struct ifnet *, struct mbuf *);
276
        void        (*if_start)                /* initiate output routine */
277
                    (struct ifnet *);
278
        int        (*if_ioctl)                /* ioctl routine */
279
                    (struct ifnet *, u_long, void *);
280
        int        (*if_init)                /* init routine */
281
                    (struct ifnet *);
282
        void        (*if_stop)                /* stop routine */
283
                    (struct ifnet *, int);
284
        void        (*if_slowtimo)                /* timer routine */
285
                    (struct ifnet *);
286
#define        if_watchdog        if_slowtimo
287
        void        (*if_drain)                /* routine to release resources */
288
                    (struct ifnet *);
289
        struct ifaltq if_snd;                /* output queue (includes altq) */
290
        struct ifaddr        *if_dl;                /* identity of this interface. */
291
        const struct        sockaddr_dl *if_sadl;        /* pointer to sockaddr_dl
292
                                                 * of if_dl
293
                                                 */
294
        /* if_hwdl: h/w identity
295
         *
296
         * May be NULL.  If not NULL, it is the address assigned
297
         * to the interface by the manufacturer, so it very likely
298
         * to be unique.  It MUST NOT be deleted.  It is highly
299
         * suitable for deriving the EUI64 for the interface.
300
         */
301
        struct ifaddr        *if_hwdl;
302
        const uint8_t *if_broadcastaddr;/* linklevel broadcast bytestring */
303
        struct bridge_softc        *if_bridge;        /* bridge glue */
304
        struct bridge_iflist        *if_bridgeif;        /* shortcut to interface list entry */
305
        int        if_dlt;                        /* data link type (<net/dlt.h>) */
306
        pfil_head_t *        if_pfil;        /* filtering point */
307
        uint64_t if_capabilities;        /* interface capabilities */
308
        uint64_t if_capenable;                /* capabilities enabled */
309
        union {
310
                void *                carp_s;        /* carp structure (used by !carp ifs) */
311
                struct ifnet        *carp_d;/* ptr to carpdev (used by carp ifs) */
312
        } if_carp_ptr;
313
#define if_carp                if_carp_ptr.carp_s
314
#define if_carpdev        if_carp_ptr.carp_d
315
        /*
316
         * These are pre-computed based on an interfaces enabled
317
         * capabilities, for speed elsewhere.
318
         */
319
        int        if_csum_flags_tx;        /* M_CSUM_* flags for Tx */
320
        int        if_csum_flags_rx;        /* M_CSUM_* flags for Rx */
321

    
322
        void        *if_afdata[AF_MAX];
323
        struct        mowner *if_mowner;        /* who owns mbufs for this interface */
324

    
325
        void        *if_agrprivate;                /* used only when #if NAGR > 0 */
326

    
327
        /*
328
         * pf specific data, used only when #if NPF > 0.
329
         */
330
        void        *if_pf_kif;                /* pf interface abstraction */
331
        void        *if_pf_groups;                /* pf interface groups */
332
        /*
333
         * During an ifnet's lifetime, it has only one if_index, but
334
         * and if_index is not sufficient to identify an ifnet
335
         * because during the lifetime of the system, many ifnets may occupy a
336
         * given if_index.  Let us tell different ifnets at the same
337
         * if_index apart by their if_index_gen, a unique number that each ifnet
338
         * is assigned when it if_attach()s.  Now, the kernel can use the
339
         * pair (if_index, if_index_gen) as a weak reference to an ifnet.
340
         */
341
        uint64_t if_index_gen;                /* generation number for the ifnet
342
                                         * at if_index: if two ifnets' index
343
                                         * and generation number are both the
344
                                         * same, they are the same ifnet.
345
                                         */
346
        struct sysctllog        *if_sysctl_log;
347
        int (*if_initaddr)(struct ifnet *, struct ifaddr *, bool);
348
        int (*if_mcastop)(struct ifnet *, const unsigned long,
349
            const struct sockaddr *);
350
        int (*if_setflags)(struct ifnet *, const short);
351
        struct ifnet_lock *if_ioctl_lock;
352
#ifdef _KERNEL /* XXX kvm(3) */
353
        struct callout *if_slowtimo_ch;
354
#endif
355
#ifdef GATEWAY
356
        struct kmutex        *if_afdata_lock;
357
#else
358
        struct krwlock        *if_afdata_lock;
359
#endif
360
} ifnet_t;
361
 
362
#define        if_mtu                if_data.ifi_mtu
363
#define        if_type                if_data.ifi_type
364
#define        if_addrlen        if_data.ifi_addrlen
365
#define        if_hdrlen        if_data.ifi_hdrlen
366
#define        if_metric        if_data.ifi_metric
367
#define        if_link_state        if_data.ifi_link_state
368
#define        if_baudrate        if_data.ifi_baudrate
369
#define        if_ipackets        if_data.ifi_ipackets
370
#define        if_ierrors        if_data.ifi_ierrors
371
#define        if_opackets        if_data.ifi_opackets
372
#define        if_oerrors        if_data.ifi_oerrors
373
#define        if_collisions        if_data.ifi_collisions
374
#define        if_ibytes        if_data.ifi_ibytes
375
#define        if_obytes        if_data.ifi_obytes
376
#define        if_imcasts        if_data.ifi_imcasts
377
#define        if_omcasts        if_data.ifi_omcasts
378
#define        if_iqdrops        if_data.ifi_iqdrops
379
#define        if_noproto        if_data.ifi_noproto
380
#define        if_lastchange        if_data.ifi_lastchange
381

    
382
#define        IFF_UP                0x0001                /* interface is up */
383
#define        IFF_BROADCAST        0x0002                /* broadcast address valid */
384
#define        IFF_DEBUG        0x0004                /* turn on debugging */
385
#define        IFF_LOOPBACK        0x0008                /* is a loopback net */
386
#define        IFF_POINTOPOINT        0x0010                /* interface is point-to-point link */
387
#define        IFF_NOTRAILERS        0x0020                /* avoid use of trailers */
388
#define        IFF_RUNNING        0x0040                /* resources allocated */
389
#define        IFF_NOARP        0x0080                /* no address resolution protocol */
390
#define        IFF_PROMISC        0x0100                /* receive all packets */
391
#define        IFF_ALLMULTI        0x0200                /* receive all multicast packets */
392
#define        IFF_OACTIVE        0x0400                /* transmission in progress */
393
#define        IFF_SIMPLEX        0x0800                /* can't hear own transmissions */
394
#define        IFF_LINK0        0x1000                /* per link layer defined bit */
395
#define        IFF_LINK1        0x2000                /* per link layer defined bit */
396
#define        IFF_LINK2        0x4000                /* per link layer defined bit */
397
#define        IFF_MULTICAST        0x8000                /* supports multicast */
398

    
399
#define        IFFBITS \
400
    "\020\1UP\2BROADCAST\3DEBUG\4LOOPBACK\5POINTOPOINT\6NOTRAILERS" \
401
    "\7RUNNING\10NOARP\11PROMISC\12ALLMULTI\13OACTIVE\14SIMPLEX" \
402
    "\15LINK0\16LINK1\17LINK2\20MULTICAST"
403

    
404
/* flags set internally only: */
405
#define        IFF_CANTCHANGE \
406
        (IFF_BROADCAST|IFF_POINTOPOINT|IFF_RUNNING|IFF_OACTIVE|\
407
            IFF_SIMPLEX|IFF_MULTICAST|IFF_ALLMULTI|IFF_PROMISC)
408

    
409
/*
410
 * Some convenience macros used for setting ifi_baudrate.
411
 */
412
#define        IF_Kbps(x)        ((x) * 1000ULL)                        /* kilobits/sec. */
413
#define        IF_Mbps(x)        (IF_Kbps((x) * 1000ULL))        /* megabits/sec. */
414
#define        IF_Gbps(x)        (IF_Mbps((x) * 1000ULL))        /* gigabits/sec. */
415

    
416
/* Capabilities that interfaces can advertise. */
417
                                        /* 0x01 .. 0x40 were previously used */
418
#define        IFCAP_TSOv4                0x00080        /* can do TCPv4 segmentation offload */
419
#define        IFCAP_CSUM_IPv4_Rx        0x00100        /* can do IPv4 header checksums (Rx) */
420
#define        IFCAP_CSUM_IPv4_Tx        0x00200        /* can do IPv4 header checksums (Tx) */
421
#define        IFCAP_CSUM_TCPv4_Rx        0x00400        /* can do IPv4/TCP checksums (Rx) */
422
#define        IFCAP_CSUM_TCPv4_Tx        0x00800        /* can do IPv4/TCP checksums (Tx) */
423
#define        IFCAP_CSUM_UDPv4_Rx        0x01000        /* can do IPv4/UDP checksums (Rx) */
424
#define        IFCAP_CSUM_UDPv4_Tx        0x02000        /* can do IPv4/UDP checksums (Tx) */
425
#define        IFCAP_CSUM_TCPv6_Rx        0x04000        /* can do IPv6/TCP checksums (Rx) */
426
#define        IFCAP_CSUM_TCPv6_Tx        0x08000        /* can do IPv6/TCP checksums (Tx) */
427
#define        IFCAP_CSUM_UDPv6_Rx        0x10000        /* can do IPv6/UDP checksums (Rx) */
428
#define        IFCAP_CSUM_UDPv6_Tx        0x20000        /* can do IPv6/UDP checksums (Tx) */
429
#define        IFCAP_TSOv6                0x40000        /* can do TCPv6 segmentation offload */
430
#define        IFCAP_LRO                0x80000        /* can do Large Receive Offload */
431
#define        IFCAP_MASK                0xfff80 /* currently valid capabilities */
432

    
433
#define        IFCAPBITS                \
434
        "\020"                        \
435
        "\10TSO4"                \
436
        "\11IP4CSUM_Rx"                \
437
        "\12IP4CSUM_Tx"                \
438
        "\13TCP4CSUM_Rx"        \
439
        "\14TCP4CSUM_Tx"        \
440
        "\15UDP4CSUM_Rx"        \
441
        "\16UDP4CSUM_Tx"        \
442
        "\17TCP6CSUM_Rx"        \
443
        "\20TCP6CSUM_Tx"        \
444
        "\21UDP6CSUM_Rx"        \
445
        "\22UDP6CSUM_Tx"        \
446
        "\23TSO6"                \
447
        "\24LRO"                \
448

    
449
#ifdef GATEWAY
450
#define        IF_AFDATA_LOCK_INIT(ifp)        \
451
        do { \
452
                (ifp)->if_afdata_lock = mutex_obj_alloc(MUTEX_DEFAULT, IPL_NET); \
453
        } while (0)
454

    
455
#define        IF_AFDATA_WLOCK(ifp)        mutex_enter((ifp)->if_afdata_lock)
456
#define        IF_AFDATA_RLOCK(ifp)        mutex_enter((ifp)->if_afdata_lock)
457
#define        IF_AFDATA_WUNLOCK(ifp)        mutex_exit((ifp)->if_afdata_lock)
458
#define        IF_AFDATA_RUNLOCK(ifp)        mutex_exit((ifp)->if_afdata_lock)
459
#define        IF_AFDATA_LOCK(ifp)        IF_AFDATA_WLOCK(ifp)
460
#define        IF_AFDATA_UNLOCK(ifp)        IF_AFDATA_WUNLOCK(ifp)
461
#define        IF_AFDATA_TRYLOCK(ifp)        mutex_tryenter((ifp)->if_afdata_lock)
462
#define        IF_AFDATA_DESTROY(ifp)        mutex_destroy((ifp)->if_afdata_lock)
463

    
464
#define        IF_AFDATA_LOCK_ASSERT(ifp)        \
465
        KASSERT(mutex_owned((ifp)->if_afdata_lock))
466
#define        IF_AFDATA_RLOCK_ASSERT(ifp)        \
467
        KASSERT(mutex_owned((ifp)->if_afdata_lock))
468
#define        IF_AFDATA_WLOCK_ASSERT(ifp)        \
469
        KASSERT(mutex_owned((ifp)->if_afdata_lock))
470
#define        IF_AFDATA_UNLOCK_ASSERT(ifp)        \
471
        KASSERT(!mutex_owned((ifp)->if_afdata_lock))
472

    
473
#else /* GATEWAY */
474
#define        IF_AFDATA_LOCK_INIT(ifp)        \
475
        do {(ifp)->if_afdata_lock = rw_obj_alloc();} while (0)
476

    
477
#define        IF_AFDATA_WLOCK(ifp)        rw_enter((ifp)->if_afdata_lock, RW_WRITER)
478
#define        IF_AFDATA_RLOCK(ifp)        rw_enter((ifp)->if_afdata_lock, RW_READER)
479
#define        IF_AFDATA_WUNLOCK(ifp)        rw_exit((ifp)->if_afdata_lock)
480
#define        IF_AFDATA_RUNLOCK(ifp)        rw_exit((ifp)->if_afdata_lock)
481
#define        IF_AFDATA_LOCK(ifp)        IF_AFDATA_WLOCK(ifp)
482
#define        IF_AFDATA_UNLOCK(ifp)        IF_AFDATA_WUNLOCK(ifp)
483
#define        IF_AFDATA_TRYLOCK(ifp)        rw_tryenter((ifp)->if_afdata_lock, RW_WRITER)
484
#define        IF_AFDATA_DESTROY(ifp)        rw_destroy((ifp)->if_afdata_lock)
485

    
486
#define        IF_AFDATA_LOCK_ASSERT(ifp)        \
487
        KASSERT(rw_lock_held((ifp)->if_afdata_lock))
488
#define        IF_AFDATA_RLOCK_ASSERT(ifp)        \
489
        KASSERT(rw_read_held((ifp)->if_afdata_lock))
490
#define        IF_AFDATA_WLOCK_ASSERT(ifp)        \
491
        KASSERT(rw_write_held((ifp)->if_afdata_lock))
492
#define        IF_AFDATA_UNLOCK_ASSERT(ifp)        \
493
        KASSERT(!rw_lock_held((ifp)->if_afdata_lock))
494
#endif /* GATEWAY */
495

    
496
#define IFQ_LOCK(_ifq)                if ((_ifq)->ifq_lock) mutex_enter((_ifq)->ifq_lock)
497
#define IFQ_UNLOCK(_ifq)        if ((_ifq)->ifq_lock) mutex_exit((_ifq)->ifq_lock)
498

    
499
/*
500
 * Output queues (ifp->if_snd) and internetwork datagram level (pup level 1)
501
 * input routines have queues of messages stored on ifqueue structures
502
 * (defined above).  Entries are added to and deleted from these structures
503
 * by these macros, which should be called with ipl raised to splnet().
504
 */
505
#define        IF_QFULL(ifq)                ((ifq)->ifq_len >= (ifq)->ifq_maxlen)
506
#define        IF_DROP(ifq)                ((ifq)->ifq_drops++)
507
#define        IF_ENQUEUE(ifq, m) do { \
508
        (m)->m_nextpkt = 0; \
509
        if ((ifq)->ifq_tail == 0) \
510
                (ifq)->ifq_head = m; \
511
        else \
512
                (ifq)->ifq_tail->m_nextpkt = m; \
513
        (ifq)->ifq_tail = m; \
514
        (ifq)->ifq_len++; \
515
} while (/*CONSTCOND*/0)
516
#define        IF_PREPEND(ifq, m) do { \
517
        (m)->m_nextpkt = (ifq)->ifq_head; \
518
        if ((ifq)->ifq_tail == 0) \
519
                (ifq)->ifq_tail = (m); \
520
        (ifq)->ifq_head = (m); \
521
        (ifq)->ifq_len++; \
522
} while (/*CONSTCOND*/0)
523
#define        IF_DEQUEUE(ifq, m) do { \
524
        (m) = (ifq)->ifq_head; \
525
        if (m) { \
526
                if (((ifq)->ifq_head = (m)->m_nextpkt) == 0) \
527
                        (ifq)->ifq_tail = 0; \
528
                (m)->m_nextpkt = 0; \
529
                (ifq)->ifq_len--; \
530
        } \
531
} while (/*CONSTCOND*/0) 
532
#define        IF_POLL(ifq, m)                ((m) = (ifq)->ifq_head)
533
#define        IF_PURGE(ifq)                                                        \
534
do {                                                                        \
535
        struct mbuf *__m0;                                                \
536
                                                                        \
537
        for (;;) {                                                        \
538
                IF_DEQUEUE((ifq), __m0);                                \
539
                if (__m0 == NULL)                                        \
540
                        break;                                                \
541
                else                                                        \
542
                        m_freem(__m0);                                        \
543
        }                                                                \
544
} while (/*CONSTCOND*/ 0)
545
#define        IF_IS_EMPTY(ifq)        ((ifq)->ifq_len == 0)
546

    
547
#ifndef IFQ_MAXLEN
548
#define        IFQ_MAXLEN        256
549
#endif
550
#define        IFNET_SLOWHZ        1                /* granularity is 1 second */
551

    
552
/*
553
 * Structure defining statistics and other data kept regarding an address
554
 * on a network interface.
555
 */
556
struct ifaddr_data {
557
        int64_t        ifad_inbytes;
558
        int64_t        ifad_outbytes;
559
};
560

    
561
/*
562
 * The ifaddr structure contains information about one address
563
 * of an interface.  They are maintained by the different address families,
564
 * are allocated and attached when an address is set, and are linked
565
 * together so all addresses for an interface can be located.
566
 */
567
struct ifaddr {
568
        struct        sockaddr *ifa_addr;        /* address of interface */
569
        struct        sockaddr *ifa_dstaddr;        /* other end of p-to-p link */
570
#define        ifa_broadaddr        ifa_dstaddr        /* broadcast address interface */
571
        struct        sockaddr *ifa_netmask;        /* used to determine subnet */
572
        struct        ifnet *ifa_ifp;                /* back-pointer to interface */
573
        TAILQ_ENTRY(ifaddr) ifa_list;        /* list of addresses for interface */
574
        struct        ifaddr_data        ifa_data;        /* statistics on the address */
575
        void        (*ifa_rtrequest)        /* check or clean routes (+ or -)'d */
576
                        (int, struct rtentry *, const struct rt_addrinfo *);
577
        u_int        ifa_flags;                /* mostly rt_flags for cloning */
578
        int        ifa_refcnt;                /* count of references */
579
        int        ifa_metric;                /* cost of going out this interface */
580
        struct ifaddr        *(*ifa_getifa)(struct ifaddr *,
581
                                       const struct sockaddr *);
582
        uint32_t        *ifa_seqno;
583
        int16_t        ifa_preference;        /* preference level for this address */
584
};
585
#define        IFA_ROUTE        RTF_UP        /* (0x01) route installed */
586

    
587
/*
588
 * Message format for use in obtaining information about interfaces from
589
 * sysctl and the routing socket.  We need to force 64-bit alignment if we
590
 * aren't using compatiblity definitons.
591
 */
592
#if !defined(_KERNEL) || !defined(COMPAT_RTSOCK)
593
#define        __align64        __aligned(sizeof(uint64_t))
594
#else
595
#define        __align64
596
#endif
597
struct if_msghdr {
598
        u_short        ifm_msglen __align64;
599
                                /* to skip over non-understood messages */
600
        u_char        ifm_version;        /* future binary compatibility */
601
        u_char        ifm_type;        /* message type */
602
        int        ifm_addrs;        /* like rtm_addrs */
603
        int        ifm_flags;        /* value of if_flags */
604
        u_short        ifm_index;        /* index for associated ifp */
605
        struct        if_data ifm_data __align64;
606
                                /* statistics and other data about if */
607
};
608

    
609
/*
610
 * Message format for use in obtaining information about interface addresses
611
 * from sysctl and the routing socket.
612
 */
613
struct ifa_msghdr {
614
        u_short        ifam_msglen __align64;
615
                                /* to skip over non-understood messages */
616
        u_char        ifam_version;        /* future binary compatibility */
617
        u_char        ifam_type;        /* message type */
618
        int        ifam_addrs;        /* like rtm_addrs */
619
        int        ifam_flags;        /* value of ifa_flags */
620
        int        ifam_metric;        /* value of ifa_metric */
621
        u_short        ifam_index;        /* index for associated ifp */
622
};
623

    
624
/*
625
 * Message format announcing the arrival or departure of a network interface.
626
 */
627
struct if_announcemsghdr {
628
        u_short        ifan_msglen __align64;
629
                                /* to skip over non-understood messages */
630
        u_char        ifan_version;        /* future binary compatibility */
631
        u_char        ifan_type;        /* message type */
632
        u_short        ifan_index;        /* index for associated ifp */
633
        char        ifan_name[IFNAMSIZ]; /* if name, e.g. "en0" */
634
        u_short        ifan_what;        /* what type of announcement */
635
};
636

    
637
#define        IFAN_ARRIVAL        0        /* interface arrival */
638
#define        IFAN_DEPARTURE        1        /* interface departure */
639

    
640
#undef __align64
641

    
642
/*
643
 * Interface request structure used for socket
644
 * ioctl's.  All interface ioctl's must have parameter
645
 * definitions which begin with ifr_name.  The
646
 * remainder may be interface specific.
647
 */
648
struct        ifreq {
649
        char        ifr_name[IFNAMSIZ];                /* if name, e.g. "en0" */
650
        union {
651
                struct        sockaddr ifru_addr;
652
                struct        sockaddr ifru_dstaddr;
653
                struct        sockaddr ifru_broadaddr;
654
                struct        sockaddr_storage ifru_space;
655
                short        ifru_flags;
656
                int        ifru_addrflags;
657
                int        ifru_metric;
658
                int        ifru_mtu;
659
                int        ifru_dlt;
660
                u_int        ifru_value;
661
                void *        ifru_data;
662
                struct {
663
                        uint32_t        b_buflen;
664
                        void                *b_buf;
665
                } ifru_b;
666
        } ifr_ifru;
667
#define        ifr_addr        ifr_ifru.ifru_addr        /* address */
668
#define        ifr_dstaddr        ifr_ifru.ifru_dstaddr        /* other end of p-to-p link */
669
#define        ifr_broadaddr        ifr_ifru.ifru_broadaddr        /* broadcast address */
670
#define        ifr_space        ifr_ifru.ifru_space        /* sockaddr_storage */
671
#define        ifr_flags        ifr_ifru.ifru_flags        /* flags */
672
#define        ifr_addrflags        ifr_ifru.ifru_addrflags        /* addr flags */
673
#define        ifr_metric        ifr_ifru.ifru_metric        /* metric */
674
#define        ifr_mtu                ifr_ifru.ifru_mtu        /* mtu */
675
#define        ifr_dlt                ifr_ifru.ifru_dlt        /* data link type (DLT_*) */
676
#define        ifr_value        ifr_ifru.ifru_value        /* generic value */
677
#define        ifr_media        ifr_ifru.ifru_metric        /* media options (overload) */
678
#define        ifr_data        ifr_ifru.ifru_data        /* for use by interface
679
                                                 * XXX deprecated
680
                                                 */
681
#define        ifr_buf                ifr_ifru.ifru_b.b_buf        /* new interface ioctls */
682
#define        ifr_buflen        ifr_ifru.ifru_b.b_buflen
683
#define        ifr_index        ifr_ifru.ifru_value        /* interface index, BSD */
684
#define        ifr_ifindex        ifr_index                /* interface index, linux */
685
};
686

    
687
#ifdef _KERNEL
688
#define        ifreq_setdstaddr        ifreq_setaddr
689
#define        ifreq_setbroadaddr        ifreq_setaddr
690
#define        ifreq_getdstaddr        ifreq_getaddr
691
#define        ifreq_getbroadaddr        ifreq_getaddr
692

    
693
static inline const struct sockaddr *
694
/*ARGSUSED*/
695
ifreq_getaddr(u_long cmd, const struct ifreq *ifr)
696
{
697
        return &ifr->ifr_addr;
698
}
699
#endif /* _KERNEL */
700

    
701
struct ifcapreq {
702
        char                ifcr_name[IFNAMSIZ];        /* if name, e.g. "en0" */
703
        uint64_t        ifcr_capabilities;        /* supported capabiliites */
704
        uint64_t        ifcr_capenable;                /* capabilities enabled */
705
};
706

    
707
struct ifaliasreq {
708
        char        ifra_name[IFNAMSIZ];                /* if name, e.g. "en0" */
709
        struct        sockaddr ifra_addr;
710
        struct        sockaddr ifra_dstaddr;
711
#define        ifra_broadaddr        ifra_dstaddr
712
        struct        sockaddr ifra_mask;
713
};
714

    
715
struct ifdatareq {
716
        char        ifdr_name[IFNAMSIZ];                /* if name, e.g. "en0" */
717
        struct        if_data ifdr_data;
718
};
719

    
720
struct ifmediareq {
721
        char        ifm_name[IFNAMSIZ];                /* if name, e.g. "en0" */
722
        int        ifm_current;                        /* current media options */
723
        int        ifm_mask;                        /* don't care mask */
724
        int        ifm_status;                        /* media status */
725
        int        ifm_active;                        /* active options */
726
        int        ifm_count;                        /* # entries in ifm_ulist
727
                                                   array */
728
        int        *ifm_ulist;                        /* media words */
729
};
730

    
731

    
732
struct  ifdrv {
733
        char                ifd_name[IFNAMSIZ];        /* if name, e.g. "en0" */
734
        unsigned long        ifd_cmd;
735
        size_t                ifd_len;
736
        void                *ifd_data;
737
};
738
#define IFLINKSTR_QUERYLEN        0x01
739
#define IFLINKSTR_UNSET                0x02
740

    
741
/*
742
 * Structure used in SIOCGIFCONF request.
743
 * Used to retrieve interface configuration
744
 * for machine (useful for programs which
745
 * must know all networks accessible).
746
 */
747
struct        ifconf {
748
        int        ifc_len;                /* size of associated buffer */
749
        union {
750
                void *        ifcu_buf;
751
                struct        ifreq *ifcu_req;
752
        } ifc_ifcu;
753
#define        ifc_buf        ifc_ifcu.ifcu_buf        /* buffer address */
754
#define        ifc_req        ifc_ifcu.ifcu_req        /* array of structures returned */
755
};
756

    
757
/*
758
 * Structure for SIOC[AGD]LIFADDR
759
 */
760
struct if_laddrreq {
761
        char iflr_name[IFNAMSIZ];
762
        unsigned int flags;
763
#define IFLR_PREFIX        0x8000        /* in: prefix given  out: kernel fills id */
764
#define IFLR_ACTIVE        0x4000        /* in/out: link-layer address activation */
765
#define IFLR_FACTORY        0x2000        /* in/out: factory link-layer address */
766
        unsigned int prefixlen;                /* in/out */
767
        struct sockaddr_storage addr;        /* in/out */
768
        struct sockaddr_storage dstaddr; /* out */
769
};
770

    
771
/*
772
 * Structure for SIOC[SG]IFADDRPREF
773
 */
774
struct if_addrprefreq {
775
        char                        ifap_name[IFNAMSIZ];
776
        int16_t                        ifap_preference;        /* in/out */
777
        struct sockaddr_storage        ifap_addr;                /* in/out */
778
};
779

    
780
#include <net/if_arp.h>
781

    
782
#endif /* _NETBSD_SOURCE */
783

    
784
#ifdef _KERNEL
785
#ifdef ALTQ
786
#define        ALTQ_DECL(x)                x
787
#define ALTQ_COMMA                ,
788

    
789
#define IFQ_ENQUEUE(ifq, m, pattr, err)                                        \
790
do {                                                                        \
791
        IFQ_LOCK((ifq));                                                \
792
        if (ALTQ_IS_ENABLED((ifq)))                                        \
793
                ALTQ_ENQUEUE((ifq), (m), (pattr), (err));                \
794
        else {                                                                \
795
                if (IF_QFULL((ifq))) {                                        \
796
                        m_freem((m));                                        \
797
                        (err) = ENOBUFS;                                \
798
                } else {                                                \
799
                        IF_ENQUEUE((ifq), (m));                                \
800
                        (err) = 0;                                        \
801
                }                                                        \
802
        }                                                                \
803
        if ((err))                                                        \
804
                (ifq)->ifq_drops++;                                        \
805
        IFQ_UNLOCK((ifq));                                                \
806
} while (/*CONSTCOND*/ 0)
807

    
808
#define IFQ_DEQUEUE(ifq, m)                                                \
809
do {                                                                        \
810
        IFQ_LOCK((ifq));                                                \
811
        if (TBR_IS_ENABLED((ifq)))                                        \
812
                (m) = tbr_dequeue((ifq), ALTDQ_REMOVE);                        \
813
        else if (ALTQ_IS_ENABLED((ifq)))                                \
814
                ALTQ_DEQUEUE((ifq), (m));                                \
815
        else                                                                \
816
                IF_DEQUEUE((ifq), (m));                                        \
817
        IFQ_UNLOCK((ifq));                                                \
818
} while (/*CONSTCOND*/ 0)
819

    
820
#define        IFQ_POLL(ifq, m)                                                \
821
do {                                                                        \
822
        IFQ_LOCK((ifq));                                                \
823
        if (TBR_IS_ENABLED((ifq)))                                        \
824
                (m) = tbr_dequeue((ifq), ALTDQ_POLL);                        \
825
        else if (ALTQ_IS_ENABLED((ifq)))                                \
826
                ALTQ_POLL((ifq), (m));                                        \
827
        else                                                                \
828
                IF_POLL((ifq), (m));                                        \
829
        IFQ_UNLOCK((ifq));                                                \
830
} while (/*CONSTCOND*/ 0)
831

    
832
#define        IFQ_PURGE(ifq)                                                        \
833
do {                                                                        \
834
        IFQ_LOCK((ifq));                                                \
835
        if (ALTQ_IS_ENABLED((ifq)))                                        \
836
                ALTQ_PURGE((ifq));                                        \
837
        else                                                                \
838
                IF_PURGE((ifq));                                        \
839
        IFQ_UNLOCK((ifq));                                                \
840
} while (/*CONSTCOND*/ 0)
841

    
842
#define        IFQ_SET_READY(ifq)                                                \
843
do {                                                                        \
844
        (ifq)->altq_flags |= ALTQF_READY;                                \
845
} while (/*CONSTCOND*/ 0)
846

    
847
#define        IFQ_CLASSIFY(ifq, m, af, pattr)                                        \
848
do {                                                                        \
849
        IFQ_LOCK((ifq));                                                \
850
        if (ALTQ_IS_ENABLED((ifq))) {                                        \
851
                if (ALTQ_NEEDS_CLASSIFY((ifq)))                                \
852
                        (pattr)->pattr_class = (*(ifq)->altq_classify)        \
853
                                ((ifq)->altq_clfier, (m), (af));        \
854
                (pattr)->pattr_af = (af);                                \
855
                (pattr)->pattr_hdr = mtod((m), void *);                \
856
        }                                                                \
857
        IFQ_UNLOCK((ifq));                                                \
858
} while (/*CONSTCOND*/ 0)
859
#else /* ! ALTQ */
860
#define        ALTQ_DECL(x)                /* nothing */
861
#define ALTQ_COMMA
862

    
863
#define        IFQ_ENQUEUE(ifq, m, pattr, err)                                        \
864
do {                                                                        \
865
        IFQ_LOCK((ifq));                                                \
866
        if (IF_QFULL((ifq))) {                                                \
867
                m_freem((m));                                                \
868
                (err) = ENOBUFS;                                        \
869
        } else {                                                        \
870
                IF_ENQUEUE((ifq), (m));                                        \
871
                (err) = 0;                                                \
872
        }                                                                \
873
        if ((err))                                                        \
874
                (ifq)->ifq_drops++;                                        \
875
        IFQ_UNLOCK((ifq));                                                \
876
} while (/*CONSTCOND*/ 0)
877

    
878
#define        IFQ_DEQUEUE(ifq, m)                                                \
879
do {                                                                        \
880
        IFQ_LOCK((ifq));                                                \
881
        IF_DEQUEUE((ifq), (m));                                                \
882
        IFQ_UNLOCK((ifq));                                                \
883
} while (/*CONSTCOND*/ 0)
884

    
885
#define        IFQ_POLL(ifq, m)                                                \
886
do {                                                                        \
887
        IFQ_LOCK((ifq));                                                \
888
        IF_POLL((ifq), (m));                                                \
889
        IFQ_UNLOCK((ifq));                                                \
890
} while (/*CONSTCOND*/ 0)
891

    
892
#define        IFQ_PURGE(ifq)                                                        \
893
do {                                                                        \
894
        IFQ_LOCK((ifq));                                                \
895
        IF_PURGE((ifq));                                                \
896
        IFQ_UNLOCK((ifq));                                                \
897
} while (/*CONSTCOND*/ 0)
898

    
899
#define        IFQ_SET_READY(ifq)        /* nothing */
900

    
901
#define        IFQ_CLASSIFY(ifq, m, af, pattr) /* nothing */
902

    
903
#endif /* ALTQ */
904

    
905
#define        IFQ_IS_EMPTY(ifq)                IF_IS_EMPTY((ifq))
906
#define        IFQ_INC_LEN(ifq)                ((ifq)->ifq_len++)
907
#define        IFQ_DEC_LEN(ifq)                (--(ifq)->ifq_len)
908
#define        IFQ_INC_DROPS(ifq)                ((ifq)->ifq_drops++)
909
#define        IFQ_SET_MAXLEN(ifq, len)        ((ifq)->ifq_maxlen = (len))
910

    
911
#include <sys/mallocvar.h>
912
MALLOC_DECLARE(M_IFADDR);
913
MALLOC_DECLARE(M_IFMADDR);
914

    
915
int ifreq_setaddr(u_long, struct ifreq *, const struct sockaddr *);
916

    
917
struct ifnet *if_alloc(u_char);
918
void if_free(struct ifnet *);
919
void if_initname(struct ifnet *, const char *, int);
920
struct ifaddr *if_dl_create(const struct ifnet *, const struct sockaddr_dl **);
921
void if_activate_sadl(struct ifnet *, struct ifaddr *,
922
    const struct sockaddr_dl *);
923
void        if_set_sadl(struct ifnet *, const void *, u_char, bool);
924
void        if_alloc_sadl(struct ifnet *);
925
void        if_initialize(struct ifnet *);
926
void        if_register(struct ifnet *);
927
void        if_attach(struct ifnet *); /* Deprecated. Use if_initialize and if_register */
928
void        if_attachdomain(void);
929
void        if_deactivate(struct ifnet *);
930
void        if_purgeaddrs(struct ifnet *, int, void (*)(struct ifaddr *));
931
void        if_detach(struct ifnet *);
932
void        if_down(struct ifnet *);
933
void        if_link_state_change(struct ifnet *, int);
934
void        if_up(struct ifnet *);
935
void        ifinit(void);
936
void        ifinit1(void);
937
int        ifaddrpref_ioctl(struct socket *, u_long, void *, struct ifnet *);
938
extern int (*ifioctl)(struct socket *, u_long, void *, struct lwp *);
939
int        ifioctl_common(struct ifnet *, u_long, void *);
940
int        ifpromisc(struct ifnet *, int);
941
struct        ifnet *ifunit(const char *);
942
int        if_addr_init(ifnet_t *, struct ifaddr *, bool);
943
int        if_do_dad(struct ifnet *);
944
int        if_mcast_op(ifnet_t *, const unsigned long, const struct sockaddr *);
945
int        if_flags_set(struct ifnet *, const short);
946
int        if_clone_list(int, char *, int *);
947

    
948
void ifa_insert(struct ifnet *, struct ifaddr *);
949
void ifa_remove(struct ifnet *, struct ifaddr *);
950

    
951
void        ifaref(struct ifaddr *);
952
void        ifafree(struct ifaddr *);
953

    
954
struct        ifaddr *ifa_ifwithaddr(const struct sockaddr *);
955
struct        ifaddr *ifa_ifwithaf(int);
956
struct        ifaddr *ifa_ifwithdstaddr(const struct sockaddr *);
957
struct        ifaddr *ifa_ifwithnet(const struct sockaddr *);
958
struct        ifaddr *ifa_ifwithladdr(const struct sockaddr *);
959
struct        ifaddr *ifa_ifwithroute(int, const struct sockaddr *,
960
                                        const struct sockaddr *);
961
struct        ifaddr *ifaof_ifpforaddr(const struct sockaddr *, struct ifnet *);
962
void        ifafree(struct ifaddr *);
963
void        link_rtrequest(int, struct rtentry *, const struct rt_addrinfo *);
964
void        p2p_rtrequest(int, struct rtentry *, const struct rt_addrinfo *);
965

    
966
void        if_clone_attach(struct if_clone *);
967
void        if_clone_detach(struct if_clone *);
968

    
969
int        ifq_enqueue(struct ifnet *, struct mbuf * ALTQ_COMMA
970
    ALTQ_DECL(struct altq_pktattr *));
971
int        ifq_enqueue2(struct ifnet *, struct ifqueue *, struct mbuf * ALTQ_COMMA
972
    ALTQ_DECL(struct altq_pktattr *));
973

    
974
int        loioctl(struct ifnet *, u_long, void *);
975
void        loopattach(int);
976
int        looutput(struct ifnet *,
977
           struct mbuf *, const struct sockaddr *, struct rtentry *);
978
void        lortrequest(int, struct rtentry *, const struct rt_addrinfo *);
979

    
980
/*
981
 * These are exported because they're an easy way to tell if
982
 * an interface is going away without having to burn a flag.
983
 */
984
int        if_nulloutput(struct ifnet *, struct mbuf *,
985
            const struct sockaddr *, struct rtentry *);
986
void        if_nullinput(struct ifnet *, struct mbuf *);
987
void        if_nullstart(struct ifnet *);
988
int        if_nullioctl(struct ifnet *, u_long, void *);
989
int        if_nullinit(struct ifnet *);
990
void        if_nullstop(struct ifnet *, int);
991
void        if_nullslowtimo(struct ifnet *);
992
#define        if_nullwatchdog        if_nullslowtimo
993
void        if_nulldrain(struct ifnet *);
994
#else
995
struct if_nameindex {
996
        unsigned int        if_index;        /* 1, 2, ... */
997
        char                *if_name;        /* null terminated name: "le0", ... */
998
};
999

    
1000
#include <sys/cdefs.h>
1001
__BEGIN_DECLS
1002
unsigned int if_nametoindex(const char *);
1003
char *        if_indextoname(unsigned int, char *);
1004
struct        if_nameindex * if_nameindex(void);
1005
void        if_freenameindex(struct if_nameindex *);
1006
__END_DECLS
1007
#endif /* _KERNEL */ /* XXX really ALTQ? */
1008

    
1009
#ifdef _KERNEL
1010

    
1011
#define        IFNET_FIRST()                        TAILQ_FIRST(&ifnet_list)
1012
#define        IFNET_EMPTY()                        TAILQ_EMPTY(&ifnet_list)
1013
#define        IFNET_NEXT(__ifp)                TAILQ_NEXT((__ifp), if_list)
1014
#define        IFNET_FOREACH(__ifp)                TAILQ_FOREACH(__ifp, &ifnet_list, if_list)
1015
#define        IFADDR_FIRST(__ifp)                TAILQ_FIRST(&(__ifp)->if_addrlist)
1016
#define        IFADDR_NEXT(__ifa)                TAILQ_NEXT((__ifa), ifa_list)
1017
#define        IFADDR_FOREACH(__ifa, __ifp)        TAILQ_FOREACH(__ifa, \
1018
                                            &(__ifp)->if_addrlist, ifa_list)
1019
#define        IFADDR_FOREACH_SAFE(__ifa, __ifp, __nifa) \
1020
                                            TAILQ_FOREACH_SAFE(__ifa, \
1021
                                            &(__ifp)->if_addrlist, ifa_list, __nifa)
1022
#define        IFADDR_EMPTY(__ifp)                TAILQ_EMPTY(&(__ifp)->if_addrlist)
1023

    
1024
extern struct ifnet_head ifnet_list;
1025
extern struct ifnet *lo0ifp;
1026

    
1027
ifnet_t *        if_byindex(u_int);
1028

    
1029
/*
1030
 * ifq sysctl support
1031
 */
1032
int        sysctl_ifq(int *name, u_int namelen, void *oldp,
1033
                       size_t *oldlenp, void *newp, size_t newlen,
1034
                       struct ifqueue *ifq);
1035
/* symbolic names for terminal (per-protocol) CTL_IFQ_ nodes */
1036
#define IFQCTL_LEN 1
1037
#define IFQCTL_MAXLEN 2
1038
#define IFQCTL_PEAK 3
1039
#define IFQCTL_DROPS 4
1040
#define IFQCTL_MAXID 5
1041

    
1042
#endif /* _KERNEL */
1043

    
1044
#ifdef _NETBSD_SOURCE
1045
/*
1046
 * sysctl for ifq (per-protocol packet input queue variant of ifqueue)
1047
 */
1048
#define CTL_IFQ_NAMES  { \
1049
        { 0, 0 }, \
1050
        { "len", CTLTYPE_INT }, \
1051
        { "maxlen", CTLTYPE_INT }, \
1052
        { "peak", CTLTYPE_INT }, \
1053
        { "drops", CTLTYPE_INT }, \
1054
}
1055
#endif /* _NETBSD_SOURCE */
1056
#endif /* !_NET_IF_H_ */