tcp/tso: Add per-device TSO aggregation size limit
[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 static u_long ether_input_wronghwhash;
155 static int ether_input_ckhash;
156 #endif
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 SYSCTL_ULONG(_net_link_ether, OID_AUTO, input_wronghwhash, CTLFLAG_RW,
193     &ether_input_wronghwhash, 0, "# of input packets with wrong hw hash");
194 SYSCTL_INT(_net_link_ether, OID_AUTO, always_ckhash, CTLFLAG_RW,
195     &ether_input_ckhash, 0, "always check hash");
196 #endif
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                                 ifp->if_iqdrops++;
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                         m->m_pkthdr.rcvif->if_noproto++;
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 == netisr_portfn(m->m_pkthdr.hash)) {
1187                         netisr_handle(isr, m);
1188                         return;
1189                 } else {
1190                         /*
1191                          * XXX Something is wrong,
1192                          * we probably should panic here!
1193                          */
1194                         m->m_flags &= ~M_HASH;
1195                         atomic_add_long(&ether_input_wronghash, 1);
1196                 }
1197         }
1198 #ifdef RSS_DEBUG
1199         atomic_add_long(&ether_input_requeue, 1);
1200 #endif
1201         netisr_queue(isr, m);
1202 }
1203
1204 /*
1205  * First we perform any link layer operations, then continue to the
1206  * upper layers with ether_demux_oncpu().
1207  */
1208 static void
1209 ether_input_oncpu(struct ifnet *ifp, struct mbuf *m)
1210 {
1211 #ifdef CARP
1212         void *carp;
1213 #endif
1214
1215         if ((ifp->if_flags & (IFF_UP | IFF_MONITOR)) != IFF_UP) {
1216                 /*
1217                  * Receiving interface's flags are changed, when this
1218                  * packet is waiting for processing; discard it.
1219                  */
1220                 m_freem(m);
1221                 return;
1222         }
1223
1224         /*
1225          * Tap the packet off here for a bridge.  bridge_input()
1226          * will return NULL if it has consumed the packet, otherwise
1227          * it gets processed as normal.  Note that bridge_input()
1228          * will always return the original packet if we need to
1229          * process it locally.
1230          */
1231         if (ifp->if_bridge) {
1232                 KASSERT(bridge_input_p != NULL,
1233                         ("%s: if_bridge not loaded!", __func__));
1234
1235                 if(m->m_flags & M_ETHER_BRIDGED) {
1236                         m->m_flags &= ~M_ETHER_BRIDGED;
1237                 } else {
1238                         m = bridge_input_p(ifp, m);
1239                         if (m == NULL)
1240                                 return;
1241
1242                         KASSERT(ifp == m->m_pkthdr.rcvif,
1243                                 ("bridge_input_p changed rcvif"));
1244                 }
1245         }
1246
1247 #ifdef CARP
1248         carp = ifp->if_carp;
1249         if (carp) {
1250                 m = carp_input(carp, m);
1251                 if (m == NULL)
1252                         return;
1253                 KASSERT(ifp == m->m_pkthdr.rcvif,
1254                     ("carp_input changed rcvif"));
1255         }
1256 #endif
1257
1258         /* Handle ng_ether(4) processing, if any */
1259         if (ng_ether_input_p != NULL) {
1260                 /*
1261                  * Hold BGL and recheck ng_ether_input_p
1262                  */
1263                 get_mplock();
1264                 if (ng_ether_input_p != NULL)
1265                         ng_ether_input_p(ifp, &m);
1266                 rel_mplock();
1267
1268                 if (m == NULL)
1269                         return;
1270         }
1271
1272         /* Continue with upper layer processing */
1273         ether_demux_oncpu(ifp, m);
1274 }
1275
1276 /*
1277  * Perform certain functions of ether_input_pkt():
1278  * - Test IFF_UP
1279  * - Update statistics
1280  * - Run bpf(4) tap if requested
1281  * Then pass the packet to ether_input_oncpu().
1282  *
1283  * This function should be used by pseudo interface (e.g. vlan(4)),
1284  * when it tries to claim that the packet is received by it.
1285  *
1286  * REINPUT_KEEPRCVIF
1287  * REINPUT_RUNBPF
1288  */
1289 void
1290 ether_reinput_oncpu(struct ifnet *ifp, struct mbuf *m, int reinput_flags)
1291 {
1292         /* Discard packet if interface is not up */
1293         if (!(ifp->if_flags & IFF_UP)) {
1294                 m_freem(m);
1295                 return;
1296         }
1297
1298         /*
1299          * Change receiving interface.  The bridge will often pass a flag to
1300          * ask that this not be done so ARPs get applied to the correct
1301          * side.
1302          */
1303         if ((reinput_flags & REINPUT_KEEPRCVIF) == 0 ||
1304             m->m_pkthdr.rcvif == NULL) {
1305                 m->m_pkthdr.rcvif = ifp;
1306         }
1307
1308         /* Update statistics */
1309         ifp->if_ipackets++;
1310         ifp->if_ibytes += m->m_pkthdr.len;
1311         if (m->m_flags & (M_MCAST | M_BCAST))
1312                 ifp->if_imcasts++;
1313
1314         if (reinput_flags & REINPUT_RUNBPF)
1315                 BPF_MTAP(ifp, m);
1316
1317         ether_input_oncpu(ifp, m);
1318 }
1319
1320 static __inline boolean_t
1321 ether_vlancheck(struct mbuf **m0)
1322 {
1323         struct mbuf *m = *m0;
1324         struct ether_header *eh;
1325         uint16_t ether_type;
1326
1327         eh = mtod(m, struct ether_header *);
1328         ether_type = ntohs(eh->ether_type);
1329
1330         if (ether_type == ETHERTYPE_VLAN && (m->m_flags & M_VLANTAG) == 0) {
1331                 /*
1332                  * Extract vlan tag if hardware does not do it for us
1333                  */
1334                 vlan_ether_decap(&m);
1335                 if (m == NULL)
1336                         goto failed;
1337
1338                 eh = mtod(m, struct ether_header *);
1339                 ether_type = ntohs(eh->ether_type);
1340         }
1341
1342         if (ether_type == ETHERTYPE_VLAN && (m->m_flags & M_VLANTAG)) {
1343                 /*
1344                  * To prevent possible dangerous recursion,
1345                  * we don't do vlan-in-vlan
1346                  */
1347                 m->m_pkthdr.rcvif->if_noproto++;
1348                 goto failed;
1349         }
1350         KKASSERT(ether_type != ETHERTYPE_VLAN);
1351
1352         m->m_flags |= M_ETHER_VLANCHECKED;
1353         *m0 = m;
1354         return TRUE;
1355 failed:
1356         if (m != NULL)
1357                 m_freem(m);
1358         *m0 = NULL;
1359         return FALSE;
1360 }
1361
1362 static void
1363 ether_input_handler(netmsg_t nmsg)
1364 {
1365         struct netmsg_packet *nmp = &nmsg->packet;      /* actual size */
1366         struct ether_header *eh;
1367         struct ifnet *ifp;
1368         struct mbuf *m;
1369
1370         m = nmp->nm_packet;
1371         M_ASSERTPKTHDR(m);
1372
1373         if ((m->m_flags & M_ETHER_VLANCHECKED) == 0) {
1374                 if (!ether_vlancheck(&m)) {
1375                         KKASSERT(m == NULL);
1376                         return;
1377                 }
1378         }
1379         if ((m->m_flags & (M_HASH | M_CKHASH)) == (M_HASH | M_CKHASH)
1380 #ifdef RSS_DEBUG
1381             || ether_input_ckhash
1382 #endif
1383             ) {
1384                 int isr;
1385
1386                 /*
1387                  * Need to verify the hash supplied by the hardware
1388                  * which could be wrong.
1389                  */
1390                 m->m_flags &= ~(M_HASH | M_CKHASH);
1391                 isr = ether_characterize(&m);
1392                 if (m == NULL)
1393                         return;
1394                 KKASSERT(m->m_flags & M_HASH);
1395
1396                 if (m->m_pkthdr.hash != mycpuid) {
1397                         /*
1398                          * Wrong hardware supplied hash; redispatch
1399                          */
1400                         ether_dispatch(isr, m);
1401 #ifdef RSS_DEBUG
1402                         atomic_add_long(&ether_input_wronghwhash, 1);
1403 #endif
1404                         return;
1405                 }
1406         }
1407         ifp = m->m_pkthdr.rcvif;
1408
1409         eh = mtod(m, struct ether_header *);
1410         if (ETHER_IS_MULTICAST(eh->ether_dhost)) {
1411                 if (bcmp(ifp->if_broadcastaddr, eh->ether_dhost,
1412                          ifp->if_addrlen) == 0)
1413                         m->m_flags |= M_BCAST;
1414                 else
1415                         m->m_flags |= M_MCAST;
1416                 ifp->if_imcasts++;
1417         }
1418
1419         ether_input_oncpu(ifp, m);
1420 }
1421
1422 /*
1423  * Send the packet to the target msgport
1424  *
1425  * At this point the packet had better be characterized (M_HASH set),
1426  * so we know which cpu to send it to.
1427  */
1428 static void
1429 ether_dispatch(int isr, struct mbuf *m)
1430 {
1431         struct netmsg_packet *pmsg;
1432
1433         KKASSERT(m->m_flags & M_HASH);
1434         pmsg = &m->m_hdr.mh_netmsg;
1435         netmsg_init(&pmsg->base, NULL, &netisr_apanic_rport,
1436                     0, ether_input_handler);
1437         pmsg->nm_packet = m;
1438         pmsg->base.lmsg.u.ms_result = isr;
1439
1440         logether(disp_beg, NULL);
1441         lwkt_sendmsg(netisr_portfn(m->m_pkthdr.hash), &pmsg->base.lmsg);
1442         logether(disp_end, NULL);
1443 }
1444
1445 /*
1446  * Process a received Ethernet packet.
1447  *
1448  * The ethernet header is assumed to be in the mbuf so the caller
1449  * MUST MAKE SURE that there are at least sizeof(struct ether_header)
1450  * bytes in the first mbuf.
1451  */
1452 void
1453 ether_input_pkt(struct ifnet *ifp, struct mbuf *m, const struct pktinfo *pi)
1454 {
1455         int isr;
1456
1457         M_ASSERTPKTHDR(m);
1458
1459         /* Discard packet if interface is not up */
1460         if (!(ifp->if_flags & IFF_UP)) {
1461                 m_freem(m);
1462                 return;
1463         }
1464
1465         if (m->m_len < sizeof(struct ether_header)) {
1466                 /* XXX error in the caller. */
1467                 m_freem(m);
1468                 return;
1469         }
1470
1471         m->m_pkthdr.rcvif = ifp;
1472
1473         logether(pkt_beg, ifp);
1474
1475         ETHER_BPF_MTAP(ifp, m);
1476
1477         ifp->if_ibytes += m->m_pkthdr.len;
1478
1479         if (ifp->if_flags & IFF_MONITOR) {
1480                 struct ether_header *eh;
1481
1482                 eh = mtod(m, struct ether_header *);
1483                 if (ETHER_IS_MULTICAST(eh->ether_dhost))
1484                         ifp->if_imcasts++;
1485
1486                 /*
1487                  * Interface marked for monitoring; discard packet.
1488                  */
1489                 m_freem(m);
1490
1491                 logether(pkt_end, ifp);
1492                 return;
1493         }
1494
1495         /*
1496          * If the packet has been characterized (pi->pi_netisr / M_HASH)
1497          * we can dispatch it immediately without further inspection.
1498          */
1499         if (pi != NULL && (m->m_flags & M_HASH)) {
1500 #ifdef RSS_DEBUG
1501                 atomic_add_long(&ether_pktinfo_try, 1);
1502 #endif
1503                 netisr_hashcheck(pi->pi_netisr, m, pi);
1504                 if (m->m_flags & M_HASH) {
1505                         ether_dispatch(pi->pi_netisr, m);
1506 #ifdef RSS_DEBUG
1507                         atomic_add_long(&ether_pktinfo_hit, 1);
1508 #endif
1509                         logether(pkt_end, ifp);
1510                         return;
1511                 }
1512         }
1513 #ifdef RSS_DEBUG
1514         else if (ifp->if_capenable & IFCAP_RSS) {
1515                 if (pi == NULL)
1516                         atomic_add_long(&ether_rss_nopi, 1);
1517                 else
1518                         atomic_add_long(&ether_rss_nohash, 1);
1519         }
1520 #endif
1521
1522         /*
1523          * Packet hash will be recalculated by software, so clear
1524          * the M_HASH and M_CKHASH flag set by the driver; the hash
1525          * value calculated by the hardware may not be exactly what
1526          * we want.
1527          */
1528         m->m_flags &= ~(M_HASH | M_CKHASH);
1529
1530         if (!ether_vlancheck(&m)) {
1531                 KKASSERT(m == NULL);
1532                 logether(pkt_end, ifp);
1533                 return;
1534         }
1535
1536         isr = ether_characterize(&m);
1537         if (m == NULL) {
1538                 logether(pkt_end, ifp);
1539                 return;
1540         }
1541
1542         /*
1543          * Finally dispatch it
1544          */
1545         ether_dispatch(isr, m);
1546
1547         logether(pkt_end, ifp);
1548 }
1549
1550 static int
1551 ether_characterize(struct mbuf **m0)
1552 {
1553         struct mbuf *m = *m0;
1554         struct ether_header *eh;
1555         uint16_t ether_type;
1556         int isr;
1557
1558         eh = mtod(m, struct ether_header *);
1559         ether_type = ntohs(eh->ether_type);
1560
1561         /*
1562          * Map ether type to netisr id.
1563          */
1564         switch (ether_type) {
1565 #ifdef INET
1566         case ETHERTYPE_IP:
1567                 isr = NETISR_IP;
1568                 break;
1569
1570         case ETHERTYPE_ARP:
1571                 isr = NETISR_ARP;
1572                 break;
1573 #endif
1574
1575 #ifdef INET6
1576         case ETHERTYPE_IPV6:
1577                 isr = NETISR_IPV6;
1578                 break;
1579 #endif
1580
1581 #ifdef IPX
1582         case ETHERTYPE_IPX:
1583                 isr = NETISR_IPX;
1584                 break;
1585 #endif
1586
1587 #ifdef MPLS
1588         case ETHERTYPE_MPLS:
1589         case ETHERTYPE_MPLS_MCAST:
1590                 m->m_flags |= M_MPLSLABELED;
1591                 isr = NETISR_MPLS;
1592                 break;
1593 #endif
1594
1595         default:
1596                 /*
1597                  * NETISR_MAX is an invalid value; it is chosen to let
1598                  * netisr_characterize() know that we have no clear
1599                  * idea where this packet should go.
1600                  */
1601                 isr = NETISR_MAX;
1602                 break;
1603         }
1604
1605         /*
1606          * Ask the isr to characterize the packet since we couldn't.
1607          * This is an attempt to optimally get us onto the correct protocol
1608          * thread.
1609          */
1610         netisr_characterize(isr, &m, sizeof(struct ether_header));
1611
1612         *m0 = m;
1613         return isr;
1614 }
1615
1616 static void
1617 ether_demux_handler(netmsg_t nmsg)
1618 {
1619         struct netmsg_packet *nmp = &nmsg->packet;      /* actual size */
1620         struct ifnet *ifp;
1621         struct mbuf *m;
1622
1623         m = nmp->nm_packet;
1624         M_ASSERTPKTHDR(m);
1625         ifp = m->m_pkthdr.rcvif;
1626
1627         ether_demux_oncpu(ifp, m);
1628 }
1629
1630 void
1631 ether_demux(struct mbuf *m)
1632 {
1633         struct netmsg_packet *pmsg;
1634         int isr;
1635
1636         isr = ether_characterize(&m);
1637         if (m == NULL)
1638                 return;
1639
1640         KKASSERT(m->m_flags & M_HASH);
1641         pmsg = &m->m_hdr.mh_netmsg;
1642         netmsg_init(&pmsg->base, NULL, &netisr_apanic_rport,
1643             0, ether_demux_handler);
1644         pmsg->nm_packet = m;
1645         pmsg->base.lmsg.u.ms_result = isr;
1646
1647         lwkt_sendmsg(netisr_portfn(m->m_pkthdr.hash), &pmsg->base.lmsg);
1648 }
1649
1650 boolean_t
1651 ether_tso_pullup(struct mbuf **mp, int *hoff0, struct ip **ip, int *iphlen,
1652     struct tcphdr **th, int *thoff)
1653 {
1654         struct mbuf *m = *mp;
1655         struct ether_header *eh;
1656         uint16_t type;
1657         int hoff;
1658
1659         KASSERT(M_WRITABLE(m), ("not writable"));
1660
1661         hoff = ETHER_HDR_LEN;
1662         if (m->m_len < hoff) {
1663                 m = m_pullup(m, hoff);
1664                 if (m == NULL)
1665                         goto failed;
1666         }
1667         eh = mtod(m, struct ether_header *);
1668         type = eh->ether_type;
1669
1670         if (type == htons(ETHERTYPE_VLAN)) {
1671                 struct ether_vlan_header *evh;
1672
1673                 hoff += EVL_ENCAPLEN;
1674                 if (m->m_len < hoff) {
1675                         m = m_pullup(m, hoff);
1676                         if (m == NULL)
1677                                 goto failed;
1678                 }
1679                 evh = mtod(m, struct ether_vlan_header *);
1680                 type = evh->evl_proto;
1681         }
1682         KASSERT(type == htons(ETHERTYPE_IP), ("not IP %d", ntohs(type)));
1683
1684         *mp = m;
1685         *hoff0 = hoff;
1686         return tcp_tso_pullup(mp, hoff, ip, iphlen, th, thoff);
1687
1688 failed:
1689         if (m != NULL)
1690                 m_freem(m);
1691         *mp = NULL;
1692         return FALSE;
1693 }
1694
1695 u_char *
1696 kether_aton(const char *macstr, u_char *addr)
1697 {
1698         unsigned int o0, o1, o2, o3, o4, o5;
1699         int n;
1700
1701         if (macstr == NULL || addr == NULL)
1702                 return NULL;
1703
1704         n = ksscanf(macstr, "%x:%x:%x:%x:%x:%x", &o0, &o1, &o2,
1705             &o3, &o4, &o5);
1706         if (n != 6)
1707                 return NULL;
1708
1709         addr[0] = o0;
1710         addr[1] = o1;
1711         addr[2] = o2;
1712         addr[3] = o3;
1713         addr[4] = o4;
1714         addr[5] = o5;
1715
1716         return addr;
1717 }
1718
1719 char *
1720 kether_ntoa(const u_char *addr, char *buf)
1721 {
1722         int len = ETHER_ADDRSTRLEN + 1;
1723         int n;
1724
1725         n = ksnprintf(buf, len, "%02x:%02x:%02x:%02x:%02x:%02x", addr[0],
1726             addr[1], addr[2], addr[3], addr[4], addr[5]);
1727
1728         if (n < 17)
1729                 return NULL;
1730
1731         return buf;
1732 }
1733
1734 MODULE_VERSION(ether, 1);