99 #include <inet/ipsec_impl.h>
100 #include <inet/ipdrop.h>
101 #include <inet/ip_netinfo.h>
102 #include <inet/ilb_ip.h>
103 #include <sys/squeue_impl.h>
104 #include <sys/squeue.h>
105
106 #include <sys/ethernet.h>
107 #include <net/if_types.h>
108 #include <sys/cpuvar.h>
109
110 #include <ipp/ipp.h>
111 #include <ipp/ipp_impl.h>
112 #include <ipp/ipgpc/ipgpc.h>
113
114 #include <sys/pattr.h>
115 #include <inet/ipclassifier.h>
116 #include <inet/sctp_ip.h>
117 #include <inet/sctp/sctp_impl.h>
118 #include <inet/udp_impl.h>
119 #include <sys/sunddi.h>
120
121 #include <sys/tsol/label.h>
122 #include <sys/tsol/tnet.h>
123
124 #include <sys/clock_impl.h> /* For LBOLT_FASTPATH{,64} */
125
126 #ifdef DEBUG
127 extern boolean_t skip_sctp_cksum;
128 #endif
129
130 static void ip_input_local_v4(ire_t *, mblk_t *, ipha_t *,
131 ip_recv_attr_t *);
132
133 static void ip_input_broadcast_v4(ire_t *, mblk_t *, ipha_t *,
134 ip_recv_attr_t *);
135 static void ip_input_multicast_v4(ire_t *, mblk_t *, ipha_t *,
136 ip_recv_attr_t *);
137
138 #pragma inline(ip_input_common_v4, ip_input_local_v4, ip_forward_xmit_v4)
2372 /* ip_drop_packet and MIB done */
2373 return;
2374 }
2375 }
2376
2377 /* Determine the minimum required size of the upper-layer header */
2378 /* Need to do this for at least the set of ULPs that TX handles. */
2379 switch (protocol) {
2380 case IPPROTO_TCP:
2381 min_ulp_header_length = TCP_MIN_HEADER_LENGTH;
2382 break;
2383 case IPPROTO_SCTP:
2384 min_ulp_header_length = SCTP_COMMON_HDR_LENGTH;
2385 break;
2386 case IPPROTO_UDP:
2387 min_ulp_header_length = UDPH_SIZE;
2388 break;
2389 case IPPROTO_ICMP:
2390 min_ulp_header_length = ICMPH_SIZE;
2391 break;
2392 default:
2393 min_ulp_header_length = 0;
2394 break;
2395 }
2396 /* Make sure we have the min ULP header length */
2397 len = mp->b_wptr - rptr;
2398 if (len < ip_hdr_length + min_ulp_header_length) {
2399 if (ira->ira_pktlen < ip_hdr_length + min_ulp_header_length) {
2400 BUMP_MIB(ill->ill_ip_mib, ipIfStatsInTruncatedPkts);
2401 ip_drop_input("ipIfStatsInTruncatedPkts", mp, ill);
2402 freemsg(mp);
2403 return;
2404 }
2405 IP_STAT(ipst, ip_recv_pullup);
2406 ipha = ip_pullup(mp, ip_hdr_length + min_ulp_header_length,
2407 ira);
2408 if (ipha == NULL)
2409 goto discard;
2410 len = mp->b_wptr - rptr;
2411 }
2697 * Packet was consumed - probably sent to
2698 * ip_fanout_v4.
2699 */
2700 CONN_DEC_REF(connp);
2701 return;
2702 }
2703 /* Else continue like a normal UDP packet. */
2704 ipha = (ipha_t *)mp->b_rptr;
2705 protocol = ipha->ipha_protocol;
2706 ira->ira_protocol = protocol;
2707 }
2708 /* Found a client; up it goes */
2709 IP_STAT(ipst, ip_udp_fannorm);
2710 BUMP_MIB(ill->ill_ip_mib, ipIfStatsHCInDelivers);
2711 ira->ira_ill = ira->ira_rill = NULL;
2712 (connp->conn_recv)(connp, mp, NULL, ira);
2713 CONN_DEC_REF(connp);
2714 ira->ira_ill = ill;
2715 ira->ira_rill = rill;
2716 return;
2717 default:
2718 break;
2719 }
2720
2721 /*
2722 * Clear hardware checksumming flag as it is currently only
2723 * used by TCP and UDP.
2724 */
2725 DB_CKSUMFLAGS(mp) = 0;
2726
2727 switch (protocol) {
2728 case IPPROTO_ICMP:
2729 /*
2730 * We need to accomodate icmp messages coming in clear
2731 * until we get everything secure from the wire. If
2732 * icmp_accept_clear_messages is zero we check with
2733 * the global policy and act accordingly. If it is
2734 * non-zero, we accept the message without any checks.
2735 * But *this does not mean* that this will be delivered
2736 * to RAW socket clients. By accepting we might send
|
99 #include <inet/ipsec_impl.h>
100 #include <inet/ipdrop.h>
101 #include <inet/ip_netinfo.h>
102 #include <inet/ilb_ip.h>
103 #include <sys/squeue_impl.h>
104 #include <sys/squeue.h>
105
106 #include <sys/ethernet.h>
107 #include <net/if_types.h>
108 #include <sys/cpuvar.h>
109
110 #include <ipp/ipp.h>
111 #include <ipp/ipp_impl.h>
112 #include <ipp/ipgpc/ipgpc.h>
113
114 #include <sys/pattr.h>
115 #include <inet/ipclassifier.h>
116 #include <inet/sctp_ip.h>
117 #include <inet/sctp/sctp_impl.h>
118 #include <inet/udp_impl.h>
119 #include <inet/dccp_impl.h>
120 #include <sys/sunddi.h>
121
122 #include <sys/tsol/label.h>
123 #include <sys/tsol/tnet.h>
124
125 #include <sys/clock_impl.h> /* For LBOLT_FASTPATH{,64} */
126
127 #ifdef DEBUG
128 extern boolean_t skip_sctp_cksum;
129 #endif
130
131 static void ip_input_local_v4(ire_t *, mblk_t *, ipha_t *,
132 ip_recv_attr_t *);
133
134 static void ip_input_broadcast_v4(ire_t *, mblk_t *, ipha_t *,
135 ip_recv_attr_t *);
136 static void ip_input_multicast_v4(ire_t *, mblk_t *, ipha_t *,
137 ip_recv_attr_t *);
138
139 #pragma inline(ip_input_common_v4, ip_input_local_v4, ip_forward_xmit_v4)
2373 /* ip_drop_packet and MIB done */
2374 return;
2375 }
2376 }
2377
2378 /* Determine the minimum required size of the upper-layer header */
2379 /* Need to do this for at least the set of ULPs that TX handles. */
2380 switch (protocol) {
2381 case IPPROTO_TCP:
2382 min_ulp_header_length = TCP_MIN_HEADER_LENGTH;
2383 break;
2384 case IPPROTO_SCTP:
2385 min_ulp_header_length = SCTP_COMMON_HDR_LENGTH;
2386 break;
2387 case IPPROTO_UDP:
2388 min_ulp_header_length = UDPH_SIZE;
2389 break;
2390 case IPPROTO_ICMP:
2391 min_ulp_header_length = ICMPH_SIZE;
2392 break;
2393 case IPPROTO_DCCP:
2394 min_ulp_header_length = DCCP_MIN_HEADER_LENGTH;
2395 break;
2396 default:
2397 min_ulp_header_length = 0;
2398 break;
2399 }
2400 /* Make sure we have the min ULP header length */
2401 len = mp->b_wptr - rptr;
2402 if (len < ip_hdr_length + min_ulp_header_length) {
2403 if (ira->ira_pktlen < ip_hdr_length + min_ulp_header_length) {
2404 BUMP_MIB(ill->ill_ip_mib, ipIfStatsInTruncatedPkts);
2405 ip_drop_input("ipIfStatsInTruncatedPkts", mp, ill);
2406 freemsg(mp);
2407 return;
2408 }
2409 IP_STAT(ipst, ip_recv_pullup);
2410 ipha = ip_pullup(mp, ip_hdr_length + min_ulp_header_length,
2411 ira);
2412 if (ipha == NULL)
2413 goto discard;
2414 len = mp->b_wptr - rptr;
2415 }
2701 * Packet was consumed - probably sent to
2702 * ip_fanout_v4.
2703 */
2704 CONN_DEC_REF(connp);
2705 return;
2706 }
2707 /* Else continue like a normal UDP packet. */
2708 ipha = (ipha_t *)mp->b_rptr;
2709 protocol = ipha->ipha_protocol;
2710 ira->ira_protocol = protocol;
2711 }
2712 /* Found a client; up it goes */
2713 IP_STAT(ipst, ip_udp_fannorm);
2714 BUMP_MIB(ill->ill_ip_mib, ipIfStatsHCInDelivers);
2715 ira->ira_ill = ira->ira_rill = NULL;
2716 (connp->conn_recv)(connp, mp, NULL, ira);
2717 CONN_DEC_REF(connp);
2718 ira->ira_ill = ill;
2719 ira->ira_rill = rill;
2720 return;
2721 case IPPROTO_DCCP:
2722 /* For DCCP, discard broadcast and multicast packets */
2723 if (iraflags & IRAF_MULTIBROADCAST) {
2724 goto discard;
2725 }
2726
2727 /* First mblk contains IP+DCCP headers per above check */
2728 ASSERT(len >= ip_hdr_length + DCCP_MIN_HEADER_LENGTH);
2729
2730 /* Squeue hint */
2731 if (ira->ira_sqp == NULL) {
2732 ira->ira_sqp = ip_squeue_get(ira->ira_ring);
2733 }
2734
2735 connp = ipcl_classify_v4(mp, IPPROTO_DCCP, ip_hdr_length,
2736 ira, ipst);
2737 if (connp == NULL) {
2738 cmn_err(CE_NOTE, "ip_input.c: ip_fanout_v4 connp not found");
2739 /* Send the reset packet */
2740 BUMP_MIB(ill->ill_ip_mib, ipIfStatsHCInDelivers);
2741 dccp_xmit_listeners_reset(mp, ira, ipst, NULL);
2742 return;
2743 }
2744
2745 if (connp->conn_incoming_ifindex != 0 &&
2746 connp->conn_incoming_ifindex != ira->ira_ruifindex) {
2747 cmn_err(CE_NOTE, "ip_input.c: ip_fanout_v4 ifindex problem");
2748 /* Send the reset packet */
2749 BUMP_MIB(ill->ill_ip_mib, ipIfStatsHCInDelivers);
2750 dccp_xmit_listeners_reset(mp, ira, ipst, NULL);
2751 return;
2752 }
2753
2754 if (CONN_INBOUND_POLICY_PRESENT(connp, ipss) ||
2755 (iraflags & IRAF_IPSEC_SECURE)) {
2756 mp = ipsec_check_inbound_policy(mp, connp,
2757 ipha, NULL, ira);
2758 if (mp == NULL) {
2759 BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
2760 /* Note that mp is NULL */
2761 ip_drop_input("ipIfStatsInDiscards", mp, ill);
2762 CONN_DEC_REF(connp);
2763 return;
2764 }
2765 }
2766
2767 /* Found a client; up it goes */
2768 BUMP_MIB(ill->ill_ip_mib, ipIfStatsHCInDelivers);
2769 ira->ira_ill = ira->ira_rill = NULL;
2770
2771 /* XXX SOCK_RAW for DCCP? */
2772
2773 if (iraflags & IRAF_TARGET_SQP) {
2774 cmn_err(CE_NOTE, "IRAF_TARGET_SQP");
2775 } else {
2776 SQUEUE_ENTER_ONE(connp->conn_sqp, mp, connp->conn_recv,
2777 connp, ira, ip_squeue_flag, SQTAG_IP_DCCP_INPUT);
2778 }
2779
2780 ira->ira_ill = ill;
2781 ira->ira_rill = rill;
2782 return;
2783
2784 default:
2785 break;
2786 }
2787
2788 /*
2789 * Clear hardware checksumming flag as it is currently only
2790 * used by TCP and UDP.
2791 */
2792 DB_CKSUMFLAGS(mp) = 0;
2793
2794 switch (protocol) {
2795 case IPPROTO_ICMP:
2796 /*
2797 * We need to accomodate icmp messages coming in clear
2798 * until we get everything secure from the wire. If
2799 * icmp_accept_clear_messages is zero we check with
2800 * the global policy and act accordingly. If it is
2801 * non-zero, we accept the message without any checks.
2802 * But *this does not mean* that this will be delivered
2803 * to RAW socket clients. By accepting we might send
|