14edabff4Sbrendan/* 24edabff4Sbrendan * CDDL HEADER START 34edabff4Sbrendan * 44edabff4Sbrendan * The contents of this file are subject to the terms of the 54edabff4Sbrendan * Common Development and Distribution License (the "License"). 64edabff4Sbrendan * You may not use this file except in compliance with the License. 74edabff4Sbrendan * 84edabff4Sbrendan * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 94edabff4Sbrendan * or http://www.opensolaris.org/os/licensing. 104edabff4Sbrendan * See the License for the specific language governing permissions 114edabff4Sbrendan * and limitations under the License. 124edabff4Sbrendan * 134edabff4Sbrendan * When distributing Covered Code, include this CDDL HEADER in each 144edabff4Sbrendan * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 154edabff4Sbrendan * If applicable, add the following below this CDDL HEADER, with the 164edabff4Sbrendan * fields enclosed by brackets "[]" replaced with your own identifying 174edabff4Sbrendan * information: Portions Copyright [yyyy] [name of copyright owner] 184edabff4Sbrendan * 194edabff4Sbrendan * CDDL HEADER END 204edabff4Sbrendan */ 214edabff4Sbrendan/* 224edabff4Sbrendan * Copyright 2007 Sun Microsystems, Inc. All rights reserved. 234edabff4Sbrendan * Use is subject to license terms. 244edabff4Sbrendan */ 254edabff4Sbrendan 264edabff4Sbrendan#pragma ident "%Z%%M% %I% %E% SMI" 274edabff4Sbrendan 28*10e6dadfSbrendan#pragma D depends_on module ip 29*10e6dadfSbrendan#pragma D depends_on provider ip 30*10e6dadfSbrendan 31*10e6dadfSbrendaninline int IPH_DF = @IPH_DF@; 32*10e6dadfSbrendan#pragma D binding "1.0" IPH_DF 33*10e6dadfSbrendaninline int IPH_MF = @IPH_MF@; 34*10e6dadfSbrendan#pragma D binding "1.0" IPH_MF 35*10e6dadfSbrendan 36*10e6dadfSbrendan#pragma D binding "1.0" IPPROTO_IP 37*10e6dadfSbrendaninline int IPPROTO_IP = @IPPROTO_IP@; 38*10e6dadfSbrendan#pragma D binding "1.0" IPPROTO_HOPOPTS 39*10e6dadfSbrendaninline int IPPROTO_HOPOPTS = @IPPROTO_HOPOPTS@; 40*10e6dadfSbrendan#pragma D binding "1.0" IPPROTO_ICMP 41*10e6dadfSbrendaninline int IPPROTO_ICMP = @IPPROTO_ICMP@; 42*10e6dadfSbrendan#pragma D binding "1.0" IPPROTO_IGMP 43*10e6dadfSbrendaninline int IPPROTO_IGMP = @IPPROTO_IGMP@; 44*10e6dadfSbrendan#pragma D binding "1.0" IPPROTO_GGP 45*10e6dadfSbrendaninline int IPPROTO_GGP = @IPPROTO_GGP@; 46*10e6dadfSbrendan#pragma D binding "1.0" IPPROTO_ENCAP 47*10e6dadfSbrendaninline int IPPROTO_ENCAP = @IPPROTO_ENCAP@; 48*10e6dadfSbrendan#pragma D binding "1.0" IPPROTO_TCP 49*10e6dadfSbrendaninline int IPPROTO_TCP = @IPPROTO_TCP@; 50*10e6dadfSbrendan#pragma D binding "1.0" IPPROTO_EGP 51*10e6dadfSbrendaninline int IPPROTO_EGP = @IPPROTO_EGP@; 52*10e6dadfSbrendan#pragma D binding "1.0" IPPROTO_PUP 53*10e6dadfSbrendaninline int IPPROTO_PUP = @IPPROTO_PUP@; 54*10e6dadfSbrendan#pragma D binding "1.0" IPPROTO_UDP 55*10e6dadfSbrendaninline int IPPROTO_UDP = @IPPROTO_UDP@; 56*10e6dadfSbrendan#pragma D binding "1.0" IPPROTO_IDP 57*10e6dadfSbrendaninline int IPPROTO_IDP = @IPPROTO_IDP@; 58*10e6dadfSbrendan#pragma D binding "1.0" IPPROTO_IPV6 59*10e6dadfSbrendaninline int IPPROTO_IPV6 = @IPPROTO_IPV6@; 60*10e6dadfSbrendan#pragma D binding "1.0" IPPROTO_ROUTING 61*10e6dadfSbrendaninline int IPPROTO_ROUTING = @IPPROTO_ROUTING@; 62*10e6dadfSbrendan#pragma D binding "1.0" IPPROTO_FRAGMENT 63*10e6dadfSbrendaninline int IPPROTO_FRAGMENT = @IPPROTO_FRAGMENT@; 64*10e6dadfSbrendan#pragma D binding "1.0" IPPROTO_RSVP 65*10e6dadfSbrendaninline int IPPROTO_RSVP = @IPPROTO_RSVP@; 66*10e6dadfSbrendan#pragma D binding "1.0" IPPROTO_ESP 67*10e6dadfSbrendaninline int IPPROTO_ESP = @IPPROTO_ESP@; 68*10e6dadfSbrendan#pragma D binding "1.0" IPPROTO_AH 69*10e6dadfSbrendaninline int IPPROTO_AH = @IPPROTO_AH@; 70*10e6dadfSbrendan#pragma D binding "1.0" IPPROTO_ICMPV6 71*10e6dadfSbrendaninline int IPPROTO_ICMPV6 = @IPPROTO_ICMPV6@; 72*10e6dadfSbrendan#pragma D binding "1.0" IPPROTO_NONE 73*10e6dadfSbrendaninline int IPPROTO_NONE = @IPPROTO_NONE@; 74*10e6dadfSbrendan#pragma D binding "1.0" IPPROTO_DSTOPTS 75*10e6dadfSbrendaninline int IPPROTO_DSTOPTS = @IPPROTO_DSTOPTS@; 76*10e6dadfSbrendan#pragma D binding "1.0" IPPROTO_HELLO 77*10e6dadfSbrendaninline int IPPROTO_HELLO = @IPPROTO_HELLO@; 78*10e6dadfSbrendan#pragma D binding "1.0" IPPROTO_ND 79*10e6dadfSbrendaninline int IPPROTO_ND = @IPPROTO_ND@; 80*10e6dadfSbrendan#pragma D binding "1.0" IPPROTO_EON 81*10e6dadfSbrendaninline int IPPROTO_EON = @IPPROTO_EON@; 82*10e6dadfSbrendan#pragma D binding "1.0" IPPROTO_OSPF 83*10e6dadfSbrendaninline int IPPROTO_OSPF = @IPPROTO_OSPF@; 84*10e6dadfSbrendan#pragma D binding "1.0" IPPROTO_PIM 85*10e6dadfSbrendaninline int IPPROTO_PIM = @IPPROTO_PIM@; 86*10e6dadfSbrendan#pragma D binding "1.0" IPPROTO_SCTP 87*10e6dadfSbrendaninline int IPPROTO_SCTP = @IPPROTO_SCTP@; 88*10e6dadfSbrendan#pragma D binding "1.0" IPPROTO_RAW 89*10e6dadfSbrendaninline int IPPROTO_RAW = @IPPROTO_RAW@; 90*10e6dadfSbrendan#pragma D binding "1.0" IPPROTO_MAX 91*10e6dadfSbrendaninline int IPPROTO_MAX = @IPPROTO_MAX@; 92*10e6dadfSbrendan 93*10e6dadfSbrendan/* 94*10e6dadfSbrendan * pktinfo is where packet ID info can be made available for deeper 95*10e6dadfSbrendan * analysis if packet IDs become supported by the kernel in the future. 96*10e6dadfSbrendan * The pkt_addr member is currently always NULL. 97*10e6dadfSbrendan */ 98*10e6dadfSbrendantypedef struct pktinfo { 99*10e6dadfSbrendan uintptr_t pkt_addr; 100*10e6dadfSbrendan} pktinfo_t; 101*10e6dadfSbrendan 102*10e6dadfSbrendan/* 103*10e6dadfSbrendan * csinfo is where connection state info can be made available if 104*10e6dadfSbrendan * connection IDs become supported by the kernel in the future. 105*10e6dadfSbrendan * The cs_addr member is currently always NULL. 106*10e6dadfSbrendan */ 107*10e6dadfSbrendantypedef struct csinfo { 108*10e6dadfSbrendan uintptr_t cs_addr; 109*10e6dadfSbrendan} csinfo_t; 110*10e6dadfSbrendan 111*10e6dadfSbrendan/* 112*10e6dadfSbrendan * ipinfo contains common IP info for both IPv4 and IPv6. 113*10e6dadfSbrendan */ 114*10e6dadfSbrendantypedef struct ipinfo { 115*10e6dadfSbrendan uint8_t ip_ver; /* IP version (4, 6) */ 116*10e6dadfSbrendan uint32_t ip_plength; /* payload length */ 117*10e6dadfSbrendan string ip_saddr; /* source address */ 118*10e6dadfSbrendan string ip_daddr; /* destination address */ 119*10e6dadfSbrendan} ipinfo_t; 120*10e6dadfSbrendan 121*10e6dadfSbrendan/* 122*10e6dadfSbrendan * ifinfo contains network interface info. 123*10e6dadfSbrendan */ 124*10e6dadfSbrendantypedef struct ifinfo { 125*10e6dadfSbrendan string if_name; /* interface name */ 126*10e6dadfSbrendan int8_t if_local; /* is delivered locally */ 127*10e6dadfSbrendan netstackid_t if_ipstack; /* ipstack ID */ 128*10e6dadfSbrendan uintptr_t if_addr; /* pointer to raw ill_t */ 129*10e6dadfSbrendan} ifinfo_t; 130*10e6dadfSbrendan 131*10e6dadfSbrendan/* 132*10e6dadfSbrendan * ipv4info is a translated version of the IPv4 header (with raw pointer). 133*10e6dadfSbrendan * These values are NULL if the packet is not IPv4. 134*10e6dadfSbrendan */ 135*10e6dadfSbrendantypedef struct ipv4info { 136*10e6dadfSbrendan uint8_t ipv4_ver; /* IP version (4) */ 137*10e6dadfSbrendan uint8_t ipv4_ihl; /* header length, bytes */ 138*10e6dadfSbrendan uint8_t ipv4_tos; /* type of service field */ 139*10e6dadfSbrendan uint16_t ipv4_length; /* length (header + payload) */ 140*10e6dadfSbrendan uint16_t ipv4_ident; /* identification */ 141*10e6dadfSbrendan uint8_t ipv4_flags; /* IP flags */ 142*10e6dadfSbrendan uint16_t ipv4_offset; /* fragment offset */ 143*10e6dadfSbrendan uint8_t ipv4_ttl; /* time to live */ 144*10e6dadfSbrendan uint8_t ipv4_protocol; /* next level protocol */ 145*10e6dadfSbrendan string ipv4_protostr; /* next level protocol, as a string */ 146*10e6dadfSbrendan uint16_t ipv4_checksum; /* header checksum */ 147*10e6dadfSbrendan ipaddr_t ipv4_src; /* source address */ 148*10e6dadfSbrendan ipaddr_t ipv4_dst; /* destination address */ 149*10e6dadfSbrendan string ipv4_saddr; /* source address, string */ 150*10e6dadfSbrendan string ipv4_daddr; /* destination address, string */ 151*10e6dadfSbrendan ipha_t *ipv4_hdr; /* pointer to raw header */ 152*10e6dadfSbrendan} ipv4info_t; 153*10e6dadfSbrendan 154*10e6dadfSbrendan/* 155*10e6dadfSbrendan * ipv6info is a translated version of the IPv6 header (with raw pointer). 156*10e6dadfSbrendan * These values are NULL if the packet is not IPv6. 157*10e6dadfSbrendan */ 158*10e6dadfSbrendantypedef struct ipv6info { 159*10e6dadfSbrendan uint8_t ipv6_ver; /* IP version (6) */ 160*10e6dadfSbrendan uint8_t ipv6_tclass; /* traffic class */ 161*10e6dadfSbrendan uint32_t ipv6_flow; /* flow label */ 162*10e6dadfSbrendan uint16_t ipv6_plen; /* payload length */ 163*10e6dadfSbrendan uint8_t ipv6_nexthdr; /* next header protocol */ 164*10e6dadfSbrendan string ipv6_nextstr; /* next header protocol, as a string */ 165*10e6dadfSbrendan uint8_t ipv6_hlim; /* hop limit */ 166*10e6dadfSbrendan in6_addr_t *ipv6_src; /* source address */ 167*10e6dadfSbrendan in6_addr_t *ipv6_dst; /* destination address */ 168*10e6dadfSbrendan string ipv6_saddr; /* source address, string */ 169*10e6dadfSbrendan string ipv6_daddr; /* destination address, string */ 170*10e6dadfSbrendan ip6_t *ipv6_hdr; /* pointer to raw header */ 171*10e6dadfSbrendan} ipv6info_t; 172*10e6dadfSbrendan 173*10e6dadfSbrendan/* 174*10e6dadfSbrendan * void_ip_t is a void pointer to either an IPv4 or IPv6 header. It has 175*10e6dadfSbrendan * its own type name so that a translator can be determined. 176*10e6dadfSbrendan */ 177*10e6dadfSbrendantypedef uintptr_t void_ip_t; 178*10e6dadfSbrendan 179*10e6dadfSbrendan/* 180*10e6dadfSbrendan * __dtrace_ipsr_ill_t is used by the translator to take an ill_t plus an 181*10e6dadfSbrendan * additional arg6 from the ip:::send and ip:::recieve probes, and translate 182*10e6dadfSbrendan * them to an ifinfo_t. 183*10e6dadfSbrendan */ 184*10e6dadfSbrendantypedef ill_t __dtrace_ipsr_ill_t; 185*10e6dadfSbrendan 186*10e6dadfSbrendan#pragma D binding "1.0" translator 187*10e6dadfSbrendantranslator pktinfo_t < mblk_t *M > { 188*10e6dadfSbrendan pkt_addr = NULL; 189*10e6dadfSbrendan}; 190*10e6dadfSbrendan 191*10e6dadfSbrendan#pragma D binding "1.0" translator 192*10e6dadfSbrendantranslator csinfo_t < conn_t *C > { 193*10e6dadfSbrendan cs_addr = NULL; 194*10e6dadfSbrendan}; 195*10e6dadfSbrendan 196*10e6dadfSbrendan#pragma D binding "1.0" translator 197*10e6dadfSbrendantranslator ipinfo_t < ipha_t *I > { 198*10e6dadfSbrendan ip_ver = I->ipha_version_and_hdr_length >> 4; 199*10e6dadfSbrendan ip_plength = ntohs(I->ipha_length) - 200*10e6dadfSbrendan ((I->ipha_version_and_hdr_length & 0xf) << 2); 201*10e6dadfSbrendan ip_saddr = inet_ntoa(&I->ipha_src); 202*10e6dadfSbrendan ip_daddr = inet_ntoa(&I->ipha_dst); 203*10e6dadfSbrendan}; 204*10e6dadfSbrendan 205*10e6dadfSbrendan#pragma D binding "1.0" translator 206*10e6dadfSbrendantranslator ipinfo_t < ip6_t *I > { 207*10e6dadfSbrendan ip_ver = *(uint8_t *)I >> 4; 208*10e6dadfSbrendan ip_plength = ntohs(I->ip6_ctlun.ip6_un1.ip6_un1_plen); 209*10e6dadfSbrendan ip_saddr = inet_ntoa6(&I->ip6_src); 210*10e6dadfSbrendan ip_daddr = inet_ntoa6(&I->ip6_dst); 211*10e6dadfSbrendan}; 212*10e6dadfSbrendan 213*10e6dadfSbrendan#pragma D binding "1.0" translator 214*10e6dadfSbrendantranslator ipinfo_t < void_ip_t *I > { 215*10e6dadfSbrendan ip_ver = I != NULL ? *(uint8_t *)I >> 4 : 0; 216*10e6dadfSbrendan ip_plength = I != NULL ? (*(uint8_t *)I >> 4 == 4 ? 217*10e6dadfSbrendan ntohs(((ipha_t *)I)->ipha_length) - 218*10e6dadfSbrendan ((((ipha_t *)I)->ipha_version_and_hdr_length & 0xf) << 2) : 219*10e6dadfSbrendan *(uint8_t *)I >> 4 == 6 ? 220*10e6dadfSbrendan ntohs(((ip6_t *)I)->ip6_ctlun.ip6_un1.ip6_un1_plen) : 0) : 0; 221*10e6dadfSbrendan ip_saddr = I != NULL ? (*(uint8_t *)I >> 4 == 4 ? 222*10e6dadfSbrendan inet_ntoa(&((ipha_t *)I)->ipha_src) : *(uint8_t *)I >> 4 == 6 ? 223*10e6dadfSbrendan inet_ntoa6(&((ip6_t *)I)->ip6_src) : "<unknown>") : "<unknown>"; 224*10e6dadfSbrendan ip_daddr = I != NULL ? (*(uint8_t *)I >> 4 == 4 ? 225*10e6dadfSbrendan inet_ntoa(&((ipha_t *)I)->ipha_dst) : *(uint8_t *)I >> 4 == 6 ? 226*10e6dadfSbrendan inet_ntoa6(&((ip6_t *)I)->ip6_dst) : "<unknown>") : "<unknown>"; 227*10e6dadfSbrendan}; 228*10e6dadfSbrendan 229*10e6dadfSbrendan#pragma D binding "1.0" translator 230*10e6dadfSbrendantranslator ifinfo_t < __dtrace_ipsr_ill_t *I > { 231*10e6dadfSbrendan if_name = I != NULL ? stringof(I->ill_name) : "<null>"; 232*10e6dadfSbrendan if_ipstack = I != NULL ? I->ill_ipst->ips_netstack->netstack_stackid 233*10e6dadfSbrendan : 0; 234*10e6dadfSbrendan if_local = arg6; /* probe dependent */ 235*10e6dadfSbrendan if_addr = (uintptr_t)I; 236*10e6dadfSbrendan}; 237*10e6dadfSbrendan 238*10e6dadfSbrendan#pragma D binding "1.0" translator 239*10e6dadfSbrendantranslator ipv4info_t < ipha_t *I > { 240*10e6dadfSbrendan ipv4_ver = I != NULL ? I->ipha_version_and_hdr_length >> 4 : 0; 241*10e6dadfSbrendan ipv4_ihl = I != NULL ? (I->ipha_version_and_hdr_length & 0xf) << 2 : 0; 242*10e6dadfSbrendan ipv4_tos = I != NULL ? I->ipha_type_of_service : 0; 243*10e6dadfSbrendan ipv4_length = I != NULL ? ntohs(I->ipha_length) : 0; 244*10e6dadfSbrendan ipv4_ident = I != NULL ? ntohs(I->ipha_ident) : 0; 245*10e6dadfSbrendan ipv4_flags = I != NULL ? ntohs(I->ipha_fragment_offset_and_flags) >> 246*10e6dadfSbrendan 12 : 0; 247*10e6dadfSbrendan ipv4_offset = I != NULL ? ntohs(I->ipha_fragment_offset_and_flags) & 248*10e6dadfSbrendan 0x0fff : 0; 249*10e6dadfSbrendan ipv4_ttl = I != NULL ? I->ipha_ttl : 0; 250*10e6dadfSbrendan ipv4_protocol = I != NULL ? I->ipha_protocol : 0; 251*10e6dadfSbrendan ipv4_protostr = I == NULL ? "<null>" : 252*10e6dadfSbrendan I->ipha_protocol == IPPROTO_TCP ? "TCP" : 253*10e6dadfSbrendan I->ipha_protocol == IPPROTO_UDP ? "UDP" : 254*10e6dadfSbrendan I->ipha_protocol == IPPROTO_IP ? "IP" : 255*10e6dadfSbrendan I->ipha_protocol == IPPROTO_ICMP ? "ICMP" : 256*10e6dadfSbrendan I->ipha_protocol == IPPROTO_IGMP ? "IGMP" : 257*10e6dadfSbrendan I->ipha_protocol == IPPROTO_EGP ? "EGP" : 258*10e6dadfSbrendan I->ipha_protocol == IPPROTO_IPV6 ? "IPv6" : 259*10e6dadfSbrendan I->ipha_protocol == IPPROTO_ROUTING ? "ROUTE" : 260*10e6dadfSbrendan I->ipha_protocol == IPPROTO_ESP ? "ESP" : 261*10e6dadfSbrendan I->ipha_protocol == IPPROTO_AH ? "AH" : 262*10e6dadfSbrendan I->ipha_protocol == IPPROTO_ICMPV6 ? "ICMPv6" : 263*10e6dadfSbrendan I->ipha_protocol == IPPROTO_OSPF ? "OSPF" : 264*10e6dadfSbrendan I->ipha_protocol == IPPROTO_SCTP ? "SCTP" : 265*10e6dadfSbrendan I->ipha_protocol == IPPROTO_RAW ? "RAW" : 266*10e6dadfSbrendan lltostr((uint64_t)I->ipha_protocol); 267*10e6dadfSbrendan ipv4_checksum = I != NULL ? ntohs(I->ipha_hdr_checksum) : 0; 268*10e6dadfSbrendan ipv4_src = I != NULL ? I->ipha_src : 0; 269*10e6dadfSbrendan ipv4_dst = I != NULL ? I->ipha_dst : 0; 270*10e6dadfSbrendan ipv4_saddr = I != NULL ? inet_ntoa(&I->ipha_src) : "<null>"; 271*10e6dadfSbrendan ipv4_daddr = I != NULL ? inet_ntoa(&I->ipha_dst) : "<null>"; 272*10e6dadfSbrendan ipv4_hdr = I; 273*10e6dadfSbrendan}; 274*10e6dadfSbrendan 275*10e6dadfSbrendan#pragma D binding "1.0" translator 276*10e6dadfSbrendantranslator ipv6info_t < ip6_t *I > { 277*10e6dadfSbrendan ipv6_ver = I != NULL ? I->ip6_ctlun.ip6_un2_vfc >> 4 : 0; 278*10e6dadfSbrendan ipv6_tclass = I != NULL ? ((I->ip6_ctlun.ip6_un1.ip6_un1_flow && 279*10e6dadfSbrendan 0x0fffffff) >> 20) : 0; 280*10e6dadfSbrendan ipv6_flow = I != NULL ? I->ip6_ctlun.ip6_un1.ip6_un1_flow && 281*10e6dadfSbrendan 0x000fffff : 0; 282*10e6dadfSbrendan ipv6_plen = I != NULL ? ntohs(I->ip6_ctlun.ip6_un1.ip6_un1_plen) : 0; 283*10e6dadfSbrendan ipv6_nexthdr = I != NULL ? I->ip6_ctlun.ip6_un1.ip6_un1_nxt : 0; 284*10e6dadfSbrendan ipv6_nextstr = I == NULL ? "<null>" : 285*10e6dadfSbrendan I->ip6_ctlun.ip6_un1.ip6_un1_nxt == IPPROTO_TCP ? "TCP" : 286*10e6dadfSbrendan I->ip6_ctlun.ip6_un1.ip6_un1_nxt == IPPROTO_UDP ? "UDP" : 287*10e6dadfSbrendan I->ip6_ctlun.ip6_un1.ip6_un1_nxt == IPPROTO_IP ? "IP" : 288*10e6dadfSbrendan I->ip6_ctlun.ip6_un1.ip6_un1_nxt == IPPROTO_ICMP ? "ICMP" : 289*10e6dadfSbrendan I->ip6_ctlun.ip6_un1.ip6_un1_nxt == IPPROTO_IGMP ? "IGMP" : 290*10e6dadfSbrendan I->ip6_ctlun.ip6_un1.ip6_un1_nxt == IPPROTO_EGP ? "EGP" : 291*10e6dadfSbrendan I->ip6_ctlun.ip6_un1.ip6_un1_nxt == IPPROTO_IPV6 ? "IPv6" : 292*10e6dadfSbrendan I->ip6_ctlun.ip6_un1.ip6_un1_nxt == IPPROTO_ROUTING ? "ROUTE" : 293*10e6dadfSbrendan I->ip6_ctlun.ip6_un1.ip6_un1_nxt == IPPROTO_ESP ? "ESP" : 294*10e6dadfSbrendan I->ip6_ctlun.ip6_un1.ip6_un1_nxt == IPPROTO_AH ? "AH" : 295*10e6dadfSbrendan I->ip6_ctlun.ip6_un1.ip6_un1_nxt == IPPROTO_ICMPV6 ? "ICMPv6" : 296*10e6dadfSbrendan I->ip6_ctlun.ip6_un1.ip6_un1_nxt == IPPROTO_OSPF ? "OSPF" : 297*10e6dadfSbrendan I->ip6_ctlun.ip6_un1.ip6_un1_nxt == IPPROTO_SCTP ? "SCTP" : 298*10e6dadfSbrendan I->ip6_ctlun.ip6_un1.ip6_un1_nxt == IPPROTO_RAW ? "RAW" : 299*10e6dadfSbrendan lltostr((uint64_t)I->ip6_ctlun.ip6_un1.ip6_un1_nxt); 300*10e6dadfSbrendan ipv6_hlim = I != NULL ? I->ip6_ctlun.ip6_un1.ip6_un1_hlim : 0; 301*10e6dadfSbrendan ipv6_src = I != NULL ? &I->ip6_src : 0; 302*10e6dadfSbrendan ipv6_dst = I != NULL ? &I->ip6_dst : 0; 303*10e6dadfSbrendan ipv6_saddr = I != NULL ? inet_ntoa6(&I->ip6_src) : "<null>"; 304*10e6dadfSbrendan ipv6_daddr = I != NULL ? inet_ntoa6(&I->ip6_dst) : "<null>"; 305*10e6dadfSbrendan ipv6_hdr = I; 306*10e6dadfSbrendan}; 307