Lines Matching +full:bt1 +full:- +full:l2 +full:- +full:ctl
1 /*-
2 * SPDX-License-Identifier: BSD-3-Clause
34 /*-
130 [0 ... IPPROTO_MAX - 1] = rip6_input };
132 [0 ... IPPROTO_MAX - 1] = rip6_ctlinput };
158 if (error || !req->newptr) in sysctl_netinet6_intr_queue_maxlen()
198 if (error || !req->newptr) in sysctl_netinet6_intr_direct_queue_maxlen()
275 /* Skip global initialization stuff for non-default instances. */ in ip6_vnet_init()
320 ip6proto_ctlinput_t ctl) in ip6proto_register() argument
327 ip6_ctlprotox[proto] = ctl; in ip6proto_register()
377 /* Cannot lock here - lock recursion. */ in ip6_destroy()
379 CK_STAILQ_FOREACH_SAFE(ifa, &ifp->if_addrhead, ifa_link, nifa) { in ip6_destroy()
380 if (ifa->ifa_addr->sa_family != AF_INET6) in ip6_destroy()
413 in6_ifstat_inc((*mp)->m_pkthdr.rcvif, ifs6_in_discard); in ip6_input_hbh()
424 * indicates Hop-by-Hop Options header, then a Jumbo Payload in ip6_input_hbh()
427 if (ip6->ip6_plen == 0 && *plen == 0) { in ip6_input_hbh()
431 * (non-zero) payload length to the variable plen. in ip6_input_hbh()
434 in6_ifstat_inc(m->m_pkthdr.rcvif, ifs6_in_discard); in ip6_input_hbh()
435 in6_ifstat_inc(m->m_pkthdr.rcvif, ifs6_in_hdrerr); in ip6_input_hbh()
438 (caddr_t)&ip6->ip6_plen - (caddr_t)ip6); in ip6_input_hbh()
443 *nxt = hbh->ip6h_nxt; in ip6_input_hbh()
478 * all of the previous checking and book-keeping has been done.
492 nxt = ip6dc->ip6dc_nxt; in ip6_direct_input()
493 off = ip6dc->ip6dc_off; in ip6_direct_input()
506 * protection against faulty packet - there should be in ip6_direct_input()
509 if (m->m_pkthdr.len < off) { in ip6_direct_input()
511 in6_ifstat_inc(m->m_pkthdr.rcvif, ifs6_in_truncated); in ip6_direct_input()
546 rcvif = m->m_pkthdr.rcvif; in ip6_input()
547 if ((ND_IFINFO(rcvif)->flags & ND6_IFF_IFDISABLED)) in ip6_input()
557 m->m_flags &= ~M_AUTHIPHDR; in ip6_input()
558 m->m_flags &= ~M_AUTHIPDGM; in ip6_input()
562 if (m->m_flags & M_FASTFWD_OURS) { in ip6_input()
573 if (m->m_flags & M_EXT) { in ip6_input()
574 if (m->m_next) in ip6_input()
579 if (m->m_next) { in ip6_input()
580 struct ifnet *ifp = (m->m_flags & M_LOOP) ? V_loif : rcvif; in ip6_input()
581 int ifindex = ifp->if_index; in ip6_input()
593 * L2 bridge code and some other code can return mbuf chain in ip6_input()
597 if (m && m->m_next != NULL && m->m_pkthdr.len < MCLBYTES) { in ip6_input()
600 if (m->m_pkthdr.len > MHLEN) in ip6_input()
608 m_copydata(m, 0, n->m_pkthdr.len, mtod(n, caddr_t)); in ip6_input()
609 n->m_len = n->m_pkthdr.len; in ip6_input()
613 if (m->m_len < sizeof(struct ip6_hdr)) { in ip6_input()
622 if ((ip6->ip6_vfc & IPV6_VERSION_MASK) != IPV6_VERSION) { in ip6_input()
628 IP6STAT_INC2(ip6s_nxthist, ip6->ip6_nxt); in ip6_input()
635 if (IN6_IS_ADDR_MULTICAST(&ip6->ip6_src)) { in ip6_input()
643 if (IN6_IS_ADDR_MC_INTFACELOCAL(&ip6->ip6_dst) && in ip6_input()
644 !(m->m_flags & M_LOOP)) { in ip6_input()
655 if (IN6_IS_ADDR_MULTICAST(&ip6->ip6_dst) && in ip6_input()
656 IPV6_ADDR_MC_SCOPE(&ip6->ip6_dst) == 0) { in ip6_input()
673 * We have supported IPv6-only kernels for a few years and this issue in ip6_input()
678 if (IN6_IS_ADDR_V4MAPPED(&ip6->ip6_src) || in ip6_input()
679 IN6_IS_ADDR_V4MAPPED(&ip6->ip6_dst)) { in ip6_input()
689 * stronger than RFC1933). We may want to re-enable it if mech-xx in ip6_input()
692 if (IN6_IS_ADDR_V4COMPAT(&ip6->ip6_src) || in ip6_input()
693 IN6_IS_ADDR_V4COMPAT(&ip6->ip6_dst)) { in ip6_input()
695 in6_ifstat_inc(m->m_pkthdr.rcvif, ifs6_in_addrerr); in ip6_input()
717 if (m->m_flags & M_FASTFWD_OURS) { in ip6_input()
742 odst = ip6->ip6_dst; in ip6_input()
743 if (pfil_mbuf_in(V_inet6_pfil_head, &m, m->m_pkthdr.rcvif, in ip6_input()
747 srcrt = !IN6_ARE_ADDR_EQUAL(&odst, &ip6->ip6_dst); in ip6_input()
748 if ((m->m_flags & (M_IP6_NEXTHOP | M_FASTFWD_OURS)) == M_IP6_NEXTHOP && in ip6_input()
765 if (__predict_false(IN6_IS_ADDR_UNSPECIFIED(&ip6->ip6_dst))) { in ip6_input()
775 * are not necessarily invalid spec-wise, but we cannot accept them due in ip6_input()
781 if (in6_clearscope(&ip6->ip6_src) || in6_clearscope(&ip6->ip6_dst)) { in ip6_input()
785 if (in6_setscope(&ip6->ip6_src, rcvif, NULL) || in ip6_input()
786 in6_setscope(&ip6->ip6_dst, rcvif, NULL)) { in ip6_input()
790 if (m->m_flags & M_FASTFWD_OURS) { in ip6_input()
791 m->m_flags &= ~M_FASTFWD_OURS; in ip6_input()
799 if (IN6_IS_ADDR_MULTICAST(&ip6->ip6_dst)) { in ip6_input()
806 * XXX: For now we keep link-local IPv6 addresses with embedded in ip6_input()
809 ia = in6ifa_ifwithaddr(&ip6->ip6_dst, 0 /* XXX */, false); in ip6_input()
811 if (ia->ia6_flags & IN6_IFF_NOTREADY) { in ip6_input()
816 "ip6_input: packet to an unready address %s->%s\n", in ip6_input()
817 ip6_sprintf(ip6bufs, &ip6->ip6_src), in ip6_input()
818 ip6_sprintf(ip6bufd, &ip6->ip6_dst))); in ip6_input()
821 if (V_ip6_sav && !(m->m_flags & M_LOOP) && in ip6_input()
822 __predict_false(in6_localip_fib(&ip6->ip6_src, in ip6_input()
823 rcvif->if_fib))) { in ip6_input()
828 counter_u64_add(ia->ia_ifa.ifa_ipackets, 1); in ip6_input()
829 counter_u64_add(ia->ia_ifa.ifa_ibytes, m->m_pkthdr.len); in ip6_input()
845 * Process Hop-by-Hop options header if it's contained. in ip6_input()
849 plen = (u_int32_t)ntohs(ip6->ip6_plen); in ip6_input()
850 if (ip6->ip6_nxt == IPPROTO_HOPOPTS) { in ip6_input()
854 nxt = ip6->ip6_nxt; in ip6_input()
858 * ICMPv6 layer, as hop-by-hop options have been stripped. in ip6_input()
861 m->m_flags |= M_RTALERT_MLD; in ip6_input()
869 if (m->m_pkthdr.len - sizeof(struct ip6_hdr) < plen) { in ip6_input()
874 if (m->m_pkthdr.len > sizeof(struct ip6_hdr) + plen) { in ip6_input()
875 if (m->m_len == m->m_pkthdr.len) { in ip6_input()
876 m->m_len = sizeof(struct ip6_hdr) + plen; in ip6_input()
877 m->m_pkthdr.len = sizeof(struct ip6_hdr) + plen; in ip6_input()
879 m_adj(m, sizeof(struct ip6_hdr) + plen - m->m_pkthdr.len); in ip6_input()
886 IN6_IS_ADDR_MULTICAST(&ip6->ip6_dst)) { in ip6_input()
890 * kernel-level multicast forwarding function. in ip6_input()
892 * ip6_mforward() returns a non-zero value, the packet in ip6_input()
909 * filter again for this 'output' action, allowing redirect-like rules in ip6_input()
933 * protection against faulty packet - there should be in ip6_input()
936 if (m->m_pkthdr.len < off) { in ip6_input()
959 * Hop-by-Hop options header processing. If a valid jumbo payload option is
962 * rtalertp - XXX: should be stored more smart way
973 if (m->m_len < off + sizeof(*hbh)) { in ip6_hopopts_input()
978 return (-1); in ip6_hopopts_input()
982 hbhlen = (hbh->ip6h_len + 1) << 3; in ip6_hopopts_input()
984 if (m->m_len < off + hbhlen) { in ip6_hopopts_input()
989 return (-1); in ip6_hopopts_input()
994 hbhlen -= sizeof(struct ip6_hbh); in ip6_hopopts_input()
998 return (-1); in ip6_hopopts_input()
1007 * Search header for all Hop-by-hop options and process each option.
1009 * handle a case where the sending node itself process its hop-by-hop
1027 for (; hbhlen > 0; hbhlen -= optlen, opt += optlen) { in ip6_process_hopopts()
1045 if (*(opt + 1) != IP6OPT_RTALERT_LEN - 2) { in ip6_process_hopopts()
1049 erroff + opt + 1 - opthead); in ip6_process_hopopts()
1050 return (-1); in ip6_process_hopopts()
1062 if (*(opt + 1) != IP6OPT_JUMBO_LEN - 2) { in ip6_process_hopopts()
1066 erroff + opt + 1 - opthead); in ip6_process_hopopts()
1067 return (-1); in ip6_process_hopopts()
1076 if (ip6->ip6_plen) { in ip6_process_hopopts()
1080 erroff + opt - opthead); in ip6_process_hopopts()
1081 return (-1); in ip6_process_hopopts()
1094 * *plenp will be non-zero and the packet will be in ip6_process_hopopts()
1096 * the behavior may need some debate in ipngwg - in ip6_process_hopopts()
1104 erroff + opt + 2 - opthead); in ip6_process_hopopts()
1105 return (-1); in ip6_process_hopopts()
1116 erroff + opt + 2 - opthead); in ip6_process_hopopts()
1117 return (-1); in ip6_process_hopopts()
1128 erroff + opt - opthead); in ip6_process_hopopts()
1129 if (optlen == -1) in ip6_process_hopopts()
1130 return (-1); in ip6_process_hopopts()
1140 return (-1); in ip6_process_hopopts()
1159 return (-1); in ip6_unknown_opt()
1163 return (-1); in ip6_unknown_opt()
1167 if (IN6_IS_ADDR_MULTICAST(&ip6->ip6_dst) || in ip6_unknown_opt()
1168 (m->m_flags & (M_BCAST|M_MCAST))) in ip6_unknown_opt()
1173 return (-1); in ip6_unknown_opt()
1177 return (-1); in ip6_unknown_opt()
1190 * set on a v4-mapped socket.
1192 * options and handle the v6-only ones itself.
1201 if ((inp->inp_socket->so_options & SO_TIMESTAMP) != 0) { in ip6_savecontrol_v4()
1207 struct bintime boottimebin, bt1; in ip6_savecontrol_v4() local
1212 switch (inp->inp_socket->so_ts_clock) { in ip6_savecontrol_v4()
1214 if ((m->m_flags & (M_PKTHDR | M_TSTMP)) == (M_PKTHDR | in ip6_savecontrol_v4()
1217 timespec2bintime(&ts1, &bt1); in ip6_savecontrol_v4()
1219 bintime_add(&bt1, &boottimebin); in ip6_savecontrol_v4()
1220 bintime2timeval(&bt1, &t.tv); in ip6_savecontrol_v4()
1227 mp = &(*mp)->m_next; in ip6_savecontrol_v4()
1233 if ((m->m_flags & (M_PKTHDR | M_TSTMP)) == (M_PKTHDR | in ip6_savecontrol_v4()
1245 mp = &(*mp)->m_next; in ip6_savecontrol_v4()
1251 if ((m->m_flags & (M_PKTHDR | M_TSTMP)) == (M_PKTHDR | in ip6_savecontrol_v4()
1263 mp = &(*mp)->m_next; in ip6_savecontrol_v4()
1269 if ((m->m_flags & (M_PKTHDR | M_TSTMP)) == (M_PKTHDR | in ip6_savecontrol_v4()
1277 mp = &(*mp)->m_next; in ip6_savecontrol_v4()
1285 if (stamped && (m->m_flags & (M_PKTHDR | M_TSTMP)) == in ip6_savecontrol_v4()
1291 if ((m->m_flags & M_TSTMP_HPREC) != 0) in ip6_savecontrol_v4()
1296 mp = &(*mp)->m_next; in ip6_savecontrol_v4()
1301 #define IS2292(inp, x, y) (((inp)->inp_flags & IN6P_RFC2292) ? (x) : (y)) in ip6_savecontrol_v4()
1303 if ((inp->inp_flags & IN6P_PKTINFO) != 0) { in ip6_savecontrol_v4()
1306 if ((ip6->ip6_vfc & IPV6_VERSION_MASK) != IPV6_VERSION) { in ip6_savecontrol_v4()
1314 pi6.ipi6_addr.s6_addr32[3] = ip->ip_dst.s_addr; in ip6_savecontrol_v4()
1320 bcopy(&ip6->ip6_dst, &pi6.ipi6_addr, sizeof(struct in6_addr)); in ip6_savecontrol_v4()
1324 (m && m->m_pkthdr.rcvif) ? m->m_pkthdr.rcvif->if_index : 0; in ip6_savecontrol_v4()
1330 mp = &(*mp)->m_next; in ip6_savecontrol_v4()
1333 if ((inp->inp_flags & IN6P_HOPLIMIT) != 0) { in ip6_savecontrol_v4()
1336 if ((ip6->ip6_vfc & IPV6_VERSION_MASK) != IPV6_VERSION) { in ip6_savecontrol_v4()
1341 hlim = ip->ip_ttl; in ip6_savecontrol_v4()
1347 hlim = ip6->ip6_hlim & 0xff; in ip6_savecontrol_v4()
1353 mp = &(*mp)->m_next; in ip6_savecontrol_v4()
1356 if ((inp->inp_flags & IN6P_TCLASS) != 0) { in ip6_savecontrol_v4()
1359 if ((ip6->ip6_vfc & IPV6_VERSION_MASK) != IPV6_VERSION) { in ip6_savecontrol_v4()
1364 tclass = ip->ip_tos; in ip6_savecontrol_v4()
1372 flowinfo = (u_int32_t)ntohl(ip6->ip6_flow & IPV6_FLOWINFO_MASK); in ip6_savecontrol_v4()
1379 mp = &(*mp)->m_next; in ip6_savecontrol_v4()
1383 if ((ip6->ip6_vfc & IPV6_VERSION_MASK) != IPV6_VERSION) { in ip6_savecontrol_v4()
1405 * IPV6_HOPOPTS socket option. Recall that we required super-user in ip6_savecontrol()
1407 * strict, since there might be some hop-by-hop options which can be in ip6_savecontrol()
1411 if ((inp->inp_flags & IN6P_HOPOPTS) != 0) { in ip6_savecontrol()
1413 * Check if a hop-by-hop options header is contatined in the in ip6_savecontrol()
1415 * data. Note that a hop-by-hop options header must be in ip6_savecontrol()
1419 if (ip6->ip6_nxt == IPPROTO_HOPOPTS) { in ip6_savecontrol()
1424 hbhlen = (hbh->ip6h_len + 1) << 3; in ip6_savecontrol()
1437 mp = &(*mp)->m_next; in ip6_savecontrol()
1441 if ((inp->inp_flags & (IN6P_RTHDR | IN6P_DSTOPTS)) != 0) { in ip6_savecontrol()
1442 int nxt = ip6->ip6_nxt, off = sizeof(struct ip6_hdr); in ip6_savecontrol()
1469 if (off + sizeof(*ip6e) > m->m_len) in ip6_savecontrol()
1473 elen = (ip6e->ip6e_len + 2) << 2; in ip6_savecontrol()
1475 elen = (ip6e->ip6e_len + 1) << 3; in ip6_savecontrol()
1476 if (off + elen > m->m_len) in ip6_savecontrol()
1481 if (!(inp->inp_flags & IN6P_DSTOPTS)) in ip6_savecontrol()
1488 mp = &(*mp)->m_next; in ip6_savecontrol()
1491 if (!(inp->inp_flags & IN6P_RTHDR)) in ip6_savecontrol()
1498 mp = &(*mp)->m_next; in ip6_savecontrol()
1516 nxt = ip6e->ip6e_nxt; in ip6_savecontrol()
1523 if (inp->inp_flags2 & INP_RECVFLOWID) { in ip6_savecontrol()
1526 flowid = m->m_pkthdr.flowid; in ip6_savecontrol()
1531 * other - don't populate both? in ip6_savecontrol()
1536 mp = &(*mp)->m_next; in ip6_savecontrol()
1540 mp = &(*mp)->m_next; in ip6_savecontrol()
1544 if (inp->inp_flags2 & INP_RECVRSSBUCKETID) { in ip6_savecontrol()
1548 flowid = m->m_pkthdr.flowid; in ip6_savecontrol()
1555 mp = &(*mp)->m_next; in ip6_savecontrol()
1580 if ((inp->inp_flags & IN6P_MTU) == 0 || ( in ip6_notify_pmtu()
1581 !IN6_IS_ADDR_UNSPECIFIED(&inp->in6p_faddr) && in ip6_notify_pmtu()
1582 !IN6_ARE_ADDR_EQUAL(&inp->in6p_faddr, &dst->sin6_addr))) in ip6_notify_pmtu()
1594 so = inp->inp_socket; in ip6_notify_pmtu()
1595 if (sbappendaddr(&so->so_rcv, (struct sockaddr *)dst, NULL, m_mtu) in ip6_notify_pmtu()
1621 nxt = ip6->ip6_nxt; in ip6_get_prevhdr()
1639 return (len - nlen); in ip6_get_prevhdr()
1655 if ((m->m_flags & M_PKTHDR) == 0 || m->m_pkthdr.len < off) in ip6_nexthdr()
1656 return -1; in ip6_nexthdr()
1660 if (m->m_pkthdr.len < off + sizeof(ip6)) in ip6_nexthdr()
1661 return -1; in ip6_nexthdr()
1673 if (m->m_pkthdr.len < off + sizeof(fh)) in ip6_nexthdr()
1674 return -1; in ip6_nexthdr()
1678 return -1; in ip6_nexthdr()
1685 if (m->m_pkthdr.len < off + sizeof(ip6e)) in ip6_nexthdr()
1686 return -1; in ip6_nexthdr()
1696 if (m->m_pkthdr.len < off + sizeof(ip6e)) in ip6_nexthdr()
1697 return -1; in ip6_nexthdr()
1708 return -1; in ip6_nexthdr()
1711 return -1; in ip6_nexthdr()
1727 nxt = -1; in ip6_lasthdr()
1735 return -1; /* invalid */ in ip6_lasthdr()