49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore/*
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * Copyright (c) 2008-2016 Solarflare Communications Inc.
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * All rights reserved.
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore *
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * Redistribution and use in source and binary forms, with or without
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * modification, are permitted provided that the following conditions are met:
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore *
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * 1. Redistributions of source code must retain the above copyright notice,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * this list of conditions and the following disclaimer.
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * 2. Redistributions in binary form must reproduce the above copyright notice,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * this list of conditions and the following disclaimer in the documentation
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * and/or other materials provided with the distribution.
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore *
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore *
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * The views and conclusions contained in the software and documentation are
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * those of the authors and should not be interpreted as representing official
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * policies, either expressed or implied, of the FreeBSD Project.
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#include <sys/types.h>
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#include <sys/sysmacros.h>
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#include <sys/ddi.h>
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#include <sys/sunddi.h>
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#include <sys/stream.h>
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#include <sys/strsun.h>
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#include <sys/strsubr.h>
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#include <sys/pattr.h>
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#include <sys/ethernet.h>
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#include <inet/ip.h>
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#include <netinet/in.h>
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#include <netinet/ip.h>
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#include <netinet/tcp.h>
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#include <netinet/udp.h>
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#include <netinet/sctp.h>
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#include "sfxge.h"
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#include "efx.h"
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore/*
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * Parse packet headers and return:
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * etherhpp Ethernet MAC header
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * iphpp IPv4 header (NULL for non-IPv4 packet)
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * thpp TCP header (NULL for non-TCP packet)
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * offp Offset to TCP payload
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * sizep Size of TCP payload
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * dportp TCP/UDP/SCTP dest. port (network order), otherwise zero
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * sportp TCP/UDP/SCTP source port, (network order) otherwise zero
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoresfxge_packet_type_t
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoresfxge_pkthdr_parse(mblk_t *mp, struct ether_header **etherhpp,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore struct ip **iphpp, struct tcphdr **thpp,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore size_t *offp, size_t *sizep,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint16_t *sportp, uint16_t *dportp)
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore{
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore struct ether_header *etherhp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint16_t ether_type;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore size_t etherhs;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore struct ip *iphp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore size_t iphs;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore struct tcphdr *thp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore size_t len;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore size_t ths;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore size_t off;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore size_t size;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint16_t sport;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint16_t dport;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_packet_type_t pkt_type = SFXGE_PACKET_TYPE_UNKNOWN;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore etherhp = NULL;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore iphp = NULL;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore thp = NULL;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore off = 0;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore size = 0;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sport = 0;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore dport = 0;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* Grab the MAC header */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore etherhs = sizeof (struct ether_header);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore if ((MBLKL(mp) < etherhs) && (pullupmsg(mp, etherhs) == 0))
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore goto done;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /*LINTED*/
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore etherhp = (struct ether_header *)(mp->b_rptr);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore ether_type = etherhp->ether_type;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore if (ether_type == htons(ETHERTYPE_VLAN)) {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore struct ether_vlan_header *ethervhp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore etherhs = sizeof (struct ether_vlan_header);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore if ((MBLKL(mp) < etherhs) && (pullupmsg(mp, etherhs) == 0))
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore goto done;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /*LINTED*/
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore ethervhp = (struct ether_vlan_header *)(mp->b_rptr);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore ether_type = ethervhp->ether_type;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore }
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore if (ether_type != htons(ETHERTYPE_IP))
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore goto done;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* Skip over the MAC header */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore off += etherhs;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* Grab the IP header */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore len = off + sizeof (struct ip);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore if ((MBLKL(mp) < len) && (pullupmsg(mp, len) == 0))
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore goto done;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /*LINTED*/
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore iphp = (struct ip *)(mp->b_rptr + off);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore iphs = iphp->ip_hl * 4;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore if (iphp->ip_v != IPV4_VERSION)
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore goto done;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* Get the size of the packet */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore size = ntohs(iphp->ip_len);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore ASSERT3U(etherhs + size, <=, msgdsize(mp));
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore pkt_type = SFXGE_PACKET_TYPE_IPV4_OTHER;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* Skip over the IP header */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore off += iphs;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore size -= iphs;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore if (iphp->ip_p == IPPROTO_TCP) {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* Grab the TCP header */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore len = off + sizeof (struct tcphdr);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore if ((MBLKL(mp) < len) && (pullupmsg(mp, len) == 0))
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore goto done;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /*LINTED*/
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore thp = (struct tcphdr *)(mp->b_rptr + off);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore ths = thp->th_off * 4;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore dport = thp->th_dport;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sport = thp->th_sport;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* Skip over the TCP header */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore off += ths;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore size -= ths;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore pkt_type = SFXGE_PACKET_TYPE_IPV4_TCP;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore } else if (iphp->ip_p == IPPROTO_UDP) {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore struct udphdr *uhp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* Grab the UDP header */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore len = off + sizeof (struct udphdr);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore if ((MBLKL(mp) < len) && (pullupmsg(mp, len) == 0))
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore goto done;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /*LINTED*/
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uhp = (struct udphdr *)(mp->b_rptr + off);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore dport = uhp->uh_dport;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sport = uhp->uh_sport;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* Skip over the UDP header */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore off += sizeof (struct udphdr);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore size -= sizeof (struct udphdr);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore pkt_type = SFXGE_PACKET_TYPE_IPV4_UDP;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore } else if (iphp->ip_p == IPPROTO_SCTP) {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore struct sctp_hdr *shp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* Grab the SCTP header */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore len = off + sizeof (struct sctp_hdr);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore if ((MBLKL(mp) < len) && (pullupmsg(mp, len) == 0))
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore goto done;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /*LINTED*/
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore shp = (struct sctp_hdr *)(mp->b_rptr + off);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore dport = shp->sh_dport;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sport = shp->sh_sport;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* Skip over the SCTP header */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore off += sizeof (struct sctp_hdr);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore size -= sizeof (struct sctp_hdr);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore pkt_type = SFXGE_PACKET_TYPE_IPV4_SCTP;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore }
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore if (MBLKL(mp) < off)
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore (void) pullupmsg(mp, off);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoredone:
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore *etherhpp = etherhp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore *iphpp = iphp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore *thpp = thp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore *offp = off;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore *sizep = size;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore *sportp = sport;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore *dportp = dport;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore return (pkt_type);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore}