072a395149b486d03e206ebc34401ff58fd971c3
[dragonfly.git] / sys / net / if_ethersubr.c
1 /*
2  * Copyright (c) 1982, 1989, 1993
3  *      The Regents of the University of California.  All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 3. All advertising materials mentioning features or use of this software
14  *    must display the following acknowledgement:
15  *      This product includes software developed by the University of
16  *      California, Berkeley and its contributors.
17  * 4. Neither the name of the University nor the names of its contributors
18  *    may be used to endorse or promote products derived from this software
19  *    without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31  * SUCH DAMAGE.
32  *
33  *      @(#)if_ethersubr.c      8.1 (Berkeley) 6/10/93
34  * $FreeBSD: src/sys/net/if_ethersubr.c,v 1.70.2.33 2003/04/28 15:45:53 archie Exp $
35  */
36
37 #include "opt_inet.h"
38 #include "opt_inet6.h"
39 #include "opt_ipx.h"
40 #include "opt_mpls.h"
41 #include "opt_netgraph.h"
42 #include "opt_carp.h"
43 #include "opt_rss.h"
44
45 #include <sys/param.h>
46 #include <sys/systm.h>
47 #include <sys/globaldata.h>
48 #include <sys/kernel.h>
49 #include <sys/ktr.h>
50 #include <sys/lock.h>
51 #include <sys/malloc.h>
52 #include <sys/mbuf.h>
53 #include <sys/msgport.h>
54 #include <sys/socket.h>
55 #include <sys/sockio.h>
56 #include <sys/sysctl.h>
57 #include <sys/thread.h>
58
59 #include <sys/thread2.h>
60 #include <sys/mplock2.h>
61
62 #include <net/if.h>
63 #include <net/netisr.h>
64 #include <net/route.h>
65 #include <net/if_llc.h>
66 #include <net/if_dl.h>
67 #include <net/if_types.h>
68 #include <net/ifq_var.h>
69 #include <net/bpf.h>
70 #include <net/ethernet.h>
71 #include <net/vlan/if_vlan_ether.h>
72 #include <net/vlan/if_vlan_var.h>
73 #include <net/netmsg2.h>
74
75 #if defined(INET) || defined(INET6)
76 #include <netinet/in.h>
77 #include <netinet/ip_var.h>
78 #include <netinet/tcp_var.h>
79 #include <netinet/if_ether.h>
80 #include <netinet/ip_flow.h>
81 #include <net/ipfw/ip_fw.h>
82 #include <net/dummynet/ip_dummynet.h>
83 #endif
84 #ifdef INET6
85 #include <netinet6/nd6.h>
86 #endif
87
88 #ifdef CARP
89 #include <netinet/ip_carp.h>
90 #endif
91
92 #ifdef IPX
93 #include <netproto/ipx/ipx.h>
94 #include <netproto/ipx/ipx_if.h>
95 int (*ef_inputp)(struct ifnet*, const struct ether_header *eh, struct mbuf *m);
96 int (*ef_outputp)(struct ifnet *ifp, struct mbuf **mp, struct sockaddr *dst,
97                   short *tp, int *hlen);
98 #endif
99
100 #ifdef MPLS
101 #include <netproto/mpls/mpls.h>
102 #endif
103
104 /* netgraph node hooks for ng_ether(4) */
105 void    (*ng_ether_input_p)(struct ifnet *ifp, struct mbuf **mp);
106 void    (*ng_ether_input_orphan_p)(struct ifnet *ifp, struct mbuf *m);
107 int     (*ng_ether_output_p)(struct ifnet *ifp, struct mbuf **mp);
108 void    (*ng_ether_attach_p)(struct ifnet *ifp);
109 void    (*ng_ether_detach_p)(struct ifnet *ifp);
110
111 void    (*vlan_input_p)(struct mbuf *);
112
113 static int ether_output(struct ifnet *, struct mbuf *, struct sockaddr *,
114                         struct rtentry *);
115 static void ether_restore_header(struct mbuf **, const struct ether_header *,
116                                  const struct ether_header *);
117 static int ether_characterize(struct mbuf **);
118 static void ether_dispatch(int, struct mbuf *);
119
120 /*
121  * if_bridge support
122  */
123 struct mbuf *(*bridge_input_p)(struct ifnet *, struct mbuf *);
124 int (*bridge_output_p)(struct ifnet *, struct mbuf *);
125 void (*bridge_dn_p)(struct mbuf *, struct ifnet *);
126 struct ifnet *(*bridge_interface_p)(void *if_bridge);
127
128 static int ether_resolvemulti(struct ifnet *, struct sockaddr **,
129                               struct sockaddr *);
130
131 const uint8_t etherbroadcastaddr[ETHER_ADDR_LEN] = {
132         0xff, 0xff, 0xff, 0xff, 0xff, 0xff
133 };
134
135 #define gotoerr(e) do { error = (e); goto bad; } while (0)
136 #define IFP2AC(ifp) ((struct arpcom *)(ifp))
137
138 static boolean_t ether_ipfw_chk(struct mbuf **m0, struct ifnet *dst,
139                                 struct ip_fw **rule,
140                                 const struct ether_header *eh);
141
142 static int ether_ipfw;
143 static u_long ether_restore_hdr;
144 static u_long ether_prepend_hdr;
145 static u_long ether_input_wronghash;
146 static int ether_debug;
147
148 #ifdef RSS_DEBUG
149 static u_long ether_pktinfo_try;
150 static u_long ether_pktinfo_hit;
151 static u_long ether_rss_nopi;
152 static u_long ether_rss_nohash;
153 static u_long ether_input_requeue;
154 #endif
155 static u_long ether_input_wronghwhash;
156 static int ether_input_ckhash;
157
158 #define ETHER_TSOLEN_DEFAULT    (4 * ETHERMTU)
159
160 static int ether_tsolen_default = ETHER_TSOLEN_DEFAULT;
161 TUNABLE_INT("net.link.ether.tsolen", &ether_tsolen_default);
162
163 SYSCTL_DECL(_net_link);
164 SYSCTL_NODE(_net_link, IFT_ETHER, ether, CTLFLAG_RW, 0, "Ethernet");
165 SYSCTL_INT(_net_link_ether, OID_AUTO, debug, CTLFLAG_RW,
166     &ether_debug, 0, "Ether debug");
167 SYSCTL_INT(_net_link_ether, OID_AUTO, ipfw, CTLFLAG_RW,
168     &ether_ipfw, 0, "Pass ether pkts through firewall");
169 SYSCTL_ULONG(_net_link_ether, OID_AUTO, restore_hdr, CTLFLAG_RW,
170     &ether_restore_hdr, 0, "# of ether header restoration");
171 SYSCTL_ULONG(_net_link_ether, OID_AUTO, prepend_hdr, CTLFLAG_RW,
172     &ether_prepend_hdr, 0,
173     "# of ether header restoration which prepends mbuf");
174 SYSCTL_ULONG(_net_link_ether, OID_AUTO, input_wronghash, CTLFLAG_RW,
175     &ether_input_wronghash, 0, "# of input packets with wrong hash");
176 SYSCTL_INT(_net_link_ether, OID_AUTO, tsolen, CTLFLAG_RW,
177     &ether_tsolen_default, 0, "Default max TSO length");
178
179 #ifdef RSS_DEBUG
180 SYSCTL_ULONG(_net_link_ether, OID_AUTO, rss_nopi, CTLFLAG_RW,
181     &ether_rss_nopi, 0, "# of packets do not have pktinfo");
182 SYSCTL_ULONG(_net_link_ether, OID_AUTO, rss_nohash, CTLFLAG_RW,
183     &ether_rss_nohash, 0, "# of packets do not have hash");
184 SYSCTL_ULONG(_net_link_ether, OID_AUTO, pktinfo_try, CTLFLAG_RW,
185     &ether_pktinfo_try, 0,
186     "# of tries to find packets' msgport using pktinfo");
187 SYSCTL_ULONG(_net_link_ether, OID_AUTO, pktinfo_hit, CTLFLAG_RW,
188     &ether_pktinfo_hit, 0,
189     "# of packets whose msgport are found using pktinfo");
190 SYSCTL_ULONG(_net_link_ether, OID_AUTO, input_requeue, CTLFLAG_RW,
191     &ether_input_requeue, 0, "# of input packets gets requeued");
192 #endif
193 SYSCTL_ULONG(_net_link_ether, OID_AUTO, input_wronghwhash, CTLFLAG_RW,
194     &ether_input_wronghwhash, 0, "# of input packets with wrong hw hash");
195 SYSCTL_INT(_net_link_ether, OID_AUTO, always_ckhash, CTLFLAG_RW,
196     &ether_input_ckhash, 0, "always check hash");
197
198 #define ETHER_KTR_STR           "ifp=%p"
199 #define ETHER_KTR_ARGS  struct ifnet *ifp
200 #ifndef KTR_ETHERNET
201 #define KTR_ETHERNET            KTR_ALL
202 #endif
203 KTR_INFO_MASTER(ether);
204 KTR_INFO(KTR_ETHERNET, ether, pkt_beg, 0, ETHER_KTR_STR, ETHER_KTR_ARGS);
205 KTR_INFO(KTR_ETHERNET, ether, pkt_end, 1, ETHER_KTR_STR, ETHER_KTR_ARGS);
206 KTR_INFO(KTR_ETHERNET, ether, disp_beg, 2, ETHER_KTR_STR, ETHER_KTR_ARGS);
207 KTR_INFO(KTR_ETHERNET, ether, disp_end, 3, ETHER_KTR_STR, ETHER_KTR_ARGS);
208 #define logether(name, arg)     KTR_LOG(ether_ ## name, arg)
209
210 /*
211  * Ethernet output routine.
212  * Encapsulate a packet of type family for the local net.
213  * Use trailer local net encapsulation if enough data in first
214  * packet leaves a multiple of 512 bytes of data in remainder.
215  * Assumes that ifp is actually pointer to arpcom structure.
216  */
217 static int
218 ether_output(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst,
219              struct rtentry *rt)
220 {
221         struct ether_header *eh, *deh;
222         u_char *edst;
223         int loop_copy = 0;
224         int hlen = ETHER_HDR_LEN;       /* link layer header length */
225         struct arpcom *ac = IFP2AC(ifp);
226         int error;
227
228         ASSERT_IFNET_NOT_SERIALIZED_ALL(ifp);
229
230         if (ifp->if_flags & IFF_MONITOR)
231                 gotoerr(ENETDOWN);
232         if ((ifp->if_flags & (IFF_UP | IFF_RUNNING)) != (IFF_UP | IFF_RUNNING))
233                 gotoerr(ENETDOWN);
234
235         M_PREPEND(m, sizeof(struct ether_header), MB_DONTWAIT);
236         if (m == NULL)
237                 return (ENOBUFS);
238         m->m_pkthdr.csum_lhlen = sizeof(struct ether_header);
239         eh = mtod(m, struct ether_header *);
240         edst = eh->ether_dhost;
241
242         /*
243          * Fill in the destination ethernet address and frame type.
244          */
245         switch (dst->sa_family) {
246 #ifdef INET
247         case AF_INET:
248                 if (!arpresolve(ifp, rt, m, dst, edst))
249                         return (0);     /* if not yet resolved */
250 #ifdef MPLS
251                 if (m->m_flags & M_MPLSLABELED)
252                         eh->ether_type = htons(ETHERTYPE_MPLS);
253                 else
254 #endif
255                         eh->ether_type = htons(ETHERTYPE_IP);
256                 break;
257 #endif
258 #ifdef INET6
259         case AF_INET6:
260                 if (!nd6_storelladdr(&ac->ac_if, rt, m, dst, edst))
261                         return (0);             /* Something bad happenned. */
262                 eh->ether_type = htons(ETHERTYPE_IPV6);
263                 break;
264 #endif
265 #ifdef IPX
266         case AF_IPX:
267                 if (ef_outputp != NULL) {
268                         /*
269                          * Hold BGL and recheck ef_outputp
270                          */
271                         get_mplock();
272                         if (ef_outputp != NULL) {
273                                 error = ef_outputp(ifp, &m, dst,
274                                                    &eh->ether_type, &hlen);
275                                 rel_mplock();
276                                 if (error)
277                                         goto bad;
278                                 else
279                                         break;
280                         }
281                         rel_mplock();
282                 }
283                 eh->ether_type = htons(ETHERTYPE_IPX);
284                 bcopy(&(((struct sockaddr_ipx *)dst)->sipx_addr.x_host),
285                       edst, ETHER_ADDR_LEN);
286                 break;
287 #endif
288         case pseudo_AF_HDRCMPLT:
289         case AF_UNSPEC:
290                 loop_copy = -1; /* if this is for us, don't do it */
291                 deh = (struct ether_header *)dst->sa_data;
292                 memcpy(edst, deh->ether_dhost, ETHER_ADDR_LEN);
293                 eh->ether_type = deh->ether_type;
294                 break;
295
296         default:
297                 if_printf(ifp, "can't handle af%d\n", dst->sa_family);
298                 gotoerr(EAFNOSUPPORT);
299         }
300
301         if (dst->sa_family == pseudo_AF_HDRCMPLT)       /* unlikely */
302                 memcpy(eh->ether_shost,
303                        ((struct ether_header *)dst->sa_data)->ether_shost,
304                        ETHER_ADDR_LEN);
305         else
306                 memcpy(eh->ether_shost, ac->ac_enaddr, ETHER_ADDR_LEN);
307
308         /*
309          * Bridges require special output handling.
310          */
311         if (ifp->if_bridge) {
312                 KASSERT(bridge_output_p != NULL,
313                         ("%s: if_bridge not loaded!", __func__));
314                 return bridge_output_p(ifp, m);
315         }
316
317         /*
318          * If a simplex interface, and the packet is being sent to our
319          * Ethernet address or a broadcast address, loopback a copy.
320          * XXX To make a simplex device behave exactly like a duplex
321          * device, we should copy in the case of sending to our own
322          * ethernet address (thus letting the original actually appear
323          * on the wire). However, we don't do that here for security
324          * reasons and compatibility with the original behavior.
325          */
326         if ((ifp->if_flags & IFF_SIMPLEX) && (loop_copy != -1)) {
327                 int csum_flags = 0;
328
329                 if (m->m_pkthdr.csum_flags & CSUM_IP)
330                         csum_flags |= (CSUM_IP_CHECKED | CSUM_IP_VALID);
331                 if (m->m_pkthdr.csum_flags & CSUM_DELAY_DATA)
332                         csum_flags |= (CSUM_DATA_VALID | CSUM_PSEUDO_HDR);
333                 if ((m->m_flags & M_BCAST) || (loop_copy > 0)) {
334                         struct mbuf *n;
335
336                         if ((n = m_copypacket(m, MB_DONTWAIT)) != NULL) {
337                                 n->m_pkthdr.csum_flags |= csum_flags;
338                                 if (csum_flags & CSUM_DATA_VALID)
339                                         n->m_pkthdr.csum_data = 0xffff;
340                                 if_simloop(ifp, n, dst->sa_family, hlen);
341                         } else
342                                 IFNET_STAT_INC(ifp, iqdrops, 1);
343                 } else if (bcmp(eh->ether_dhost, eh->ether_shost,
344                                 ETHER_ADDR_LEN) == 0) {
345                         m->m_pkthdr.csum_flags |= csum_flags;
346                         if (csum_flags & CSUM_DATA_VALID)
347                                 m->m_pkthdr.csum_data = 0xffff;
348                         if_simloop(ifp, m, dst->sa_family, hlen);
349                         return (0);     /* XXX */
350                 }
351         }
352
353 #ifdef CARP
354         if (ifp->if_type == IFT_CARP) {
355                 ifp = carp_parent(ifp);
356                 if (ifp == NULL)
357                         gotoerr(ENETUNREACH);
358
359                 ac = IFP2AC(ifp);
360
361                 /*
362                  * Check precondition again
363                  */
364                 ASSERT_IFNET_NOT_SERIALIZED_ALL(ifp);
365
366                 if (ifp->if_flags & IFF_MONITOR)
367                         gotoerr(ENETDOWN);
368                 if ((ifp->if_flags & (IFF_UP | IFF_RUNNING)) !=
369                     (IFF_UP | IFF_RUNNING))
370                         gotoerr(ENETDOWN);
371         }
372 #endif
373
374         /* Handle ng_ether(4) processing, if any */
375         if (ng_ether_output_p != NULL) {
376                 /*
377                  * Hold BGL and recheck ng_ether_output_p
378                  */
379                 get_mplock();
380                 if (ng_ether_output_p != NULL) {
381                         if ((error = ng_ether_output_p(ifp, &m)) != 0) {
382                                 rel_mplock();
383                                 goto bad;
384                         }
385                         if (m == NULL) {
386                                 rel_mplock();
387                                 return (0);
388                         }
389                 }
390                 rel_mplock();
391         }
392
393         /* Continue with link-layer output */
394         return ether_output_frame(ifp, m);
395
396 bad:
397         m_freem(m);
398         return (error);
399 }
400
401 /*
402  * Returns the bridge interface an ifp is associated
403  * with.
404  *
405  * Only call if ifp->if_bridge != NULL.
406  */
407 struct ifnet *
408 ether_bridge_interface(struct ifnet *ifp)
409 {
410         if (bridge_interface_p)
411                 return(bridge_interface_p(ifp->if_bridge));
412         return (ifp);
413 }
414
415 /*
416  * Ethernet link layer output routine to send a raw frame to the device.
417  *
418  * This assumes that the 14 byte Ethernet header is present and contiguous
419  * in the first mbuf.
420  */
421 int
422 ether_output_frame(struct ifnet *ifp, struct mbuf *m)
423 {
424         struct ip_fw *rule = NULL;
425         int error = 0;
426         struct altq_pktattr pktattr;
427
428         ASSERT_IFNET_NOT_SERIALIZED_ALL(ifp);
429
430         if (m->m_pkthdr.fw_flags & DUMMYNET_MBUF_TAGGED) {
431                 struct m_tag *mtag;
432
433                 /* Extract info from dummynet tag */
434                 mtag = m_tag_find(m, PACKET_TAG_DUMMYNET, NULL);
435                 KKASSERT(mtag != NULL);
436                 rule = ((struct dn_pkt *)m_tag_data(mtag))->dn_priv;
437                 KKASSERT(rule != NULL);
438
439                 m_tag_delete(m, mtag);
440                 m->m_pkthdr.fw_flags &= ~DUMMYNET_MBUF_TAGGED;
441         }
442
443         if (ifq_is_enabled(&ifp->if_snd))
444                 altq_etherclassify(&ifp->if_snd, m, &pktattr);
445         crit_enter();
446         if (IPFW_LOADED && ether_ipfw != 0) {
447                 struct ether_header save_eh, *eh;
448
449                 eh = mtod(m, struct ether_header *);
450                 save_eh = *eh;
451                 m_adj(m, ETHER_HDR_LEN);
452                 if (!ether_ipfw_chk(&m, ifp, &rule, eh)) {
453                         crit_exit();
454                         if (m != NULL) {
455                                 m_freem(m);
456                                 return ENOBUFS; /* pkt dropped */
457                         } else
458                                 return 0;       /* consumed e.g. in a pipe */
459                 }
460
461                 /* packet was ok, restore the ethernet header */
462                 ether_restore_header(&m, eh, &save_eh);
463                 if (m == NULL) {
464                         crit_exit();
465                         return ENOBUFS;
466                 }
467         }
468         crit_exit();
469
470         /*
471          * Queue message on interface, update output statistics if
472          * successful, and start output if interface not yet active.
473          */
474         error = ifq_dispatch(ifp, m, &pktattr);
475         return (error);
476 }
477
478 /*
479  * ipfw processing for ethernet packets (in and out).
480  * The second parameter is NULL from ether_demux(), and ifp from
481  * ether_output_frame().
482  */
483 static boolean_t
484 ether_ipfw_chk(struct mbuf **m0, struct ifnet *dst, struct ip_fw **rule,
485                const struct ether_header *eh)
486 {
487         struct ether_header save_eh = *eh;      /* might be a ptr in *m0 */
488         struct ip_fw_args args;
489         struct m_tag *mtag;
490         struct mbuf *m;
491         int i;
492
493         if (*rule != NULL && fw_one_pass)
494                 return TRUE; /* dummynet packet, already partially processed */
495
496         /*
497          * I need some amount of data to be contiguous.
498          */
499         i = min((*m0)->m_pkthdr.len, max_protohdr);
500         if ((*m0)->m_len < i) {
501                 *m0 = m_pullup(*m0, i);
502                 if (*m0 == NULL)
503                         return FALSE;
504         }
505
506         /*
507          * Clean up tags
508          */
509         if ((mtag = m_tag_find(*m0, PACKET_TAG_IPFW_DIVERT, NULL)) != NULL)
510                 m_tag_delete(*m0, mtag);
511         if ((*m0)->m_pkthdr.fw_flags & IPFORWARD_MBUF_TAGGED) {
512                 mtag = m_tag_find(*m0, PACKET_TAG_IPFORWARD, NULL);
513                 KKASSERT(mtag != NULL);
514                 m_tag_delete(*m0, mtag);
515                 (*m0)->m_pkthdr.fw_flags &= ~IPFORWARD_MBUF_TAGGED;
516         }
517
518         args.m = *m0;           /* the packet we are looking at         */
519         args.oif = dst;         /* destination, if any                  */
520         args.rule = *rule;      /* matching rule to restart             */
521         args.eh = &save_eh;     /* MAC header for bridged/MAC packets   */
522         i = ip_fw_chk_ptr(&args);
523         *m0 = args.m;
524         *rule = args.rule;
525
526         if (*m0 == NULL)
527                 return FALSE;
528
529         switch (i) {
530         case IP_FW_PASS:
531                 return TRUE;
532
533         case IP_FW_DIVERT:
534         case IP_FW_TEE:
535         case IP_FW_DENY:
536                 /*
537                  * XXX at some point add support for divert/forward actions.
538                  * If none of the above matches, we have to drop the pkt.
539                  */
540                 return FALSE;
541
542         case IP_FW_DUMMYNET:
543                 /*
544                  * Pass the pkt to dummynet, which consumes it.
545                  */
546                 m = *m0;        /* pass the original to dummynet */
547                 *m0 = NULL;     /* and nothing back to the caller */
548
549                 ether_restore_header(&m, eh, &save_eh);
550                 if (m == NULL)
551                         return FALSE;
552
553                 ip_fw_dn_io_ptr(m, args.cookie,
554                                 dst ? DN_TO_ETH_OUT: DN_TO_ETH_DEMUX, &args);
555                 ip_dn_queue(m);
556                 return FALSE;
557
558         default:
559                 panic("unknown ipfw return value: %d", i);
560         }
561 }
562
563 static void
564 ether_input(struct ifnet *ifp, struct mbuf *m)
565 {
566         ether_input_pkt(ifp, m, NULL);
567 }
568
569 /*
570  * Perform common duties while attaching to interface list
571  */
572 void
573 ether_ifattach(struct ifnet *ifp, uint8_t *lla, lwkt_serialize_t serializer)
574 {
575         ether_ifattach_bpf(ifp, lla, DLT_EN10MB, sizeof(struct ether_header),
576                            serializer);
577 }
578
579 void
580 ether_ifattach_bpf(struct ifnet *ifp, uint8_t *lla, u_int dlt, u_int hdrlen,
581                    lwkt_serialize_t serializer)
582 {
583         struct sockaddr_dl *sdl;
584         char ethstr[ETHER_ADDRSTRLEN + 1];
585
586         ifp->if_type = IFT_ETHER;
587         ifp->if_addrlen = ETHER_ADDR_LEN;
588         ifp->if_hdrlen = ETHER_HDR_LEN;
589         if_attach(ifp, serializer);
590         ifp->if_mtu = ETHERMTU;
591         if (ifp->if_tsolen <= 0) {
592                 if ((ether_tsolen_default / ETHERMTU) < 2) {
593                         kprintf("ether TSO maxlen %d -> %d\n",
594                             ether_tsolen_default, ETHER_TSOLEN_DEFAULT);
595                         ether_tsolen_default = ETHER_TSOLEN_DEFAULT;
596                 }
597                 ifp->if_tsolen = ether_tsolen_default;
598         }
599         if (ifp->if_baudrate == 0)
600                 ifp->if_baudrate = 10000000;
601         ifp->if_output = ether_output;
602         ifp->if_input = ether_input;
603         ifp->if_resolvemulti = ether_resolvemulti;
604         ifp->if_broadcastaddr = etherbroadcastaddr;
605         sdl = IF_LLSOCKADDR(ifp);
606         sdl->sdl_type = IFT_ETHER;
607         sdl->sdl_alen = ifp->if_addrlen;
608         bcopy(lla, LLADDR(sdl), ifp->if_addrlen);
609         /*
610          * XXX Keep the current drivers happy.
611          * XXX Remove once all drivers have been cleaned up
612          */
613         if (lla != IFP2AC(ifp)->ac_enaddr)
614                 bcopy(lla, IFP2AC(ifp)->ac_enaddr, ifp->if_addrlen);
615         bpfattach(ifp, dlt, hdrlen);
616         if (ng_ether_attach_p != NULL)
617                 (*ng_ether_attach_p)(ifp);
618
619         if_printf(ifp, "MAC address: %s\n", kether_ntoa(lla, ethstr));
620 }
621
622 /*
623  * Perform common duties while detaching an Ethernet interface
624  */
625 void
626 ether_ifdetach(struct ifnet *ifp)
627 {
628         if_down(ifp);
629
630         if (ng_ether_detach_p != NULL)
631                 (*ng_ether_detach_p)(ifp);
632         bpfdetach(ifp);
633         if_detach(ifp);
634 }
635
636 int
637 ether_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
638 {
639         struct ifaddr *ifa = (struct ifaddr *) data;
640         struct ifreq *ifr = (struct ifreq *) data;
641         int error = 0;
642
643 #define IF_INIT(ifp) \
644 do { \
645         if (((ifp)->if_flags & IFF_UP) == 0) { \
646                 (ifp)->if_flags |= IFF_UP; \
647                 (ifp)->if_init((ifp)->if_softc); \
648         } \
649 } while (0)
650
651         ASSERT_IFNET_SERIALIZED_ALL(ifp);
652
653         switch (command) {
654         case SIOCSIFADDR:
655                 switch (ifa->ifa_addr->sa_family) {
656 #ifdef INET
657                 case AF_INET:
658                         IF_INIT(ifp);   /* before arpwhohas */
659                         arp_ifinit(ifp, ifa);
660                         break;
661 #endif
662 #ifdef IPX
663                 /*
664                  * XXX - This code is probably wrong
665                  */
666                 case AF_IPX:
667                         {
668                         struct ipx_addr *ina = &IA_SIPX(ifa)->sipx_addr;
669                         struct arpcom *ac = IFP2AC(ifp);
670
671                         if (ipx_nullhost(*ina))
672                                 ina->x_host = *(union ipx_host *) ac->ac_enaddr;
673                         else
674                                 bcopy(ina->x_host.c_host, ac->ac_enaddr,
675                                       sizeof ac->ac_enaddr);
676
677                         IF_INIT(ifp);   /* Set new address. */
678                         break;
679                         }
680 #endif
681                 default:
682                         IF_INIT(ifp);
683                         break;
684                 }
685                 break;
686
687         case SIOCGIFADDR:
688                 bcopy(IFP2AC(ifp)->ac_enaddr,
689                       ((struct sockaddr *)ifr->ifr_data)->sa_data,
690                       ETHER_ADDR_LEN);
691                 break;
692
693         case SIOCSIFMTU:
694                 /*
695                  * Set the interface MTU.
696                  */
697                 if (ifr->ifr_mtu > ETHERMTU) {
698                         error = EINVAL;
699                 } else {
700                         ifp->if_mtu = ifr->ifr_mtu;
701                 }
702                 break;
703         default:
704                 error = EINVAL;
705                 break;
706         }
707         return (error);
708
709 #undef IF_INIT
710 }
711
712 int
713 ether_resolvemulti(
714         struct ifnet *ifp,
715         struct sockaddr **llsa,
716         struct sockaddr *sa)
717 {
718         struct sockaddr_dl *sdl;
719 #ifdef INET
720         struct sockaddr_in *sin;
721 #endif
722 #ifdef INET6
723         struct sockaddr_in6 *sin6;
724 #endif
725         u_char *e_addr;
726
727         switch(sa->sa_family) {
728         case AF_LINK:
729                 /*
730                  * No mapping needed. Just check that it's a valid MC address.
731                  */
732                 sdl = (struct sockaddr_dl *)sa;
733                 e_addr = LLADDR(sdl);
734                 if ((e_addr[0] & 1) != 1)
735                         return EADDRNOTAVAIL;
736                 *llsa = NULL;
737                 return 0;
738
739 #ifdef INET
740         case AF_INET:
741                 sin = (struct sockaddr_in *)sa;
742                 if (!IN_MULTICAST(ntohl(sin->sin_addr.s_addr)))
743                         return EADDRNOTAVAIL;
744                 sdl = kmalloc(sizeof *sdl, M_IFMADDR, M_WAITOK | M_ZERO);
745                 sdl->sdl_len = sizeof *sdl;
746                 sdl->sdl_family = AF_LINK;
747                 sdl->sdl_index = ifp->if_index;
748                 sdl->sdl_type = IFT_ETHER;
749                 sdl->sdl_alen = ETHER_ADDR_LEN;
750                 e_addr = LLADDR(sdl);
751                 ETHER_MAP_IP_MULTICAST(&sin->sin_addr, e_addr);
752                 *llsa = (struct sockaddr *)sdl;
753                 return 0;
754 #endif
755 #ifdef INET6
756         case AF_INET6:
757                 sin6 = (struct sockaddr_in6 *)sa;
758                 if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) {
759                         /*
760                          * An IP6 address of 0 means listen to all
761                          * of the Ethernet multicast address used for IP6.
762                          * (This is used for multicast routers.)
763                          */
764                         ifp->if_flags |= IFF_ALLMULTI;
765                         *llsa = NULL;
766                         return 0;
767                 }
768                 if (!IN6_IS_ADDR_MULTICAST(&sin6->sin6_addr))
769                         return EADDRNOTAVAIL;
770                 sdl = kmalloc(sizeof *sdl, M_IFMADDR, M_WAITOK | M_ZERO);
771                 sdl->sdl_len = sizeof *sdl;
772                 sdl->sdl_family = AF_LINK;
773                 sdl->sdl_index = ifp->if_index;
774                 sdl->sdl_type = IFT_ETHER;
775                 sdl->sdl_alen = ETHER_ADDR_LEN;
776                 e_addr = LLADDR(sdl);
777                 ETHER_MAP_IPV6_MULTICAST(&sin6->sin6_addr, e_addr);
778                 *llsa = (struct sockaddr *)sdl;
779                 return 0;
780 #endif
781
782         default:
783                 /*
784                  * Well, the text isn't quite right, but it's the name
785                  * that counts...
786                  */
787                 return EAFNOSUPPORT;
788         }
789 }
790
791 #if 0
792 /*
793  * This is for reference.  We have a table-driven version
794  * of the little-endian crc32 generator, which is faster
795  * than the double-loop.
796  */
797 uint32_t
798 ether_crc32_le(const uint8_t *buf, size_t len)
799 {
800         uint32_t c, crc, carry;
801         size_t i, j;
802
803         crc = 0xffffffffU;      /* initial value */
804
805         for (i = 0; i < len; i++) {
806                 c = buf[i];
807                 for (j = 0; j < 8; j++) {
808                         carry = ((crc & 0x01) ? 1 : 0) ^ (c & 0x01);
809                         crc >>= 1;
810                         c >>= 1;
811                         if (carry)
812                                 crc = (crc ^ ETHER_CRC_POLY_LE);
813                 }
814         }
815
816         return (crc);
817 }
818 #else
819 uint32_t
820 ether_crc32_le(const uint8_t *buf, size_t len)
821 {
822         static const uint32_t crctab[] = {
823                 0x00000000, 0x1db71064, 0x3b6e20c8, 0x26d930ac,
824                 0x76dc4190, 0x6b6b51f4, 0x4db26158, 0x5005713c,
825                 0xedb88320, 0xf00f9344, 0xd6d6a3e8, 0xcb61b38c,
826                 0x9b64c2b0, 0x86d3d2d4, 0xa00ae278, 0xbdbdf21c
827         };
828         uint32_t crc;
829         size_t i;
830
831         crc = 0xffffffffU;      /* initial value */
832
833         for (i = 0; i < len; i++) {
834                 crc ^= buf[i];
835                 crc = (crc >> 4) ^ crctab[crc & 0xf];
836                 crc = (crc >> 4) ^ crctab[crc & 0xf];
837         }
838
839         return (crc);
840 }
841 #endif
842
843 uint32_t
844 ether_crc32_be(const uint8_t *buf, size_t len)
845 {
846         uint32_t c, crc, carry;
847         size_t i, j;
848
849         crc = 0xffffffffU;      /* initial value */
850
851         for (i = 0; i < len; i++) {
852                 c = buf[i];
853                 for (j = 0; j < 8; j++) {
854                         carry = ((crc & 0x80000000U) ? 1 : 0) ^ (c & 0x01);
855                         crc <<= 1;
856                         c >>= 1;
857                         if (carry)
858                                 crc = (crc ^ ETHER_CRC_POLY_BE) | carry;
859                 }
860         }
861
862         return (crc);
863 }
864
865 /*
866  * find the size of ethernet header, and call classifier
867  */
868 void
869 altq_etherclassify(struct ifaltq *ifq, struct mbuf *m,
870                    struct altq_pktattr *pktattr)
871 {
872         struct ether_header *eh;
873         uint16_t ether_type;
874         int hlen, af, hdrsize;
875
876         hlen = sizeof(struct ether_header);
877         eh = mtod(m, struct ether_header *);
878
879         ether_type = ntohs(eh->ether_type);
880         if (ether_type < ETHERMTU) {
881                 /* ick! LLC/SNAP */
882                 struct llc *llc = (struct llc *)(eh + 1);
883                 hlen += 8;
884
885                 if (m->m_len < hlen ||
886                     llc->llc_dsap != LLC_SNAP_LSAP ||
887                     llc->llc_ssap != LLC_SNAP_LSAP ||
888                     llc->llc_control != LLC_UI)
889                         goto bad;  /* not snap! */
890
891                 ether_type = ntohs(llc->llc_un.type_snap.ether_type);
892         }
893
894         if (ether_type == ETHERTYPE_IP) {
895                 af = AF_INET;
896                 hdrsize = 20;  /* sizeof(struct ip) */
897 #ifdef INET6
898         } else if (ether_type == ETHERTYPE_IPV6) {
899                 af = AF_INET6;
900                 hdrsize = 40;  /* sizeof(struct ip6_hdr) */
901 #endif
902         } else
903                 goto bad;
904
905         while (m->m_len <= hlen) {
906                 hlen -= m->m_len;
907                 m = m->m_next;
908         }
909         if (m->m_len < hlen + hdrsize) {
910                 /*
911                  * ip header is not in a single mbuf.  this should not
912                  * happen in the current code.
913                  * (todo: use m_pulldown in the future)
914                  */
915                 goto bad;
916         }
917         m->m_data += hlen;
918         m->m_len -= hlen;
919         ifq_classify(ifq, m, af, pktattr);
920         m->m_data -= hlen;
921         m->m_len += hlen;
922
923         return;
924
925 bad:
926         pktattr->pattr_class = NULL;
927         pktattr->pattr_hdr = NULL;
928         pktattr->pattr_af = AF_UNSPEC;
929 }
930
931 static void
932 ether_restore_header(struct mbuf **m0, const struct ether_header *eh,
933                      const struct ether_header *save_eh)
934 {
935         struct mbuf *m = *m0;
936
937         ether_restore_hdr++;
938
939         /*
940          * Prepend the header, optimize for the common case of
941          * eh pointing into the mbuf.
942          */
943         if ((const void *)(eh + 1) == (void *)m->m_data) {
944                 m->m_data -= ETHER_HDR_LEN;
945                 m->m_len += ETHER_HDR_LEN;
946                 m->m_pkthdr.len += ETHER_HDR_LEN;
947         } else {
948                 ether_prepend_hdr++;
949
950                 M_PREPEND(m, ETHER_HDR_LEN, MB_DONTWAIT);
951                 if (m != NULL) {
952                         bcopy(save_eh, mtod(m, struct ether_header *),
953                               ETHER_HDR_LEN);
954                 }
955         }
956         *m0 = m;
957 }
958
959 /*
960  * Upper layer processing for a received Ethernet packet.
961  */
962 void
963 ether_demux_oncpu(struct ifnet *ifp, struct mbuf *m)
964 {
965         struct ether_header *eh;
966         int isr, discard = 0;
967         u_short ether_type;
968         struct ip_fw *rule = NULL;
969
970         M_ASSERTPKTHDR(m);
971         KASSERT(m->m_len >= ETHER_HDR_LEN,
972                 ("ether header is not contiguous!"));
973
974         eh = mtod(m, struct ether_header *);
975
976         if (m->m_pkthdr.fw_flags & DUMMYNET_MBUF_TAGGED) {
977                 struct m_tag *mtag;
978
979                 /* Extract info from dummynet tag */
980                 mtag = m_tag_find(m, PACKET_TAG_DUMMYNET, NULL);
981                 KKASSERT(mtag != NULL);
982                 rule = ((struct dn_pkt *)m_tag_data(mtag))->dn_priv;
983                 KKASSERT(rule != NULL);
984
985                 m_tag_delete(m, mtag);
986                 m->m_pkthdr.fw_flags &= ~DUMMYNET_MBUF_TAGGED;
987
988                 /* packet is passing the second time */
989                 goto post_stats;
990         }
991
992         /*
993          * We got a packet which was unicast to a different Ethernet
994          * address.  If the driver is working properly, then this
995          * situation can only happen when the interface is in
996          * promiscuous mode.  We defer the packet discarding until the
997          * vlan processing is done, so that vlan/bridge or vlan/netgraph
998          * could work.
999          */
1000         if (((ifp->if_flags & (IFF_PROMISC | IFF_PPROMISC)) == IFF_PROMISC) &&
1001             !ETHER_IS_MULTICAST(eh->ether_dhost) &&
1002             bcmp(eh->ether_dhost, IFP2AC(ifp)->ac_enaddr, ETHER_ADDR_LEN)) {
1003                 if (ether_debug & 1) {
1004                         kprintf("%02x:%02x:%02x:%02x:%02x:%02x "
1005                                 "%02x:%02x:%02x:%02x:%02x:%02x "
1006                                 "%04x vs %02x:%02x:%02x:%02x:%02x:%02x\n",
1007                                 eh->ether_dhost[0],
1008                                 eh->ether_dhost[1],
1009                                 eh->ether_dhost[2],
1010                                 eh->ether_dhost[3],
1011                                 eh->ether_dhost[4],
1012                                 eh->ether_dhost[5],
1013                                 eh->ether_shost[0],
1014                                 eh->ether_shost[1],
1015                                 eh->ether_shost[2],
1016                                 eh->ether_shost[3],
1017                                 eh->ether_shost[4],
1018                                 eh->ether_shost[5],
1019                                 eh->ether_type,
1020                                 ((u_char *)IFP2AC(ifp)->ac_enaddr)[0],
1021                                 ((u_char *)IFP2AC(ifp)->ac_enaddr)[1],
1022                                 ((u_char *)IFP2AC(ifp)->ac_enaddr)[2],
1023                                 ((u_char *)IFP2AC(ifp)->ac_enaddr)[3],
1024                                 ((u_char *)IFP2AC(ifp)->ac_enaddr)[4],
1025                                 ((u_char *)IFP2AC(ifp)->ac_enaddr)[5]
1026                         );
1027                 }
1028                 if ((ether_debug & 2) == 0)
1029                         discard = 1;
1030         }
1031
1032 post_stats:
1033         if (IPFW_LOADED && ether_ipfw != 0 && !discard) {
1034                 struct ether_header save_eh = *eh;
1035
1036                 /* XXX old crufty stuff, needs to be removed */
1037                 m_adj(m, sizeof(struct ether_header));
1038
1039                 if (!ether_ipfw_chk(&m, NULL, &rule, eh)) {
1040                         m_freem(m);
1041                         return;
1042                 }
1043
1044                 ether_restore_header(&m, eh, &save_eh);
1045                 if (m == NULL)
1046                         return;
1047                 eh = mtod(m, struct ether_header *);
1048         }
1049
1050         ether_type = ntohs(eh->ether_type);
1051         KKASSERT(ether_type != ETHERTYPE_VLAN);
1052
1053         if (m->m_flags & M_VLANTAG) {
1054                 void (*vlan_input_func)(struct mbuf *);
1055
1056                 vlan_input_func = vlan_input_p;
1057                 if (vlan_input_func != NULL) {
1058                         vlan_input_func(m);
1059                 } else {
1060                         IFNET_STAT_INC(m->m_pkthdr.rcvif, noproto, 1);
1061                         m_freem(m);
1062                 }
1063                 return;
1064         }
1065
1066         /*
1067          * If we have been asked to discard this packet
1068          * (e.g. not for us), drop it before entering
1069          * the upper layer.
1070          */
1071         if (discard) {
1072                 m_freem(m);
1073                 return;
1074         }
1075
1076         /*
1077          * Clear protocol specific flags,
1078          * before entering the upper layer.
1079          */
1080         m->m_flags &= ~M_ETHER_FLAGS;
1081
1082         /* Strip ethernet header. */
1083         m_adj(m, sizeof(struct ether_header));
1084
1085         switch (ether_type) {
1086 #ifdef INET
1087         case ETHERTYPE_IP:
1088                 if ((m->m_flags & M_LENCHECKED) == 0) {
1089                         if (!ip_lengthcheck(&m, 0))
1090                                 return;
1091                 }
1092                 if (ipflow_fastforward(m))
1093                         return;
1094                 isr = NETISR_IP;
1095                 break;
1096
1097         case ETHERTYPE_ARP:
1098                 if (ifp->if_flags & IFF_NOARP) {
1099                         /* Discard packet if ARP is disabled on interface */
1100                         m_freem(m);
1101                         return;
1102                 }
1103                 isr = NETISR_ARP;
1104                 break;
1105 #endif
1106
1107 #ifdef INET6
1108         case ETHERTYPE_IPV6:
1109                 isr = NETISR_IPV6;
1110                 break;
1111 #endif
1112
1113 #ifdef IPX
1114         case ETHERTYPE_IPX:
1115                 if (ef_inputp) {
1116                         /*
1117                          * Hold BGL and recheck ef_inputp
1118                          */
1119                         get_mplock();
1120                         if (ef_inputp && ef_inputp(ifp, eh, m) == 0) {
1121                                 rel_mplock();
1122                                 return;
1123                         }
1124                         rel_mplock();
1125                 }
1126                 isr = NETISR_IPX;
1127                 break;
1128 #endif
1129
1130 #ifdef MPLS
1131         case ETHERTYPE_MPLS:
1132         case ETHERTYPE_MPLS_MCAST:
1133                 /* Should have been set by ether_input_pkt(). */
1134                 KKASSERT(m->m_flags & M_MPLSLABELED);
1135                 isr = NETISR_MPLS;
1136                 break;
1137 #endif
1138
1139         default:
1140                 /*
1141                  * The accurate msgport is not determined before
1142                  * we reach here, so recharacterize packet.
1143                  */
1144                 m->m_flags &= ~M_HASH;
1145 #ifdef IPX
1146                 if (ef_inputp) {
1147                         /*
1148                          * Hold BGL and recheck ef_inputp
1149                          */
1150                         get_mplock();
1151                         if (ef_inputp && ef_inputp(ifp, eh, m) == 0) {
1152                                 rel_mplock();
1153                                 return;
1154                         }
1155                         rel_mplock();
1156                 }
1157 #endif
1158                 if (ng_ether_input_orphan_p != NULL) {
1159                         /*
1160                          * Put back the ethernet header so netgraph has a
1161                          * consistent view of inbound packets.
1162                          */
1163                         M_PREPEND(m, ETHER_HDR_LEN, MB_DONTWAIT);
1164                         if (m == NULL) {
1165                                 /*
1166                                  * M_PREPEND frees the mbuf in case of failure.
1167                                  */
1168                                 return;
1169                         }
1170                         /*
1171                          * Hold BGL and recheck ng_ether_input_orphan_p
1172                          */
1173                         get_mplock();
1174                         if (ng_ether_input_orphan_p != NULL) {
1175                                 ng_ether_input_orphan_p(ifp, m);
1176                                 rel_mplock();
1177                                 return;
1178                         }
1179                         rel_mplock();
1180                 }
1181                 m_freem(m);
1182                 return;
1183         }
1184
1185         if (m->m_flags & M_HASH) {
1186                 if (&curthread->td_msgport ==
1187                     netisr_cpuport(m->m_pkthdr.hash)) {
1188                         netisr_handle(isr, m);
1189                         return;
1190                 } else {
1191                         /*
1192                          * XXX Something is wrong,
1193                          * we probably should panic here!
1194                          */
1195                         m->m_flags &= ~M_HASH;
1196                         atomic_add_long(&ether_input_wronghash, 1);
1197                 }
1198         }
1199 #ifdef RSS_DEBUG
1200         atomic_add_long(&ether_input_requeue, 1);
1201 #endif
1202         netisr_queue(isr, m);
1203 }
1204
1205 /*
1206  * First we perform any link layer operations, then continue to the
1207  * upper layers with ether_demux_oncpu().
1208  */
1209 static void
1210 ether_input_oncpu(struct ifnet *ifp, struct mbuf *m)
1211 {
1212 #ifdef CARP
1213         void *carp;
1214 #endif
1215
1216         if ((ifp->if_flags & (IFF_UP | IFF_MONITOR)) != IFF_UP) {
1217                 /*
1218                  * Receiving interface's flags are changed, when this
1219                  * packet is waiting for processing; discard it.
1220                  */
1221                 m_freem(m);
1222                 return;
1223         }
1224
1225         /*
1226          * Tap the packet off here for a bridge.  bridge_input()
1227          * will return NULL if it has consumed the packet, otherwise
1228          * it gets processed as normal.  Note that bridge_input()
1229          * will always return the original packet if we need to
1230          * process it locally.
1231          */
1232         if (ifp->if_bridge) {
1233                 KASSERT(bridge_input_p != NULL,
1234                         ("%s: if_bridge not loaded!", __func__));
1235
1236                 if(m->m_flags & M_ETHER_BRIDGED) {
1237                         m->m_flags &= ~M_ETHER_BRIDGED;
1238                 } else {
1239                         m = bridge_input_p(ifp, m);
1240                         if (m == NULL)
1241                                 return;
1242
1243                         KASSERT(ifp == m->m_pkthdr.rcvif,
1244                                 ("bridge_input_p changed rcvif"));
1245                 }
1246         }
1247
1248 #ifdef CARP
1249         carp = ifp->if_carp;
1250         if (carp) {
1251                 m = carp_input(carp, m);
1252                 if (m == NULL)
1253                         return;
1254                 KASSERT(ifp == m->m_pkthdr.rcvif,
1255                     ("carp_input changed rcvif"));
1256         }
1257 #endif
1258
1259         /* Handle ng_ether(4) processing, if any */
1260         if (ng_ether_input_p != NULL) {
1261                 /*
1262                  * Hold BGL and recheck ng_ether_input_p
1263                  */
1264                 get_mplock();
1265                 if (ng_ether_input_p != NULL)
1266                         ng_ether_input_p(ifp, &m);
1267                 rel_mplock();
1268
1269                 if (m == NULL)
1270                         return;
1271         }
1272
1273         /* Continue with upper layer processing */
1274         ether_demux_oncpu(ifp, m);
1275 }
1276
1277 /*
1278  * Perform certain functions of ether_input_pkt():
1279  * - Test IFF_UP
1280  * - Update statistics
1281  * - Run bpf(4) tap if requested
1282  * Then pass the packet to ether_input_oncpu().
1283  *
1284  * This function should be used by pseudo interface (e.g. vlan(4)),
1285  * when it tries to claim that the packet is received by it.
1286  *
1287  * REINPUT_KEEPRCVIF
1288  * REINPUT_RUNBPF
1289  */
1290 void
1291 ether_reinput_oncpu(struct ifnet *ifp, struct mbuf *m, int reinput_flags)
1292 {
1293         /* Discard packet if interface is not up */
1294         if (!(ifp->if_flags & IFF_UP)) {
1295                 m_freem(m);
1296                 return;
1297         }
1298
1299         /*
1300          * Change receiving interface.  The bridge will often pass a flag to
1301          * ask that this not be done so ARPs get applied to the correct
1302          * side.
1303          */
1304         if ((reinput_flags & REINPUT_KEEPRCVIF) == 0 ||
1305             m->m_pkthdr.rcvif == NULL) {
1306                 m->m_pkthdr.rcvif = ifp;
1307         }
1308
1309         /* Update statistics */
1310         IFNET_STAT_INC(ifp, ipackets, 1);
1311         IFNET_STAT_INC(ifp, ibytes, m->m_pkthdr.len);
1312         if (m->m_flags & (M_MCAST | M_BCAST))
1313                 IFNET_STAT_INC(ifp, imcasts, 1);
1314
1315         if (reinput_flags & REINPUT_RUNBPF)
1316                 BPF_MTAP(ifp, m);
1317
1318         ether_input_oncpu(ifp, m);
1319 }
1320
1321 static __inline boolean_t
1322 ether_vlancheck(struct mbuf **m0)
1323 {
1324         struct mbuf *m = *m0;
1325         struct ether_header *eh;
1326         uint16_t ether_type;
1327
1328         eh = mtod(m, struct ether_header *);
1329         ether_type = ntohs(eh->ether_type);
1330
1331         if (ether_type == ETHERTYPE_VLAN && (m->m_flags & M_VLANTAG) == 0) {
1332                 /*
1333                  * Extract vlan tag if hardware does not do it for us
1334                  */
1335                 vlan_ether_decap(&m);
1336                 if (m == NULL)
1337                         goto failed;
1338
1339                 eh = mtod(m, struct ether_header *);
1340                 ether_type = ntohs(eh->ether_type);
1341         }
1342
1343         if (ether_type == ETHERTYPE_VLAN && (m->m_flags & M_VLANTAG)) {
1344                 /*
1345                  * To prevent possible dangerous recursion,
1346                  * we don't do vlan-in-vlan
1347                  */
1348                 IFNET_STAT_INC(m->m_pkthdr.rcvif, noproto, 1);
1349                 goto failed;
1350         }
1351         KKASSERT(ether_type != ETHERTYPE_VLAN);
1352
1353         m->m_flags |= M_ETHER_VLANCHECKED;
1354         *m0 = m;
1355         return TRUE;
1356 failed:
1357         if (m != NULL)
1358                 m_freem(m);
1359         *m0 = NULL;
1360         return FALSE;
1361 }
1362
1363 static void
1364 ether_input_handler(netmsg_t nmsg)
1365 {
1366         struct netmsg_packet *nmp = &nmsg->packet;      /* actual size */
1367         struct ether_header *eh;
1368         struct ifnet *ifp;
1369         struct mbuf *m;
1370
1371         m = nmp->nm_packet;
1372         M_ASSERTPKTHDR(m);
1373
1374         if ((m->m_flags & M_ETHER_VLANCHECKED) == 0) {
1375                 if (!ether_vlancheck(&m)) {
1376                         KKASSERT(m == NULL);
1377                         return;
1378                 }
1379         }
1380         if ((m->m_flags & (M_HASH | M_CKHASH)) == (M_HASH | M_CKHASH) ||
1381             __predict_false(ether_input_ckhash)) {
1382                 int isr;
1383
1384                 /*
1385                  * Need to verify the hash supplied by the hardware
1386                  * which could be wrong.
1387                  */
1388                 m->m_flags &= ~(M_HASH | M_CKHASH);
1389                 isr = ether_characterize(&m);
1390                 if (m == NULL)
1391                         return;
1392                 KKASSERT(m->m_flags & M_HASH);
1393
1394                 if (m->m_pkthdr.hash != mycpuid) {
1395                         /*
1396                          * Wrong hardware supplied hash; redispatch
1397                          */
1398                         ether_dispatch(isr, m);
1399                         if (__predict_false(ether_input_ckhash))
1400                                 atomic_add_long(&ether_input_wronghwhash, 1);
1401                         return;
1402                 }
1403         }
1404         ifp = m->m_pkthdr.rcvif;
1405
1406         eh = mtod(m, struct ether_header *);
1407         if (ETHER_IS_MULTICAST(eh->ether_dhost)) {
1408                 if (bcmp(ifp->if_broadcastaddr, eh->ether_dhost,
1409                          ifp->if_addrlen) == 0)
1410                         m->m_flags |= M_BCAST;
1411                 else
1412                         m->m_flags |= M_MCAST;
1413                 IFNET_STAT_INC(ifp, imcasts, 1);
1414         }
1415
1416         ether_input_oncpu(ifp, m);
1417 }
1418
1419 /*
1420  * Send the packet to the target msgport
1421  *
1422  * At this point the packet had better be characterized (M_HASH set),
1423  * so we know which cpu to send it to.
1424  */
1425 static void
1426 ether_dispatch(int isr, struct mbuf *m)
1427 {
1428         struct netmsg_packet *pmsg;
1429
1430         KKASSERT(m->m_flags & M_HASH);
1431         pmsg = &m->m_hdr.mh_netmsg;
1432         netmsg_init(&pmsg->base, NULL, &netisr_apanic_rport,
1433                     0, ether_input_handler);
1434         pmsg->nm_packet = m;
1435         pmsg->base.lmsg.u.ms_result = isr;
1436
1437         logether(disp_beg, NULL);
1438         lwkt_sendmsg(netisr_cpuport(m->m_pkthdr.hash), &pmsg->base.lmsg);
1439         logether(disp_end, NULL);
1440 }
1441
1442 /*
1443  * Process a received Ethernet packet.
1444  *
1445  * The ethernet header is assumed to be in the mbuf so the caller
1446  * MUST MAKE SURE that there are at least sizeof(struct ether_header)
1447  * bytes in the first mbuf.
1448  */
1449 void
1450 ether_input_pkt(struct ifnet *ifp, struct mbuf *m, const struct pktinfo *pi)
1451 {
1452         int isr;
1453
1454         M_ASSERTPKTHDR(m);
1455
1456         /* Discard packet if interface is not up */
1457         if (!(ifp->if_flags & IFF_UP)) {
1458                 m_freem(m);
1459                 return;
1460         }
1461
1462         if (m->m_len < sizeof(struct ether_header)) {
1463                 /* XXX error in the caller. */
1464                 m_freem(m);
1465                 return;
1466         }
1467
1468         m->m_pkthdr.rcvif = ifp;
1469
1470         logether(pkt_beg, ifp);
1471
1472         ETHER_BPF_MTAP(ifp, m);
1473
1474         IFNET_STAT_INC(ifp, ibytes, m->m_pkthdr.len);
1475
1476         if (ifp->if_flags & IFF_MONITOR) {
1477                 struct ether_header *eh;
1478
1479                 eh = mtod(m, struct ether_header *);
1480                 if (ETHER_IS_MULTICAST(eh->ether_dhost))
1481                         IFNET_STAT_INC(ifp, imcasts, 1);
1482
1483                 /*
1484                  * Interface marked for monitoring; discard packet.
1485                  */
1486                 m_freem(m);
1487
1488                 logether(pkt_end, ifp);
1489                 return;
1490         }
1491
1492         /*
1493          * If the packet has been characterized (pi->pi_netisr / M_HASH)
1494          * we can dispatch it immediately without further inspection.
1495          */
1496         if (pi != NULL && (m->m_flags & M_HASH)) {
1497 #ifdef RSS_DEBUG
1498                 atomic_add_long(&ether_pktinfo_try, 1);
1499 #endif
1500                 netisr_hashcheck(pi->pi_netisr, m, pi);
1501                 if (m->m_flags & M_HASH) {
1502                         ether_dispatch(pi->pi_netisr, m);
1503 #ifdef RSS_DEBUG
1504                         atomic_add_long(&ether_pktinfo_hit, 1);
1505 #endif
1506                         logether(pkt_end, ifp);
1507                         return;
1508                 }
1509         }
1510 #ifdef RSS_DEBUG
1511         else if (ifp->if_capenable & IFCAP_RSS) {
1512                 if (pi == NULL)
1513                         atomic_add_long(&ether_rss_nopi, 1);
1514                 else
1515                         atomic_add_long(&ether_rss_nohash, 1);
1516         }
1517 #endif
1518
1519         /*
1520          * Packet hash will be recalculated by software, so clear
1521          * the M_HASH and M_CKHASH flag set by the driver; the hash
1522          * value calculated by the hardware may not be exactly what
1523          * we want.
1524          */
1525         m->m_flags &= ~(M_HASH | M_CKHASH);
1526
1527         if (!ether_vlancheck(&m)) {
1528                 KKASSERT(m == NULL);
1529                 logether(pkt_end, ifp);
1530                 return;
1531         }
1532
1533         isr = ether_characterize(&m);
1534         if (m == NULL) {
1535                 logether(pkt_end, ifp);
1536                 return;
1537         }
1538
1539         /*
1540          * Finally dispatch it
1541          */
1542         ether_dispatch(isr, m);
1543
1544         logether(pkt_end, ifp);
1545 }
1546
1547 static int
1548 ether_characterize(struct mbuf **m0)
1549 {
1550         struct mbuf *m = *m0;
1551         struct ether_header *eh;
1552         uint16_t ether_type;
1553         int isr;
1554
1555         eh = mtod(m, struct ether_header *);
1556         ether_type = ntohs(eh->ether_type);
1557
1558         /*
1559          * Map ether type to netisr id.
1560          */
1561         switch (ether_type) {
1562 #ifdef INET
1563         case ETHERTYPE_IP:
1564                 isr = NETISR_IP;
1565                 break;
1566
1567         case ETHERTYPE_ARP:
1568                 isr = NETISR_ARP;
1569                 break;
1570 #endif
1571
1572 #ifdef INET6
1573         case ETHERTYPE_IPV6:
1574                 isr = NETISR_IPV6;
1575                 break;
1576 #endif
1577
1578 #ifdef IPX
1579         case ETHERTYPE_IPX:
1580                 isr = NETISR_IPX;
1581                 break;
1582 #endif
1583
1584 #ifdef MPLS
1585         case ETHERTYPE_MPLS:
1586         case ETHERTYPE_MPLS_MCAST:
1587                 m->m_flags |= M_MPLSLABELED;
1588                 isr = NETISR_MPLS;
1589                 break;
1590 #endif
1591
1592         default:
1593                 /*
1594                  * NETISR_MAX is an invalid value; it is chosen to let
1595                  * netisr_characterize() know that we have no clear
1596                  * idea where this packet should go.
1597                  */
1598                 isr = NETISR_MAX;
1599                 break;
1600         }
1601
1602         /*
1603          * Ask the isr to characterize the packet since we couldn't.
1604          * This is an attempt to optimally get us onto the correct protocol
1605          * thread.
1606          */
1607         netisr_characterize(isr, &m, sizeof(struct ether_header));
1608
1609         *m0 = m;
1610         return isr;
1611 }
1612
1613 static void
1614 ether_demux_handler(netmsg_t nmsg)
1615 {
1616         struct netmsg_packet *nmp = &nmsg->packet;      /* actual size */
1617         struct ifnet *ifp;
1618         struct mbuf *m;
1619
1620         m = nmp->nm_packet;
1621         M_ASSERTPKTHDR(m);
1622         ifp = m->m_pkthdr.rcvif;
1623
1624         ether_demux_oncpu(ifp, m);
1625 }
1626
1627 void
1628 ether_demux(struct mbuf *m)
1629 {
1630         struct netmsg_packet *pmsg;
1631         int isr;
1632
1633         isr = ether_characterize(&m);
1634         if (m == NULL)
1635                 return;
1636
1637         KKASSERT(m->m_flags & M_HASH);
1638         pmsg = &m->m_hdr.mh_netmsg;
1639         netmsg_init(&pmsg->base, NULL, &netisr_apanic_rport,
1640             0, ether_demux_handler);
1641         pmsg->nm_packet = m;
1642         pmsg->base.lmsg.u.ms_result = isr;
1643
1644         lwkt_sendmsg(netisr_cpuport(m->m_pkthdr.hash), &pmsg->base.lmsg);
1645 }
1646
1647 boolean_t
1648 ether_tso_pullup(struct mbuf **mp, int *hoff0, struct ip **ip, int *iphlen,
1649     struct tcphdr **th, int *thoff)
1650 {
1651         struct mbuf *m = *mp;
1652         struct ether_header *eh;
1653         uint16_t type;
1654         int hoff;
1655
1656         KASSERT(M_WRITABLE(m), ("not writable"));
1657
1658         hoff = ETHER_HDR_LEN;
1659         if (m->m_len < hoff) {
1660                 m = m_pullup(m, hoff);
1661                 if (m == NULL)
1662                         goto failed;
1663         }
1664         eh = mtod(m, struct ether_header *);
1665         type = eh->ether_type;
1666
1667         if (type == htons(ETHERTYPE_VLAN)) {
1668                 struct ether_vlan_header *evh;
1669
1670                 hoff += EVL_ENCAPLEN;
1671                 if (m->m_len < hoff) {
1672                         m = m_pullup(m, hoff);
1673                         if (m == NULL)
1674                                 goto failed;
1675                 }
1676                 evh = mtod(m, struct ether_vlan_header *);
1677                 type = evh->evl_proto;
1678         }
1679         KASSERT(type == htons(ETHERTYPE_IP), ("not IP %d", ntohs(type)));
1680
1681         *mp = m;
1682         *hoff0 = hoff;
1683         return tcp_tso_pullup(mp, hoff, ip, iphlen, th, thoff);
1684
1685 failed:
1686         if (m != NULL)
1687                 m_freem(m);
1688         *mp = NULL;
1689         return FALSE;
1690 }
1691
1692 u_char *
1693 kether_aton(const char *macstr, u_char *addr)
1694 {
1695         unsigned int o0, o1, o2, o3, o4, o5;
1696         int n;
1697
1698         if (macstr == NULL || addr == NULL)
1699                 return NULL;
1700
1701         n = ksscanf(macstr, "%x:%x:%x:%x:%x:%x", &o0, &o1, &o2,
1702             &o3, &o4, &o5);
1703         if (n != 6)
1704                 return NULL;
1705
1706         addr[0] = o0;
1707         addr[1] = o1;
1708         addr[2] = o2;
1709         addr[3] = o3;
1710         addr[4] = o4;
1711         addr[5] = o5;
1712
1713         return addr;
1714 }
1715
1716 char *
1717 kether_ntoa(const u_char *addr, char *buf)
1718 {
1719         int len = ETHER_ADDRSTRLEN + 1;
1720         int n;
1721
1722         n = ksnprintf(buf, len, "%02x:%02x:%02x:%02x:%02x:%02x", addr[0],
1723             addr[1], addr[2], addr[3], addr[4], addr[5]);
1724
1725         if (n < 17)
1726                 return NULL;
1727
1728         return buf;
1729 }
1730
1731 MODULE_VERSION(ether, 1);