1 /* LWIP service - ethif.c - ethernet interfaces */
3 * The most important aspect of this module is to maintain a send queue for the
4 * interface. This send queue consists of packets to send. At times, the user
5 * may request a change to the driver configuration. While configuration
6 * requests would ideally be enqueued in the send queue, this has proven too
7 * problematic to work in practice, especially since out-of-memory conditions
8 * may prevent configuration requests from being accepted immediately in such a
9 * model. Instead, we take a simple and blunt approach: configuration requests
10 * "cut in line" and thus take precedence over pending packets in the send
11 * queue. This may not always be entirely correct: for example, packets may be
12 * transmitted with the old ethernet address after the network device has
13 * already been reconfigured to receive from a new ethernet address. However,
14 * this should not be a real problem, and we take care explicitly of perhaps
15 * the most problematic case: packets not getting checksummed due to checksum
16 * offloading configuration changes.
18 * Even with this blunt approach, we maintain three concurrent configurations:
19 * the active, the pending, and the wanted configuration. The active one is
20 * the last known active configuration at the network driver. It used not only
21 * to report whether the device is in RUNNING state, but also to replay the
22 * active configuration to a restarted driver. The pending configuration is
23 * a partially new configuration that has been given to ndev to send to the
24 * driver, but not yet acknowledged by the driver. Finally, the wanted
25 * configuration is the latest one that has yet to be given to ndev.
27 * Each configuration has a bitmask indicating which part of the configuration
28 * has changed, in order to limit work on the driver side. This is also the
29 * reason that the pending and wanted configurations are separate: if e.g. a
30 * media change is pending at the driver, and the user also requests a mode
31 * change, we do not want the media change to be repeated after it has been
32 * acknowleged by the driver, just to change the mode as well. In this example
33 * the pending configuration will have NDEV_SET_MEDIA set, and the wanted
34 * configuration will have NDEV_SET_MODE set. Once acknowledged, the pending
35 * bitmask is cleared and the wanted bitmask is tested to see if another
36 * configuration change should be given to ndev. Technically, this could lead
37 * to starvation of actual packet transmission, but we expect configuration
38 * changes to be very rare, since they are always user initiated.
40 * It is important to note for understanding the code that for some fields
41 * (mode, flags, caps), the three configurations are cascading: even though the
42 * wanted configuration may not have NDEV_SET_MODE set, its mode field will
43 * still contain the most recently requested mode; that is, the mode in the
44 * pending configuration if that one has NDEV_SET_MODE set, or otherwise the
45 * mode in the active configuration. For that reason, we carefully merge
46 * configuration requests into the next level (wanted -> pending -> active),
47 * updating just the fields that have been changed by the previous level. This
48 * approach simplifies obtaining current values a lot, but is not very obvious.
50 * Also, we never send multiple configuration requests at once, even though
51 * ndev would let us do that: we use a single array for the list of multicast
52 * ethernet addresses that we send to the driver, which the driver may retrieve
53 * (using a memory grant) at any time. We necessarily recompute the multicast
54 * list before sending a configuration request, and thus, sending multiple
55 * requests at once may lead to the driver retrieving a corrupted list.
61 #include "lwip/etharp.h"
62 #include "lwip/ethip6.h"
63 #include "lwip/igmp.h"
64 #include "lwip/mld6.h"
66 #include <net/if_media.h>
68 #define ETHIF_MAX_MTU 1500 /* maximum MTU value for ethernet */
69 #define ETHIF_DEF_MTU ETHIF_MAX_MTU /* default MTU value that we use */
71 #define ETHIF_MCAST_MAX 8 /* maximum number of multicast addresses */
74 struct ifdev ethif_ifdev
; /* interface device, MUST be first */
75 ndev_id_t ethif_ndev
; /* network device ID */
76 unsigned int ethif_flags
; /* interface flags (ETHIFF_) */
77 uint32_t ethif_caps
; /* driver capabilities (NDEV_CAPS_) */
78 uint32_t ethif_media
; /* driver-reported media type (IFM_) */
79 struct ndev_conf ethif_active
; /* active configuration (at driver) */
80 struct ndev_conf ethif_pending
; /* pending configuration (at ndev) */
81 struct ndev_conf ethif_wanted
; /* desired configuration (waiting) */
82 struct ndev_hwaddr ethif_mclist
[ETHIF_MCAST_MAX
]; /* multicast list */
83 struct { /* send queue (packet/conf refs) */
84 struct pbuf
*es_head
; /* first (oldest) request reference */
85 struct pbuf
**es_unsentp
; /* ptr-ptr to first unsent request */
86 struct pbuf
**es_tailp
; /* ptr-ptr for adding new requests */
87 unsigned int es_count
; /* buffer count, see ETHIF_PBUF_.. */
89 struct { /* receive queue (packets) */
90 struct pbuf
*er_head
; /* first (oldest) request buffer */
91 struct pbuf
**er_tailp
; /* ptr-ptr for adding new requests */
93 SIMPLEQ_ENTRY(ethif
) ethif_next
; /* next in free list */
94 } ethif_array
[NR_NDEV
]; /* any other value would be suboptimal */
96 #define ethif_get_name(ethif) (ifdev_get_name(&(ethif)->ethif_ifdev))
97 #define ethif_get_netif(ethif) (ifdev_get_netif(&(ethif)->ethif_ifdev))
99 #define ETHIFF_DISABLED 0x01 /* driver has disappeared */
100 #define ETHIFF_FIRST_CONF 0x02 /* first configuration request sent */
103 * Send queue limit settings. Both are counted in number of pbuf objects.
104 * ETHIF_PBUF_MIN is the minimum number of pbuf objects that can always be
105 * enqueued on a particular interface's send queue. It should be at least the
106 * number of pbufs for one single packet after being reduced to the ndev limit,
107 * so NDEV_IOV_MAX (8) is a natural fit. The ETHIF_PBUF_MAX_n values define
108 * the maximum number of pbufs that may be used by all interface send queues
109 * combined, whichever of the two is smaller. The resulting number must be set
110 * fairly high, because at any time there may be a lot of active TCP sockets
111 * that all generate a (multi-pbuf) packet as a result of a clock tick. It is
112 * currently a function of the size of the buffer pool, capped to a value that
113 * is a function of the number of TCP sockets (assuming one packet per socket;
114 * up to MSS/BUFSIZE+1 data pbufs, one header pbuf, one extra as margin). The
115 * difference between the per-interface guaranteed minimum and the global
116 * maximum is what makes up a pool of "spares", which are really just tokens
117 * allowing for enqueuing of that many pbufs.
119 #define ETHIF_PBUF_MIN (NDEV_IOV_MAX)
120 #define ETHIF_PBUF_MAX_1 (mempool_cur_buffers() >> 1)
121 #define ETHIF_PBUF_MAX_2 (NR_TCPSOCK * (TCP_MSS / MEMPOOL_BUFSIZE + 3))
123 static unsigned int ethif_spares
;
125 static SIMPLEQ_HEAD(, ethif
) ethif_freelist
; /* free ethif objects */
127 static const struct ifdev_ops ethif_ops
;
130 static ip6_addr_t ethif_ip6addr_allnodes_ll
;
134 * Initialize the ethernet interfaces module.
141 /* Initialize the list of free ethif objects. */
142 SIMPLEQ_INIT(ðif_freelist
);
144 for (slot
= 0; slot
< __arraycount(ethif_array
); slot
++)
145 SIMPLEQ_INSERT_TAIL(ðif_freelist
, ðif_array
[slot
],
148 /* Initialize the number of in-use spare tokens. */
152 /* Preinitialize the link-local all-nodes IPv6 multicast address. */
153 ip6_addr_set_allnodes_linklocal(ðif_ip6addr_allnodes_ll
);
158 * As the result of some event, the NetBSD-style interface flags for this
159 * interface may have changed. Recompute and update the flags as appropriate.
162 ethif_update_ifflags(struct ethif
* ethif
)
164 unsigned int ifflags
;
166 ifflags
= ifdev_get_ifflags(ðif
->ethif_ifdev
);
168 /* These are the flags that we might update here. */
169 ifflags
&= ~(IFF_RUNNING
| IFF_ALLMULTI
);
172 * For us, the RUNNING flag indicates that -as far as we know- the
173 * network device is fully operational and has its I/O engines running.
174 * This is a reflection of the current state, not of any intention, so
175 * we look at the active configuration here. We use the same approach
176 * for one other receive state flags here (ALLMULTI).
178 if ((ethif
->ethif_flags
&
179 (ETHIFF_DISABLED
| ETHIFF_FIRST_CONF
)) == 0 &&
180 ethif
->ethif_active
.nconf_mode
!= NDEV_MODE_DOWN
) {
181 ifflags
|= IFF_RUNNING
;
183 if (ethif
->ethif_active
.nconf_mode
& NDEV_MODE_MCAST_ALL
)
184 ifflags
|= IFF_ALLMULTI
;
187 ifdev_update_ifflags(ðif
->ethif_ifdev
, ifflags
);
191 * Add a multicast hardware receive address into the set of hardware addresses
192 * in the given configuration, if the given address is not already in the
193 * configuration's set. Adjust the configuration's mode as needed. Return
194 * TRUE If the address was added, and FALSE if the address could not be added
195 * due to a full list (of 'max' elements), in which case the mode is changed
196 * from receiving from listed multicast addresses to receiving from all
197 * multicast addresses.
200 ethif_add_mcast(struct ndev_conf
* nconf
, unsigned int max
,
201 struct ndev_hwaddr
* hwaddr
)
206 * See if the hardware address is already in the list we produced so
207 * far. This makes the multicast list generation O(n^2) but we do not
208 * expect many entries nor is the list size large anyway.
210 for (slot
= 0; slot
< nconf
->nconf_mccount
; slot
++)
211 if (!memcmp(&nconf
->nconf_mclist
[slot
], hwaddr
,
215 if (nconf
->nconf_mccount
< max
) {
216 memcpy(&nconf
->nconf_mclist
[slot
], hwaddr
, sizeof(*hwaddr
));
217 nconf
->nconf_mccount
++;
219 nconf
->nconf_mode
|= NDEV_MODE_MCAST_LIST
;
223 nconf
->nconf_mode
&= ~NDEV_MODE_MCAST_LIST
;
224 nconf
->nconf_mode
|= NDEV_MODE_MCAST_ALL
;
231 * Add the ethernet hardware address derived from the given IPv4 multicast
232 * address, to the list of multicast addresses.
235 ethif_add_mcast_v4(struct ndev_conf
* nconf
, unsigned int max
,
236 const ip4_addr_t
* ip4addr
)
238 struct ndev_hwaddr hwaddr
;
240 /* 01:00:05:xx:xx:xx with the lower 23 bits of the IPv4 address. */
241 hwaddr
.nhwa_addr
[0] = LL_IP4_MULTICAST_ADDR_0
;
242 hwaddr
.nhwa_addr
[1] = LL_IP4_MULTICAST_ADDR_1
;
243 hwaddr
.nhwa_addr
[2] = LL_IP4_MULTICAST_ADDR_2
;
244 hwaddr
.nhwa_addr
[3] = (ip4_addr_get_u32(ip4addr
) >> 16) & 0x7f;
245 hwaddr
.nhwa_addr
[4] = (ip4_addr_get_u32(ip4addr
) >> 8) & 0xff;
246 hwaddr
.nhwa_addr
[5] = (ip4_addr_get_u32(ip4addr
) >> 0) & 0xff;
248 return ethif_add_mcast(nconf
, max
, &hwaddr
);
252 * Add the ethernet hardware address derived from the given IPv6 multicast
253 * address, to the list of multicast addresses.
256 ethif_add_mcast_v6(struct ndev_conf
* nconf
, unsigned int max
,
257 const ip6_addr_t
* ip6addr
)
259 struct ndev_hwaddr hwaddr
;
261 /* 33:33:xx:xx:xx:xx with the lower 32 bits of the IPv6 address. */
262 hwaddr
.nhwa_addr
[0] = LL_IP6_MULTICAST_ADDR_0
;
263 hwaddr
.nhwa_addr
[1] = LL_IP6_MULTICAST_ADDR_1
;
264 memcpy(&hwaddr
.nhwa_addr
[2], &ip6addr
->addr
[3], sizeof(uint32_t));
266 return ethif_add_mcast(nconf
, max
, &hwaddr
);
270 * Set up the multicast mode for a configuration that is to be sent to a
271 * network driver, generating a multicast receive address list for the driver
275 ethif_gen_mcast(struct ethif
* ethif
, struct ndev_conf
* nconf
)
277 struct igmp_group
*group4
;
278 struct mld_group
*group6
;
281 /* Make sure that multicast is supported at all for this interface. */
282 if (!(ethif
->ethif_caps
& NDEV_CAP_MCAST
))
285 /* Make sure the mode is being (re)configured to be up. */
286 if (!(nconf
->nconf_set
& NDEV_SET_MODE
) ||
287 nconf
->nconf_mode
== NDEV_MODE_DOWN
)
290 /* Recompute the desired multicast flags. */
291 nconf
->nconf_mode
&= ~(NDEV_MODE_MCAST_LIST
| NDEV_MODE_MCAST_ALL
);
293 /* If promiscuous mode is enabled, receive all multicast packets. */
294 if (nconf
->nconf_mode
& NDEV_MODE_PROMISC
) {
295 nconf
->nconf_mode
|= NDEV_MODE_MCAST_ALL
;
301 * Map all IGMP/MLD6 multicast addresses to ethernet addresses, merging
302 * any duplicates to save slots. We have to add the MLD6 all-nodes
303 * multicast address ourselves, which also means the list is never
304 * empty unless compiling with USE_INET6=no. If the list is too small
305 * for all addresses, opt to receive all multicast packets instead.
307 nconf
->nconf_mclist
= ethif
->ethif_mclist
;
308 nconf
->nconf_mccount
= 0;
309 max
= __arraycount(ethif
->ethif_mclist
);
311 for (group4
= netif_igmp_data(ethif_get_netif(ethif
)); group4
!= NULL
;
312 group4
= group4
->next
)
313 if (!ethif_add_mcast_v4(nconf
, max
, &group4
->group_address
))
317 if (!ethif_add_mcast_v6(nconf
, max
, ðif_ip6addr_allnodes_ll
))
321 for (group6
= netif_mld6_data(ethif_get_netif(ethif
)); group6
!= NULL
;
322 group6
= group6
->next
)
323 if (!ethif_add_mcast_v6(nconf
, max
, &group6
->group_address
))
328 * Merge a source configuration into a destination configuration, copying any
329 * fields intended to be set from the source into the destination and clearing
330 * the "set" mask in the source, without changing the source fields, so that
331 * the source will reflect the destination's contents.
334 ethif_merge_conf(struct ndev_conf
* dconf
, struct ndev_conf
* sconf
)
337 dconf
->nconf_set
|= sconf
->nconf_set
;
339 if (sconf
->nconf_set
& NDEV_SET_MODE
)
340 dconf
->nconf_mode
= sconf
->nconf_mode
;
341 if (sconf
->nconf_set
& NDEV_SET_CAPS
)
342 dconf
->nconf_caps
= sconf
->nconf_caps
;
343 if (sconf
->nconf_set
& NDEV_SET_FLAGS
)
344 dconf
->nconf_flags
= sconf
->nconf_flags
;
345 if (sconf
->nconf_set
& NDEV_SET_MEDIA
)
346 dconf
->nconf_media
= sconf
->nconf_media
;
347 if (sconf
->nconf_set
& NDEV_SET_HWADDR
)
348 memcpy(&dconf
->nconf_hwaddr
, &sconf
->nconf_hwaddr
,
349 sizeof(dconf
->nconf_hwaddr
));
351 sconf
->nconf_set
= 0;
355 * Return TRUE if we can and should try to pass a configuration request to the
356 * ndev layer on this interface, or FALSE otherwise.
359 ethif_can_conf(struct ethif
* ethif
)
362 /* Is there a configuration change waiting? The common case is no. */
363 if (ethif
->ethif_wanted
.nconf_set
== 0)
367 * Is there a configuration change pending already? Then wait for it
368 * to be acknowledged first.
370 if (ethif
->ethif_pending
.nconf_set
!= 0)
373 /* Make sure the interface is in the appropriate state. */
374 if (ethif
->ethif_flags
& ETHIFF_DISABLED
)
377 /* First let all current packet send requests finish. */
378 return (ethif
->ethif_snd
.es_unsentp
== ðif
->ethif_snd
.es_head
);
382 * Return TRUE if we can and should try to pass the next unsent packet send
383 * request to the ndev layer on this interface, or FALSE otherwise.
386 ethif_can_send(struct ethif
* ethif
)
389 /* Is there anything to hand to ndev at all? The common case is no. */
390 if (*ethif
->ethif_snd
.es_unsentp
== NULL
)
394 * Is there a configuration change pending? Then we cannot send
395 * packets yet. Always let all configuration changes through first.
397 if (ethif
->ethif_pending
.nconf_set
!= 0 ||
398 ethif
->ethif_wanted
.nconf_set
!= 0)
401 /* Make sure the interface is in the appropriate state. */
402 if ((ethif
->ethif_flags
& (ETHIFF_DISABLED
| ETHIFF_FIRST_CONF
)) != 0)
409 * Return TRUE if we can and should try to receive packets on this interface
410 * and are ready to accept received packets, or FALSE otherwise.
413 ethif_can_recv(struct ethif
* ethif
)
416 if ((ethif
->ethif_flags
& (ETHIFF_DISABLED
| ETHIFF_FIRST_CONF
)) != 0)
420 * We do not check the link status here. There is no reason not to
421 * spawn receive requests, or accept received packets, while the link
422 * is reported to be down.
424 return ifdev_is_up(ðif
->ethif_ifdev
);
428 * Polling function, invoked after each message loop iteration. Check whether
429 * any configuration change or packets can be sent to the driver, and whether
430 * any new packet receive requests can be enqueued at the driver.
433 ethif_poll(struct ifdev
* ifdev
)
435 struct ethif
*ethif
= (struct ethif
*)ifdev
;
436 struct pbuf
*pbuf
, *pref
;
439 * If a configuration request is desired, see if we can send it to the
440 * driver now. Otherwise, attempt to send any packets if possible.
441 * In both cases, a failure of the ndev call indicates that we should
444 if (ethif_can_conf(ethif
)) {
445 ethif_gen_mcast(ethif
, ðif
->ethif_wanted
);
448 * On success, move the wanted configuration into the pending
449 * slot. Otherwise, try again on the next poll iteration.
451 if (ndev_conf(ethif
->ethif_ndev
, ðif
->ethif_wanted
) == OK
)
452 ethif_merge_conf(ðif
->ethif_pending
,
453 ðif
->ethif_wanted
);
455 while (ethif_can_send(ethif
)) {
456 pref
= *ethif
->ethif_snd
.es_unsentp
;
458 if (pref
->type
== PBUF_REF
)
459 pbuf
= (struct pbuf
*)pref
->payload
;
463 if (ndev_send(ethif
->ethif_ndev
, pbuf
) == OK
)
464 ethif
->ethif_snd
.es_unsentp
=
472 * Attempt to create additional receive requests for the driver, if
473 * applicable. We currently do not set a limit on the maximum number
474 * of concurrently pending receive requests here, because the maximum
475 * in ndev is already quite low. That may have to be changed one day.
477 while (ethif_can_recv(ethif
) && ndev_can_recv(ethif
->ethif_ndev
)) {
479 * Allocate a buffer for the network device driver to copy the
480 * received packet into. Allocation may fail if no buffers are
481 * available at this time; in that case simply try again later.
482 * We add room for a VLAN tag even though we do not support
483 * such tags just yet.
485 if ((pbuf
= pchain_alloc(PBUF_RAW
, ETH_PAD_LEN
+ ETH_HDR_LEN
+
486 ETHIF_MAX_MTU
+ NDEV_ETH_PACKET_TAG
)) == NULL
)
490 * Effectively throw away two bytes in order to align TCP/IP
491 * header fields to 32 bits. See the short discussion in
492 * lwipopts.h as to why we are not using lwIP's ETH_PAD_SIZE.
494 util_pbuf_header(pbuf
, -ETH_PAD_LEN
);
497 * Send the request to the driver. This may still fail due to
498 * grant allocation failure, in which case we try again later.
500 if (ndev_recv(ethif
->ethif_ndev
, pbuf
) != OK
) {
507 * Hold on to the packet buffer until the receive request
508 * completes or is aborted, or the driver disappears.
510 *ethif
->ethif_rcv
.er_tailp
= pbuf
;
511 ethif
->ethif_rcv
.er_tailp
= pchain_end(pbuf
);
516 * Complete the link-layer header of the packet by filling in a source address.
517 * This is relevant for BPF-generated packets only, and thus we can safely
518 * modify the given pbuf.
521 ethif_hdrcmplt(struct ifdev
* ifdev
, struct pbuf
* pbuf
)
525 /* Make sure there is an ethernet packet header at all. */
526 if (pbuf
->len
< ETH_HDR_LEN
)
529 netif
= ifdev_get_netif(ifdev
);
532 * Insert the source ethernet address into the packet. The source
533 * address is located right after the destination address at the start
536 memcpy((uint8_t *)pbuf
->payload
+ netif
->hwaddr_len
, netif
->hwaddr
,
541 * Return TRUE if the given additional number of spare tokens may be used, or
542 * FALSE if the limit has been reached. Each spare token represents one
543 * enqueued pbuf. The limit must be such that we do not impede normal traffic
544 * but also do not spend the entire buffer pool on enqueued packets.
547 ethif_can_spare(unsigned int spares
)
552 * Use the configured maximum, which depends on the current size of the
555 max
= ETHIF_PBUF_MAX_1
;
558 * However, limit the total to a value based on the maximum number of
559 * TCP packets that can, in the worst case, be expected to queue up at
562 if (max
> ETHIF_PBUF_MAX_2
)
563 max
= ETHIF_PBUF_MAX_2
;
565 return (spares
+ ethif_spares
<= max
- ETHIF_PBUF_MIN
* NR_NDEV
);
569 * Process a packet as output on an ethernet interface.
572 ethif_output(struct ifdev
* ifdev
, struct pbuf
* pbuf
, struct netif
* netif
)
574 struct ethif
*ethif
= (struct ethif
*)ifdev
;
575 struct pbuf
*pref
, *pcopy
;
577 unsigned int count
, spares
;
579 /* Packets must never be sent on behalf of another interface. */
580 assert(netif
== NULL
);
583 * The caller already rejects packets while the interface or link is
584 * down. We do want to keep enqueuing packets while the driver is
585 * restarting, so do not check ETHIFF_DISABLED or ETHIFF_FIRST_CONF.
589 * Reject oversized packets immediately. This should not happen.
590 * Undersized packets are padded below.
592 if (pbuf
->tot_len
> NDEV_ETH_PACKET_MAX
) {
593 printf("LWIP: attempt to send oversized ethernet packet "
594 "(size %u)\n", pbuf
->tot_len
);
601 * The original lwIP idea for processing output packets is that we make
602 * a copy of the packet here, so that lwIP is free to do whatever it
603 * wants with the original packet (e.g., keep on the TCP retransmission
604 * queue). More recently, lwIP has made progress towards allowing the
605 * packet to be referenced only, decreasing the reference count only
606 * once the packet has been actually sent. For many embedded systems,
607 * that change now allows zero-copy transmission with direct DMA from
608 * the provided packet buffer. We are not so lucky: we have to make an
609 * additional inter-process copy anyway. We do however use the same
610 * referencing system to avoid having to make yet another copy of the
613 * There was previously a check on (pbuf->ref > 1) here, to ensure that
614 * we would never enqueue packets that are retransmitted while we were
615 * still in the process of sending the initial copy. Now that for ARP
616 * and NDP queuing, packets are referenced rather than copied (lwIP
617 * patch #9272), we can no longer perform that check: packets may
618 * legitimately have a reference count of 2 at this point. The second
619 * reference will be dropped by the caller immediately after we return.
623 * There are two cases in which we need to make a copy of the packet
626 * 1) in the case that the packet needs to be padded in order to reach
627 * the minimum ethernet packet size (for drivers' convenience);
628 * 2) in the (much more exceptional) case that the given pbuf chain
629 * exceeds the maximum vector size for network driver requests.
631 if (NDEV_ETH_PACKET_MIN
> pbuf
->tot_len
)
632 padding
= NDEV_ETH_PACKET_MIN
- pbuf
->tot_len
;
636 count
= pbuf_clen(pbuf
);
638 if (padding
!= 0 || count
> NDEV_IOV_MAX
) {
639 pcopy
= pchain_alloc(PBUF_RAW
, pbuf
->tot_len
+ padding
);
641 ifdev_output_drop(ifdev
);
646 if (pbuf_copy(pcopy
, pbuf
) != ERR_OK
)
647 panic("unexpected pbuf copy failure");
651 * This restriction can be lifted if needed, but it
652 * involves hairy pbuf traversal and our standard pool
653 * size should be way in excess of the minimum packet
656 assert(pcopy
->len
== pbuf
->tot_len
+ padding
);
658 memset((char *)pcopy
->payload
+ pbuf
->tot_len
, 0,
662 count
= pbuf_clen(pcopy
);
663 assert(count
<= NDEV_IOV_MAX
);
670 * Restrict the size of the send queue, so that it will not exhaust the
673 if (ethif
->ethif_snd
.es_count
>= ETHIF_PBUF_MIN
)
675 else if (ethif
->ethif_snd
.es_count
+ count
> ETHIF_PBUF_MIN
)
676 spares
= ethif
->ethif_snd
.es_count
+ count
- ETHIF_PBUF_MIN
;
680 if (spares
> 0 && !ethif_can_spare(spares
)) {
684 ifdev_output_drop(ifdev
);
690 * A side effect of the referencing approach is that we cannot touch
691 * the last pbuf's "next" pointer. Thus, we need another way of
692 * linking together the buffers on the send queue. We use a linked
693 * list of PBUF_REF-type buffers for this instead. However, do this
694 * only when we have not made a copy of the original pbuf, because then
695 * we might as well use the copy instead.
698 if ((pref
= pbuf_alloc(PBUF_RAW
, 0, PBUF_REF
)) == NULL
) {
699 ifdev_output_drop(ifdev
);
706 pref
->payload
= pbuf
;
712 /* If the send queue was empty so far, set the IFF_OACTIVE flag. */
713 if (ethif
->ethif_snd
.es_head
== NULL
)
714 ifdev_update_ifflags(ðif
->ethif_ifdev
,
715 ifdev_get_ifflags(ðif
->ethif_ifdev
) | IFF_OACTIVE
);
718 * Enqueue the packet on the send queue. It will be sent from the
719 * polling function as soon as possible. TODO: see if sending it from
720 * here makes any performance difference at all.
722 *ethif
->ethif_snd
.es_tailp
= pref
;
723 ethif
->ethif_snd
.es_tailp
= pchain_end(pref
);
725 ethif
->ethif_snd
.es_count
+= count
;
726 ethif_spares
+= spares
;
732 * Transmit an ethernet packet on an ethernet interface, as requested by lwIP.
735 ethif_linkoutput(struct netif
* netif
, struct pbuf
* pbuf
)
737 struct ifdev
*ifdev
= netif_get_ifdev(netif
);
740 * Let ifdev make the callback to our output function, so that it can
741 * pass the packet to BPF devices and generically update statistics.
743 return ifdev_output(ifdev
, pbuf
, NULL
/*netif*/, TRUE
/*to_bpf*/,
748 * The multicast address list has changed. See to it that the change will make
749 * it to the network driver at some point.
752 ethif_set_mcast(struct ethif
* ethif
)
756 * Simply generate a mode change request, unless the interface is down.
757 * Once the mode change request is about to be sent to the driver, we
758 * will recompute the multicast settings.
760 if (ifdev_is_up(ðif
->ethif_ifdev
))
761 ethif
->ethif_wanted
.nconf_set
|= NDEV_SET_MODE
;
767 * An IPv4 multicast address has been added to or removed from the list of IPv4
768 * multicast addresses.
771 ethif_set_mcast_v4(struct netif
* netif
, const ip4_addr_t
* group __unused
,
772 enum netif_mac_filter_action action __unused
)
775 return ethif_set_mcast((struct ethif
*)netif_get_ifdev(netif
));
779 * An IPv6 multicast address has been added to or removed from the list of IPv6
780 * multicast addresses.
783 ethif_set_mcast_v6(struct netif
* netif
, const ip6_addr_t
* group __unused
,
784 enum netif_mac_filter_action action __unused
)
787 return ethif_set_mcast((struct ethif
*)netif_get_ifdev(netif
));
791 * Initialization function for an ethernet-type netif interface, called from
792 * lwIP at interface creation time.
795 ethif_init_netif(struct ifdev
* ifdev
, struct netif
* netif
)
797 struct ethif
*ethif
= (struct ethif
*)ifdev
;
800 * Fill in a dummy name. Since it is only two characters, do not
801 * bother trying to reuse part of the given name. If this name is ever
802 * actually used anywhere, the dummy should suffice for debugging.
804 netif
->name
[0] = 'e';
805 netif
->name
[1] = 'n';
807 netif
->linkoutput
= ethif_linkoutput
;
809 memset(netif
->hwaddr
, 0, sizeof(netif
->hwaddr
));
812 * Set the netif flags, partially based on the capabilities reported by
813 * the network device driver. The reason that we do this now is that
814 * lwIP tests for some of these flags and starts appropriate submodules
815 * (e.g., IGMP) right after returning from this function. If we set
816 * the flags later, we also have to take over management of those
817 * submodules, which is something we'd rather avoid. For this reason
818 * in particular, we also do not support capability mask changes after
819 * driver restarts - see ethif_enable().
821 netif
->flags
= NETIF_FLAG_ETHARP
| NETIF_FLAG_ETHERNET
;
823 if (ethif
->ethif_caps
& NDEV_CAP_BCAST
)
824 netif
->flags
|= NETIF_FLAG_BROADCAST
;
826 if (ethif
->ethif_caps
& NDEV_CAP_MCAST
) {
827 /* The IGMP code adds the all-stations multicast entry. */
828 netif
->igmp_mac_filter
= ethif_set_mcast_v4
;
830 netif
->flags
|= NETIF_FLAG_IGMP
;
832 /* For MLD6 we have to add the all-nodes entry ourselves. */
833 netif
->mld_mac_filter
= ethif_set_mcast_v6
;
835 netif
->flags
|= NETIF_FLAG_MLD6
;
842 * The ndev layer reports that a new network device driver has appeared, with
843 * the given ndev identifier, a driver-given name, and a certain set of
844 * capabilities. Create a new ethernet interface object for it. On success,
845 * return a pointer to the object (for later callbacks from ndev). In that
846 * case, the ndev layer will always immediately call ethif_enable() afterwards.
847 * On failure, return NULL, in which case ndev will forget about the driver.
850 ethif_add(ndev_id_t id
, const char * name
, uint32_t caps
)
853 unsigned int ifflags
;
857 * First make sure that the interface name is valid, unique, and not
858 * reserved for virtual interface types.
860 if ((r
= ifdev_check_name(name
, NULL
/*vtype_slot*/)) != OK
) {
862 * There is some risk in printing bad stuff, but this may help
863 * in preventing serious driver writer frustration..
865 printf("LWIP: invalid driver name '%s' (%d)\n", name
, r
);
870 /* Then see if there is a free ethernet interface object available. */
871 if (SIMPLEQ_EMPTY(ðif_freelist
)) {
872 printf("LWIP: out of slots for driver name '%s'\n", name
);
878 * All good; set up the interface. First initialize the object, since
879 * adding the interface to lwIP might spawn some activity right away.
881 ethif
= SIMPLEQ_FIRST(ðif_freelist
);
882 SIMPLEQ_REMOVE_HEAD(ðif_freelist
, ethif_next
);
884 /* Initialize the ethif structure. */
885 memset(ethif
, 0, sizeof(*ethif
));
886 ethif
->ethif_ndev
= id
;
887 ethif
->ethif_flags
= ETHIFF_DISABLED
;
888 ethif
->ethif_caps
= caps
;
890 ethif
->ethif_snd
.es_head
= NULL
;
891 ethif
->ethif_snd
.es_unsentp
= ðif
->ethif_snd
.es_head
;
892 ethif
->ethif_snd
.es_tailp
= ðif
->ethif_snd
.es_head
;
893 ethif
->ethif_snd
.es_count
= 0;
895 ethif
->ethif_rcv
.er_head
= NULL
;
896 ethif
->ethif_rcv
.er_tailp
= ðif
->ethif_rcv
.er_head
;
899 * Set all the three configurations to the same initial values. Since
900 * any change to the configuration will go through all three, this
901 * allows us to obtain various parts of the status (in particular, the
902 * mode, flags, enabled capabilities, and media type selection) from
903 * any of the three without having to consult the others. Note that
904 * the hardware address is set to a indeterminate initial value, as it
905 * is left to the network driver unless specifically overridden.
907 ethif
->ethif_active
.nconf_set
= 0;
908 ethif
->ethif_active
.nconf_mode
= NDEV_MODE_DOWN
;
909 ethif
->ethif_active
.nconf_flags
= 0;
910 ethif
->ethif_active
.nconf_caps
= 0;
911 ethif
->ethif_active
.nconf_media
=
912 IFM_MAKEWORD(IFM_ETHER
, IFM_AUTO
, 0, 0);
913 memcpy(ðif
->ethif_pending
, ðif
->ethif_active
,
914 sizeof(ethif
->ethif_pending
));
915 memcpy(ðif
->ethif_wanted
, ðif
->ethif_pending
,
916 sizeof(ethif
->ethif_wanted
));
919 * Compute the initial NetBSD-style interface flags. The IFF_SIMPLEX
920 * interface flag is always enabled because we do not support network
921 * drivers that are receiving their own packets. In particular, lwIP
922 * currently does not deal well with receiving back its own multicast
923 * packets, which leads to IPv6 DAD failures. The other two flags
924 * (IFF_BROADCAST, IFF_MULTICAST) denote capabilities, not enabled
927 ifflags
= IFF_SIMPLEX
;
928 if (caps
& NDEV_CAP_BCAST
)
929 ifflags
|= IFF_BROADCAST
;
930 if (caps
& NDEV_CAP_MCAST
)
931 ifflags
|= IFF_MULTICAST
;
933 /* Finally, add the interface to ifdev and lwIP. This cannot fail. */
934 ifdev_add(ðif
->ethif_ifdev
, name
, ifflags
, IFT_ETHER
, ETH_HDR_LEN
,
935 ETHARP_HWADDR_LEN
, DLT_EN10MB
, ETHIF_DEF_MTU
,
936 ND6_IFF_PERFORMNUD
| ND6_IFF_AUTO_LINKLOCAL
, ðif_ops
);
942 * The link status and/or media type of an ethernet interface has changed.
945 ethif_set_status(struct ethif
* ethif
, uint32_t link
, uint32_t media
)
949 /* We save the media type locally for now. */
950 ethif
->ethif_media
= media
;
952 /* Let the ifdev module handle the details of the link change. */
954 case NDEV_LINK_UP
: iflink
= LINK_STATE_UP
; break;
955 case NDEV_LINK_DOWN
: iflink
= LINK_STATE_DOWN
; break;
956 default: iflink
= LINK_STATE_UNKNOWN
; break;
959 ifdev_update_link(ðif
->ethif_ifdev
, iflink
);
963 * The ndev layer reports that a previously added or disabled network device
964 * driver has been (re)enabled. Start by initializing the driver. Return TRUE
965 * if the interface could indeed be enabled, or FALSE if it should be forgotten
966 * altogether after all.
969 ethif_enable(struct ethif
* ethif
, const char * name
,
970 const struct ndev_hwaddr
* hwaddr
, uint8_t hwaddr_len
, uint32_t caps
,
971 uint32_t link
, uint32_t media
)
975 assert(ethif
->ethif_flags
& ETHIFF_DISABLED
);
978 * One disadvantage of keeping service labels and ethernet driver names
979 * disjunct is that the ethernet driver may mess with its name between
980 * restarts. Ultimately we may end up renaming our ethernet drivers
981 * such that their labels match their names, in which case we no longer
982 * need the drivers themselves to produce a name, and we can retire
985 if (name
!= NULL
&& strcmp(ethif_get_name(ethif
), name
)) {
986 printf("LWIP: driver '%s' restarted with name '%s'\n",
987 ethif_get_name(ethif
), name
);
993 * The hardware address length is just a sanity check for now. After
994 * the initialization reply, we assume the same length is used for all
995 * addresses, which is also the maximum, namely 48 bits (six bytes).
997 if (hwaddr_len
!= ETHARP_HWADDR_LEN
) {
998 printf("LWIP: driver '%s' reports hwaddr length %u\n",
999 ethif_get_name(ethif
), hwaddr_len
);
1005 * If the driver has changed its available capabilities as a result of
1006 * a restart, we have a problem: we may already have configured the
1007 * interface's netif object to make use of of some of those
1008 * capabilities. TODO: we can deal with some cases (e.g., disappearing
1009 * checksum offloading capabilities) with some effort, and with other
1010 * cases (e.g., disappearing multicast support) with a LOT more effort.
1012 if (ethif
->ethif_caps
!= caps
) {
1013 printf("LWIP: driver '%s' changed capabilities\n",
1014 ethif_get_name(ethif
));
1020 * Set the hardware address on the interface, unless a request is
1021 * currently pending to change it, in which case the new address has
1022 * been set already and we do not want to revert that change. If not,
1023 * we always set the address, because it may have changed as part of a
1024 * driver restart and we do not want to get out of sync with it, nor
1025 * can we necessarily change it back.
1027 if (!(ethif
->ethif_active
.nconf_set
& NDEV_SET_HWADDR
) &&
1028 !(ethif
->ethif_pending
.nconf_set
& NDEV_SET_HWADDR
))
1029 ifdev_update_hwaddr(ðif
->ethif_ifdev
, hwaddr
->nhwa_addr
,
1030 (name
== NULL
) /*is_factory*/);
1033 * At this point, only one more thing can fail: it is possible that we
1034 * do not manage to send the first configuration request due to memory
1035 * shortage. This is extremely unlikely to happen, so send the conf
1036 * request first and forget the entire driver if it fails.
1039 * Always generate a new multicast list before sending a configuration
1040 * request, and at no other time (since there may be a grant for it).
1042 ethif_gen_mcast(ethif
, ðif
->ethif_active
);
1044 if ((r
= ndev_conf(ethif
->ethif_ndev
, ðif
->ethif_active
)) != OK
) {
1045 printf("LWIP: sending first configuration to '%s' failed "
1046 "(%d)\n", ethif_get_name(ethif
), r
);
1051 ethif_set_status(ethif
, link
, media
);
1053 ethif
->ethif_flags
&= ~ETHIFF_DISABLED
;
1054 ethif
->ethif_flags
|= ETHIFF_FIRST_CONF
;
1060 * The configuration change stored in the "pending" slot of the given ethif
1061 * object has been acknowledged by the network device driver (or the driver has
1062 * died, see ethif_disable()). Apply changes to the "active" slot of the given
1063 * ethif object, as well as previously delayed changes to lwIP through netif.
1066 ethif_post_conf(struct ethif
* ethif
)
1068 struct ndev_conf
*nconf
;
1071 nconf
= ðif
->ethif_pending
;
1074 * Now that the driver configuration has changed, we know that the
1075 * new checksum settings will be applied to all sent and received
1076 * packets, and we can disable checksumming flags in netif as desired.
1077 * Enabling checksumming flags has already been done earlier on.
1079 if (nconf
->nconf_set
& NDEV_SET_CAPS
) {
1080 flags
= ethif_get_netif(ethif
)->chksum_flags
;
1082 if (nconf
->nconf_caps
& NDEV_CAP_CS_IP4_TX
)
1083 flags
&= ~NETIF_CHECKSUM_GEN_IP
;
1084 if (nconf
->nconf_caps
& NDEV_CAP_CS_IP4_RX
)
1085 flags
&= ~NETIF_CHECKSUM_CHECK_IP
;
1086 if (nconf
->nconf_caps
& NDEV_CAP_CS_UDP_TX
)
1087 flags
&= ~NETIF_CHECKSUM_GEN_UDP
;
1088 if (nconf
->nconf_caps
& NDEV_CAP_CS_UDP_RX
)
1089 flags
&= ~NETIF_CHECKSUM_CHECK_UDP
;
1090 if (nconf
->nconf_caps
& NDEV_CAP_CS_TCP_TX
)
1091 flags
&= ~NETIF_CHECKSUM_GEN_TCP
;
1092 if (nconf
->nconf_caps
& NDEV_CAP_CS_TCP_RX
)
1093 flags
&= ~NETIF_CHECKSUM_CHECK_TCP
;
1095 NETIF_SET_CHECKSUM_CTRL(ethif_get_netif(ethif
), flags
);
1099 * Merge any individual parts of the now acknowledged configuration
1100 * changes into the active configuration. The result is that we are
1101 * able to reapply these changes at any time should the network driver
1102 * be restarted. In addition, by only setting bits for fields that
1103 * have actually changed, we can later tell whether the user wanted the
1104 * change or ethif should just take over what the driver reports after
1105 * a restart; this is important for HW-address and media settings.
1107 ethif_merge_conf(ðif
->ethif_active
, ðif
->ethif_pending
);
1111 * All receive requests have been canceled at the ndev layer, because the
1112 * network device driver has been restarted or shut down. Clear the receive
1113 * queue, freeing any packets in it.
1116 ethif_drain(struct ethif
* ethif
)
1118 struct pbuf
*pbuf
, **pnext
;
1120 while ((pbuf
= ethif
->ethif_rcv
.er_head
) != NULL
) {
1121 pnext
= pchain_end(pbuf
);
1123 if ((ethif
->ethif_rcv
.er_head
= *pnext
) == NULL
)
1124 ethif
->ethif_rcv
.er_tailp
= ðif
->ethif_rcv
.er_head
;
1132 * The network device driver has stopped working (i.e., crashed), but has not
1133 * been shut down completely, and is expect to come back later.
1136 ethif_disable(struct ethif
* ethif
)
1140 * We assume, optimistically, that a new instance of the driver will be
1141 * brought up soon after which we can continue operating as before. As
1142 * such, we do not want to change most of the user-visible state until
1143 * we know for sure that our optimism was in vain. In particular, we
1144 * do *not* want to change the following parts of the state here:
1146 * - the contents of the send queue;
1147 * - the state of the interface (up or down);
1148 * - the state and media type of the physical link.
1150 * The main user-visible indication of the crash will be that the
1151 * interface does not have the IFF_RUNNING flag set.
1155 * If a configuration request was pending, it will be lost now. Highly
1156 * unintuitively, make the requested configuration the *active* one,
1157 * just as though the request completed successfully. This works,
1158 * because once the driver comes back, the active configuration will be
1159 * replayed as initial configuration. Therefore, by pretending that
1160 * the current request went through, we ensure that it too will be sent
1161 * to the new instance--before anything else is allowed to happen.
1163 if (ethif
->ethif_pending
.nconf_set
!= 0)
1164 ethif_post_conf(ethif
);
1167 * Any packet send requests have been lost, too, and likewise forgotten
1168 * by ndev. Thus, we need to forget that we sent any packets, so that
1169 * they will be resent after the driver comes back up. That *may*
1170 * cause packet duplication, but that is preferable over packet loss.
1172 ethif
->ethif_snd
.es_unsentp
= ðif
->ethif_snd
.es_head
;
1175 * We fully restart the receive queue, because all receive requests
1176 * have been forgotten by ndev as well now and it is easier to simply
1177 * reconstruct the receive queue in its entirety later on.
1181 /* Make sure we do not attempt to initiate new requests for now. */
1182 ethif
->ethif_flags
&= ~ETHIFF_FIRST_CONF
;
1183 ethif
->ethif_flags
|= ETHIFF_DISABLED
;
1187 * Dequeue and discard the packet at the head of the send queue.
1190 ethif_dequeue_send(struct ethif
* ethif
)
1192 struct pbuf
*pref
, *pbuf
, **pnext
;
1193 unsigned int count
, spares
;
1196 * The send queue is a linked list of reference buffers, each of which
1197 * links to the actual packet. Dequeue the first reference buffer.
1199 pref
= ethif
->ethif_snd
.es_head
;
1200 assert(pref
!= NULL
);
1202 pnext
= pchain_end(pref
);
1204 if (ethif
->ethif_snd
.es_unsentp
== pnext
)
1205 ethif
->ethif_snd
.es_unsentp
= ðif
->ethif_snd
.es_head
;
1207 if ((ethif
->ethif_snd
.es_head
= *pnext
) == NULL
)
1208 ethif
->ethif_snd
.es_tailp
= ðif
->ethif_snd
.es_head
;
1210 /* Do this before possibly calling pbuf_clen() below.. */
1214 * If we never made a copy of the original packet, we now have it
1215 * pointed to by a reference buffer. If so, decrease the reference
1216 * count of the actual packet, thereby freeing it if lwIP itself was
1217 * already done with. Otherwise, the copy of the packet is the
1218 * reference buffer itself. In both cases we need to free that buffer.
1220 if (pref
->type
== PBUF_REF
) {
1221 pbuf
= (struct pbuf
*)pref
->payload
;
1227 count
= pbuf_clen(pref
);
1230 assert(ethif
->ethif_snd
.es_count
>= count
);
1231 ethif
->ethif_snd
.es_count
-= count
;
1233 if (ethif
->ethif_snd
.es_count
>= ETHIF_PBUF_MIN
)
1235 else if (ethif
->ethif_snd
.es_count
+ count
> ETHIF_PBUF_MIN
)
1236 spares
= ethif
->ethif_snd
.es_count
+ count
- ETHIF_PBUF_MIN
;
1240 assert(ethif_spares
>= spares
);
1241 ethif_spares
-= spares
;
1243 /* Free the reference buffer as well. */
1246 /* If the send queue is now empty, clear the IFF_OACTIVE flag. */
1247 if (ethif
->ethif_snd
.es_head
== NULL
)
1248 ifdev_update_ifflags(ðif
->ethif_ifdev
,
1249 ifdev_get_ifflags(ðif
->ethif_ifdev
) & ~IFF_OACTIVE
);
1253 * The ndev layer reports that a network device driver has been permanently
1254 * shut down. Remove the corresponding ethernet interface from the system.
1257 ethif_remove(struct ethif
* ethif
)
1261 /* Clear the send and receive queues. */
1262 while (ethif
->ethif_snd
.es_head
!= NULL
)
1263 ethif_dequeue_send(ethif
);
1267 /* Let the ifdev module deal with most other removal aspects. */
1268 if ((r
= ifdev_remove(ðif
->ethif_ifdev
)) != OK
)
1269 panic("unable to remove ethernet interface: %d", r
);
1271 /* Finally, readd the ethif object to the free list. */
1272 SIMPLEQ_INSERT_HEAD(ðif_freelist
, ethif
, ethif_next
);
1276 * The ndev layer reports that the (oldest) pending configuration request has
1277 * completed with the given result.
1280 ethif_configured(struct ethif
* ethif
, int32_t result
)
1284 * The driver is not supposed to return failure in response to a
1285 * configure result. If it does, we have no proper way to recover, as
1286 * we may already have applied part of the new configuration to netif.
1287 * For now, just report failure and then pretend success.
1290 printf("LWIP: driver '%s' replied with conf result %d\n",
1291 ethif_get_name(ethif
), result
);
1296 if (ethif
->ethif_flags
& ETHIFF_FIRST_CONF
)
1297 ethif
->ethif_flags
&= ~ETHIFF_FIRST_CONF
;
1299 ethif_post_conf(ethif
);
1302 * For now, the result is simply a boolean value indicating whether the
1303 * driver is using the all-multicast receive mode instead of the
1304 * multicast-list receive mode. We can turn it into a bitmap later.
1307 ethif
->ethif_active
.nconf_mode
&= ~NDEV_MODE_MCAST_LIST
;
1308 ethif
->ethif_active
.nconf_mode
|= NDEV_MODE_MCAST_ALL
;
1311 /* The interface flags may have changed now, so update them. */
1312 ethif_update_ifflags(ethif
);
1314 /* Regular operation will resume from the polling function. */
1318 * The ndev layer reports that the first packet on the send queue has been
1319 * successfully transmitted with 'result' set to OK, or dropped if 'result' is
1320 * negative. The latter may happen if the interface was taken down while there
1321 * were still packets in transit.
1324 ethif_sent(struct ethif
* ethif
, int32_t result
)
1327 ethif_dequeue_send(ethif
);
1330 ifdev_output_drop(ðif
->ethif_ifdev
);
1332 /* More requests may be sent from the polling function now. */
1336 * The ndev layer reports that the first buffer on the receive queue has been
1337 * filled with a packet of 'result' bytes, or if 'result' is negative, the
1338 * receive request has been aborted.
1341 ethif_received(struct ethif
* ethif
, int32_t result
)
1343 struct pbuf
*pbuf
, *pwalk
, **pnext
;
1347 * Start by removing the first buffer chain off the receive queue. The
1348 * ndev layer guarantees that there ever was a receive request at all.
1350 if ((pbuf
= ethif
->ethif_rcv
.er_head
) == NULL
)
1351 panic("driver received packet but queue empty");
1353 pnext
= pchain_end(pbuf
);
1355 if ((ethif
->ethif_rcv
.er_head
= *pnext
) == NULL
)
1356 ethif
->ethif_rcv
.er_tailp
= ðif
->ethif_rcv
.er_head
;
1359 /* Decide if we can and should deliver a packet to the layers above. */
1360 if (result
<= 0 || !ethif_can_recv(ethif
)) {
1366 if (result
> pbuf
->tot_len
) {
1367 printf("LWIP: driver '%s' returned bad packet size (%zd)\n",
1368 ethif_get_name(ethif
), (ssize_t
)result
);
1376 * The packet often does not use all of the buffers, or at least not
1377 * all of the last buffer. Adjust lengths for the buffers that contain
1378 * part of the packet, and free the remaining (unused) buffers, if any.
1380 left
= (size_t)result
;
1382 for (pwalk
= pbuf
; ; pwalk
= pwalk
->next
) {
1383 pwalk
->tot_len
= left
;
1384 if (pwalk
->len
> left
)
1391 if (pwalk
->next
!= NULL
) {
1392 pbuf_free(pwalk
->next
);
1398 * Finally, hand off the packet to the layers above. We go through
1399 * ifdev so that it can pass the packet to BPF devices and update
1400 * statistics and all that.
1402 ifdev_input(ðif
->ethif_ifdev
, pbuf
, NULL
/*netif*/,
1407 * The ndev layer reports a network driver status update. If anything has
1408 * changed since the last status, we may have to take action. The given
1409 * statistics counters are relative to the previous status report.
1412 ethif_status(struct ethif
* ethif
, uint32_t link
, uint32_t media
,
1413 uint32_t oerror
, uint32_t coll
, uint32_t ierror
, uint32_t iqdrop
)
1415 struct if_data
*ifdata
;
1417 ethif_set_status(ethif
, link
, media
);
1419 ifdata
= ifdev_get_ifdata(ðif
->ethif_ifdev
);
1420 ifdata
->ifi_oerrors
+= oerror
;
1421 ifdata
->ifi_collisions
+= coll
;
1422 ifdata
->ifi_ierrors
+= ierror
;
1423 ifdata
->ifi_iqdrops
+= iqdrop
;
1427 * Set NetBSD-style interface flags (IFF_) for an ethernet interface.
1430 ethif_set_ifflags(struct ifdev
* ifdev
, unsigned int ifflags
)
1432 struct ethif
*ethif
= (struct ethif
*)ifdev
;
1433 uint32_t mode
, flags
;
1436 * We do not support IFF_NOARP at this time, because lwIP does not: the
1437 * idea of IFF_NOARP is that only static ARP entries are used, but lwIP
1438 * does not support separating static from dynamic ARP operation. The
1439 * flag does not appear to be particularly widely used anyway.
1441 if ((ifflags
& ~(IFF_UP
| IFF_DEBUG
| IFF_LINK0
| IFF_LINK1
|
1445 mode
= ethif
->ethif_wanted
.nconf_mode
;
1446 if ((ifflags
& IFF_UP
) && mode
== NDEV_MODE_DOWN
) {
1447 mode
= NDEV_MODE_UP
;
1449 /* Always enable broadcast receipt when supported. */
1450 if (ethif
->ethif_caps
& NDEV_CAP_BCAST
)
1451 mode
|= NDEV_MODE_BCAST
;
1453 if (ifdev_is_promisc(ifdev
))
1454 mode
|= NDEV_MODE_PROMISC
;
1457 * The multicast flags will be set right before we send the
1458 * request to the driver.
1460 } else if (!(ifflags
& IFF_UP
) && mode
!= NDEV_MODE_DOWN
)
1461 ethif
->ethif_wanted
.nconf_mode
= NDEV_MODE_DOWN
;
1463 if (mode
!= ethif
->ethif_wanted
.nconf_mode
) {
1464 ethif
->ethif_wanted
.nconf_mode
= mode
;
1465 ethif
->ethif_wanted
.nconf_set
|= NDEV_SET_MODE
;
1469 * Some of the interface flags (UP, DEBUG, PROMISC, LINK[0-2]) are a
1470 * reflection of the intended state as set by userland before, so that
1471 * a userland utility will never not see the flag it just set (or the
1472 * other way around). These flags therefore do not necessarily reflect
1473 * what is actually going on at that moment. We cannot have both.
1476 if (ifflags
& IFF_DEBUG
)
1477 flags
|= NDEV_FLAG_DEBUG
;
1478 if (ifflags
& IFF_LINK0
)
1479 flags
|= NDEV_FLAG_LINK0
;
1480 if (ifflags
& IFF_LINK1
)
1481 flags
|= NDEV_FLAG_LINK1
;
1482 if (ifflags
& IFF_LINK2
)
1483 flags
|= NDEV_FLAG_LINK2
;
1485 if (flags
!= ethif
->ethif_wanted
.nconf_flags
) {
1486 ethif
->ethif_wanted
.nconf_flags
= flags
;
1487 ethif
->ethif_wanted
.nconf_set
|= NDEV_SET_FLAGS
;
1490 /* The changes will be picked up from the polling function. */
1495 * Convert a bitmask of ndev-layer capabilities (NDEV_CAP_) to NetBSD-style
1496 * interface capabilities (IFCAP_).
1499 ethif_cap_to_ifcap(uint32_t caps
)
1504 if (caps
& NDEV_CAP_CS_IP4_TX
)
1505 ifcap
|= IFCAP_CSUM_IPv4_Tx
;
1506 if (caps
& NDEV_CAP_CS_IP4_RX
)
1507 ifcap
|= IFCAP_CSUM_IPv4_Rx
;
1508 if (caps
& NDEV_CAP_CS_UDP_TX
)
1509 ifcap
|= IFCAP_CSUM_UDPv4_Tx
| IFCAP_CSUM_UDPv6_Tx
;
1510 if (caps
& NDEV_CAP_CS_UDP_RX
)
1511 ifcap
|= IFCAP_CSUM_UDPv4_Rx
| IFCAP_CSUM_UDPv6_Rx
;
1512 if (caps
& NDEV_CAP_CS_TCP_TX
)
1513 ifcap
|= IFCAP_CSUM_TCPv4_Tx
| IFCAP_CSUM_TCPv6_Tx
;
1514 if (caps
& NDEV_CAP_CS_TCP_RX
)
1515 ifcap
|= IFCAP_CSUM_TCPv4_Rx
| IFCAP_CSUM_TCPv6_Rx
;
1521 * Retrieve potential and enabled NetBSD-style interface capabilities (IFCAP_).
1524 ethif_get_ifcap(struct ifdev
* ifdev
, uint64_t * ifcap
, uint64_t * ifena
)
1526 struct ethif
*ethif
= (struct ethif
*)ifdev
;
1528 *ifcap
= ethif_cap_to_ifcap(ethif
->ethif_caps
);
1529 *ifena
= ethif_cap_to_ifcap(ethif
->ethif_wanted
.nconf_caps
);
1533 * Set NetBSD-style enabled interface capabilities (IFCAP_).
1536 ethif_set_ifcap(struct ifdev
* ifdev
, uint64_t ifcap
)
1538 struct ethif
*ethif
= (struct ethif
*)ifdev
;
1542 if (ifcap
& ~(IFCAP_CSUM_IPv4_Tx
| IFCAP_CSUM_IPv4_Rx
|
1543 IFCAP_CSUM_UDPv4_Tx
| IFCAP_CSUM_UDPv6_Tx
|
1544 IFCAP_CSUM_UDPv4_Rx
| IFCAP_CSUM_UDPv6_Rx
|
1545 IFCAP_CSUM_TCPv4_Tx
| IFCAP_CSUM_TCPv6_Tx
|
1546 IFCAP_CSUM_TCPv4_Rx
| IFCAP_CSUM_TCPv6_Rx
))
1550 * Some IPv4/IPv6 flags need to be set together in order to be picked
1551 * up. Unfortunately, that is all we can do given that lwIP does not
1552 * distinguish IPv4/IPv6 when it comes to TCP/UDP checksum flags.
1555 if (ifcap
& IFCAP_CSUM_IPv4_Tx
)
1556 caps
|= NDEV_CAP_CS_IP4_TX
;
1557 if (ifcap
& IFCAP_CSUM_IPv4_Rx
)
1558 caps
|= NDEV_CAP_CS_IP4_RX
;
1559 if ((ifcap
& (IFCAP_CSUM_UDPv4_Tx
| IFCAP_CSUM_UDPv6_Tx
)) ==
1560 (IFCAP_CSUM_UDPv4_Tx
| IFCAP_CSUM_UDPv6_Tx
))
1561 caps
|= NDEV_CAP_CS_UDP_TX
;
1562 if ((ifcap
& (IFCAP_CSUM_UDPv4_Rx
| IFCAP_CSUM_UDPv6_Rx
)) ==
1563 (IFCAP_CSUM_UDPv4_Rx
| IFCAP_CSUM_UDPv6_Rx
))
1564 caps
|= NDEV_CAP_CS_UDP_RX
;
1565 if ((ifcap
& (IFCAP_CSUM_TCPv4_Tx
| IFCAP_CSUM_TCPv6_Tx
)) ==
1566 (IFCAP_CSUM_TCPv4_Tx
| IFCAP_CSUM_TCPv6_Tx
))
1567 caps
|= NDEV_CAP_CS_TCP_TX
;
1568 if ((ifcap
& (IFCAP_CSUM_TCPv4_Rx
| IFCAP_CSUM_TCPv6_Rx
)) ==
1569 (IFCAP_CSUM_TCPv4_Rx
| IFCAP_CSUM_TCPv6_Rx
))
1570 caps
|= NDEV_CAP_CS_TCP_RX
;
1573 * When changing checksumming capabilities, we have to make sure that
1574 * we only ever checksum too much and never too little. This means
1575 * that we enable any checksum options in netif here, and disable any
1576 * checksum options in netif only after driver configuration.
1578 * Note that we have to draw the line somewhere with this kind of
1579 * self-protection, and that line is short of TCP retransmission: we
1580 * see it as lwIP's job to compute checksums for retransmitted TCP
1581 * packets if they were saved across checksum changes. Even though
1582 * lwIP may not care, there is little we can do about that anyway.
1584 if (ethif
->ethif_wanted
.nconf_caps
!= caps
) {
1585 flags
= ethif_get_netif(ethif
)->chksum_flags
;
1587 if (!(caps
& NDEV_CAP_CS_IP4_TX
))
1588 flags
|= NETIF_CHECKSUM_GEN_IP
;
1589 if (!(caps
& NDEV_CAP_CS_IP4_RX
))
1590 flags
|= NETIF_CHECKSUM_CHECK_IP
;
1591 if (!(caps
& NDEV_CAP_CS_UDP_TX
))
1592 flags
|= NETIF_CHECKSUM_GEN_UDP
;
1593 if (!(caps
& NDEV_CAP_CS_UDP_RX
))
1594 flags
|= NETIF_CHECKSUM_CHECK_UDP
;
1595 if (!(caps
& NDEV_CAP_CS_TCP_TX
))
1596 flags
|= NETIF_CHECKSUM_GEN_TCP
;
1597 if (!(caps
& NDEV_CAP_CS_TCP_RX
))
1598 flags
|= NETIF_CHECKSUM_CHECK_TCP
;
1600 NETIF_SET_CHECKSUM_CTRL(ethif_get_netif(ethif
), flags
);
1602 ethif
->ethif_wanted
.nconf_caps
= caps
;
1603 ethif
->ethif_wanted
.nconf_set
|= NDEV_SET_CAPS
;
1606 /* The changes will be picked up from the polling function. */
1611 * Retrieve NetBSD-style interface media type (IFM_). Return both the current
1612 * media type selection and the driver-reported active media type.
1615 ethif_get_ifmedia(struct ifdev
* ifdev
, int * ifcurrent
, int * ifactive
)
1617 struct ethif
*ethif
= (struct ethif
*)ifdev
;
1620 * For the current select, report back whatever the user gave us, even
1621 * if it has not reached the driver at all yet.
1623 *ifcurrent
= (int)ethif
->ethif_wanted
.nconf_media
;
1624 *ifactive
= (int)ethif
->ethif_media
;
1628 * Set current NetBSD-style interface media type (IFM_).
1631 ethif_set_ifmedia(struct ifdev
* ifdev
, int ifmedia
)
1633 struct ethif
*ethif
= (struct ethif
*)ifdev
;
1636 * We currently completely lack the infrastructure to suspend the
1637 * current IOCTL call until the driver replies (or disappears).
1638 * Therefore we have no choice but to return success here, even if the
1639 * driver cannot accept the change. The driver does notify us of media
1640 * changes, so the user may observe the new active media type later.
1641 * Also note that the new media type may not be the requested type,
1642 * which is why we do not perform any checks against the wanted or
1643 * active media types.
1645 ethif
->ethif_wanted
.nconf_media
= (uint32_t)ifmedia
;
1646 ethif
->ethif_wanted
.nconf_set
|= NDEV_SET_MEDIA
;
1648 /* The change will be picked up from the polling function. */
1653 * Enable or disable promiscuous mode on the interface.
1656 ethif_set_promisc(struct ifdev
* ifdev
, int promisc
)
1658 struct ethif
*ethif
= (struct ethif
*)ifdev
;
1660 if (ethif
->ethif_wanted
.nconf_mode
!= NDEV_MODE_DOWN
) {
1662 ethif
->ethif_wanted
.nconf_mode
|= NDEV_MODE_PROMISC
;
1664 ethif
->ethif_wanted
.nconf_mode
&= ~NDEV_MODE_PROMISC
;
1665 ethif
->ethif_wanted
.nconf_set
|= NDEV_SET_MODE
;
1668 /* The change will be picked up from the polling function. */
1672 * Set the hardware address on the interface.
1675 ethif_set_hwaddr(struct ifdev
* ifdev
, const uint8_t * hwaddr
)
1677 struct ethif
*ethif
= (struct ethif
*)ifdev
;
1679 if (!(ethif
->ethif_caps
& NDEV_CAP_HWADDR
))
1682 memcpy(ðif
->ethif_wanted
.nconf_hwaddr
.nhwa_addr
, hwaddr
,
1684 ethif
->ethif_wanted
.nconf_set
|= NDEV_SET_HWADDR
;
1686 /* The change will be picked up from the polling function. */
1691 * Set the Maximum Transmission Unit for this interface. Return TRUE if the
1692 * new value is acceptable, in which case the caller will do the rest. Return
1696 ethif_set_mtu(struct ifdev
* ifdev __unused
, unsigned int mtu
)
1699 return (mtu
<= ETHIF_MAX_MTU
);
1702 static const struct ifdev_ops ethif_ops
= {
1703 .iop_init
= ethif_init_netif
,
1704 .iop_input
= netif_input
,
1705 .iop_output
= ethif_output
,
1706 .iop_output_v4
= etharp_output
,
1707 .iop_output_v6
= ethip6_output
,
1708 .iop_hdrcmplt
= ethif_hdrcmplt
,
1709 .iop_poll
= ethif_poll
,
1710 .iop_set_ifflags
= ethif_set_ifflags
,
1711 .iop_get_ifcap
= ethif_get_ifcap
,
1712 .iop_set_ifcap
= ethif_set_ifcap
,
1713 .iop_get_ifmedia
= ethif_get_ifmedia
,
1714 .iop_set_ifmedia
= ethif_set_ifmedia
,
1715 .iop_set_promisc
= ethif_set_promisc
,
1716 .iop_set_hwaddr
= ethif_set_hwaddr
,
1717 .iop_set_mtu
= ethif_set_mtu
,