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/* 22*58dbc507SJonathan Haslam * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 234edabff4Sbrendan * Use is subject to license terms. 244edabff4Sbrendan */ 254edabff4Sbrendan 2610e6dadfSbrendan#pragma D depends_on module ip 2710e6dadfSbrendan#pragma D depends_on provider ip 2810e6dadfSbrendan 2910e6dadfSbrendaninline int IPH_DF = @IPH_DF@; 30*58dbc507SJonathan Haslam#pragma D binding "1.5" IPH_DF 3110e6dadfSbrendaninline int IPH_MF = @IPH_MF@; 32*58dbc507SJonathan Haslam#pragma D binding "1.5" IPH_MF 3310e6dadfSbrendan 34*58dbc507SJonathan Haslam#pragma D binding "1.5" IPPROTO_IP 3510e6dadfSbrendaninline int IPPROTO_IP = @IPPROTO_IP@; 36*58dbc507SJonathan Haslam#pragma D binding "1.5" IPPROTO_HOPOPTS 3710e6dadfSbrendaninline int IPPROTO_HOPOPTS = @IPPROTO_HOPOPTS@; 38*58dbc507SJonathan Haslam#pragma D binding "1.5" IPPROTO_ICMP 3910e6dadfSbrendaninline int IPPROTO_ICMP = @IPPROTO_ICMP@; 40*58dbc507SJonathan Haslam#pragma D binding "1.5" IPPROTO_IGMP 4110e6dadfSbrendaninline int IPPROTO_IGMP = @IPPROTO_IGMP@; 42*58dbc507SJonathan Haslam#pragma D binding "1.5" IPPROTO_GGP 4310e6dadfSbrendaninline int IPPROTO_GGP = @IPPROTO_GGP@; 44*58dbc507SJonathan Haslam#pragma D binding "1.5" IPPROTO_ENCAP 4510e6dadfSbrendaninline int IPPROTO_ENCAP = @IPPROTO_ENCAP@; 46*58dbc507SJonathan Haslam#pragma D binding "1.5" IPPROTO_TCP 4710e6dadfSbrendaninline int IPPROTO_TCP = @IPPROTO_TCP@; 48*58dbc507SJonathan Haslam#pragma D binding "1.5" IPPROTO_EGP 4910e6dadfSbrendaninline int IPPROTO_EGP = @IPPROTO_EGP@; 50*58dbc507SJonathan Haslam#pragma D binding "1.5" IPPROTO_PUP 5110e6dadfSbrendaninline int IPPROTO_PUP = @IPPROTO_PUP@; 52*58dbc507SJonathan Haslam#pragma D binding "1.5" IPPROTO_UDP 5310e6dadfSbrendaninline int IPPROTO_UDP = @IPPROTO_UDP@; 54*58dbc507SJonathan Haslam#pragma D binding "1.5" IPPROTO_IDP 5510e6dadfSbrendaninline int IPPROTO_IDP = @IPPROTO_IDP@; 56*58dbc507SJonathan Haslam#pragma D binding "1.5" IPPROTO_IPV6 5710e6dadfSbrendaninline int IPPROTO_IPV6 = @IPPROTO_IPV6@; 58*58dbc507SJonathan Haslam#pragma D binding "1.5" IPPROTO_ROUTING 5910e6dadfSbrendaninline int IPPROTO_ROUTING = @IPPROTO_ROUTING@; 60*58dbc507SJonathan Haslam#pragma D binding "1.5" IPPROTO_FRAGMENT 6110e6dadfSbrendaninline int IPPROTO_FRAGMENT = @IPPROTO_FRAGMENT@; 62*58dbc507SJonathan Haslam#pragma D binding "1.5" IPPROTO_RSVP 6310e6dadfSbrendaninline int IPPROTO_RSVP = @IPPROTO_RSVP@; 64*58dbc507SJonathan Haslam#pragma D binding "1.5" IPPROTO_ESP 6510e6dadfSbrendaninline int IPPROTO_ESP = @IPPROTO_ESP@; 66*58dbc507SJonathan Haslam#pragma D binding "1.5" IPPROTO_AH 6710e6dadfSbrendaninline int IPPROTO_AH = @IPPROTO_AH@; 68*58dbc507SJonathan Haslam#pragma D binding "1.5" IPPROTO_ICMPV6 6910e6dadfSbrendaninline int IPPROTO_ICMPV6 = @IPPROTO_ICMPV6@; 70*58dbc507SJonathan Haslam#pragma D binding "1.5" IPPROTO_NONE 7110e6dadfSbrendaninline int IPPROTO_NONE = @IPPROTO_NONE@; 72*58dbc507SJonathan Haslam#pragma D binding "1.5" IPPROTO_DSTOPTS 7310e6dadfSbrendaninline int IPPROTO_DSTOPTS = @IPPROTO_DSTOPTS@; 74*58dbc507SJonathan Haslam#pragma D binding "1.5" IPPROTO_HELLO 7510e6dadfSbrendaninline int IPPROTO_HELLO = @IPPROTO_HELLO@; 76*58dbc507SJonathan Haslam#pragma D binding "1.5" IPPROTO_ND 7710e6dadfSbrendaninline int IPPROTO_ND = @IPPROTO_ND@; 78*58dbc507SJonathan Haslam#pragma D binding "1.5" IPPROTO_EON 7910e6dadfSbrendaninline int IPPROTO_EON = @IPPROTO_EON@; 80*58dbc507SJonathan Haslam#pragma D binding "1.5" IPPROTO_OSPF 8110e6dadfSbrendaninline int IPPROTO_OSPF = @IPPROTO_OSPF@; 82*58dbc507SJonathan Haslam#pragma D binding "1.5" IPPROTO_PIM 8310e6dadfSbrendaninline int IPPROTO_PIM = @IPPROTO_PIM@; 84*58dbc507SJonathan Haslam#pragma D binding "1.5" IPPROTO_SCTP 8510e6dadfSbrendaninline int IPPROTO_SCTP = @IPPROTO_SCTP@; 86*58dbc507SJonathan Haslam#pragma D binding "1.5" IPPROTO_RAW 8710e6dadfSbrendaninline int IPPROTO_RAW = @IPPROTO_RAW@; 88*58dbc507SJonathan Haslam#pragma D binding "1.5" IPPROTO_MAX 8910e6dadfSbrendaninline int IPPROTO_MAX = @IPPROTO_MAX@; 9010e6dadfSbrendan 9110e6dadfSbrendan/* 9210e6dadfSbrendan * pktinfo is where packet ID info can be made available for deeper 9310e6dadfSbrendan * analysis if packet IDs become supported by the kernel in the future. 9410e6dadfSbrendan * The pkt_addr member is currently always NULL. 9510e6dadfSbrendan */ 9610e6dadfSbrendantypedef struct pktinfo { 9710e6dadfSbrendan uintptr_t pkt_addr; 9810e6dadfSbrendan} pktinfo_t; 9910e6dadfSbrendan 10010e6dadfSbrendan/* 10110e6dadfSbrendan * csinfo is where connection state info can be made available if 10210e6dadfSbrendan * connection IDs become supported by the kernel in the future. 10310e6dadfSbrendan * The cs_addr member is currently always NULL. 10410e6dadfSbrendan */ 10510e6dadfSbrendantypedef struct csinfo { 10610e6dadfSbrendan uintptr_t cs_addr; 10710e6dadfSbrendan} csinfo_t; 10810e6dadfSbrendan 10910e6dadfSbrendan/* 11010e6dadfSbrendan * ipinfo contains common IP info for both IPv4 and IPv6. 11110e6dadfSbrendan */ 11210e6dadfSbrendantypedef struct ipinfo { 11310e6dadfSbrendan uint8_t ip_ver; /* IP version (4, 6) */ 11410e6dadfSbrendan uint32_t ip_plength; /* payload length */ 11510e6dadfSbrendan string ip_saddr; /* source address */ 11610e6dadfSbrendan string ip_daddr; /* destination address */ 11710e6dadfSbrendan} ipinfo_t; 11810e6dadfSbrendan 11910e6dadfSbrendan/* 12010e6dadfSbrendan * ifinfo contains network interface info. 12110e6dadfSbrendan */ 12210e6dadfSbrendantypedef struct ifinfo { 12310e6dadfSbrendan string if_name; /* interface name */ 12410e6dadfSbrendan int8_t if_local; /* is delivered locally */ 12510e6dadfSbrendan netstackid_t if_ipstack; /* ipstack ID */ 12610e6dadfSbrendan uintptr_t if_addr; /* pointer to raw ill_t */ 12710e6dadfSbrendan} ifinfo_t; 12810e6dadfSbrendan 12910e6dadfSbrendan/* 13010e6dadfSbrendan * ipv4info is a translated version of the IPv4 header (with raw pointer). 13110e6dadfSbrendan * These values are NULL if the packet is not IPv4. 13210e6dadfSbrendan */ 13310e6dadfSbrendantypedef struct ipv4info { 13410e6dadfSbrendan uint8_t ipv4_ver; /* IP version (4) */ 13510e6dadfSbrendan uint8_t ipv4_ihl; /* header length, bytes */ 13610e6dadfSbrendan uint8_t ipv4_tos; /* type of service field */ 13710e6dadfSbrendan uint16_t ipv4_length; /* length (header + payload) */ 13810e6dadfSbrendan uint16_t ipv4_ident; /* identification */ 13910e6dadfSbrendan uint8_t ipv4_flags; /* IP flags */ 14010e6dadfSbrendan uint16_t ipv4_offset; /* fragment offset */ 14110e6dadfSbrendan uint8_t ipv4_ttl; /* time to live */ 14210e6dadfSbrendan uint8_t ipv4_protocol; /* next level protocol */ 14310e6dadfSbrendan string ipv4_protostr; /* next level protocol, as a string */ 14410e6dadfSbrendan uint16_t ipv4_checksum; /* header checksum */ 14510e6dadfSbrendan ipaddr_t ipv4_src; /* source address */ 14610e6dadfSbrendan ipaddr_t ipv4_dst; /* destination address */ 14710e6dadfSbrendan string ipv4_saddr; /* source address, string */ 14810e6dadfSbrendan string ipv4_daddr; /* destination address, string */ 14910e6dadfSbrendan ipha_t *ipv4_hdr; /* pointer to raw header */ 15010e6dadfSbrendan} ipv4info_t; 15110e6dadfSbrendan 15210e6dadfSbrendan/* 15310e6dadfSbrendan * ipv6info is a translated version of the IPv6 header (with raw pointer). 15410e6dadfSbrendan * These values are NULL if the packet is not IPv6. 15510e6dadfSbrendan */ 15610e6dadfSbrendantypedef struct ipv6info { 15710e6dadfSbrendan uint8_t ipv6_ver; /* IP version (6) */ 15810e6dadfSbrendan uint8_t ipv6_tclass; /* traffic class */ 15910e6dadfSbrendan uint32_t ipv6_flow; /* flow label */ 16010e6dadfSbrendan uint16_t ipv6_plen; /* payload length */ 16110e6dadfSbrendan uint8_t ipv6_nexthdr; /* next header protocol */ 16210e6dadfSbrendan string ipv6_nextstr; /* next header protocol, as a string */ 16310e6dadfSbrendan uint8_t ipv6_hlim; /* hop limit */ 16410e6dadfSbrendan in6_addr_t *ipv6_src; /* source address */ 16510e6dadfSbrendan in6_addr_t *ipv6_dst; /* destination address */ 16610e6dadfSbrendan string ipv6_saddr; /* source address, string */ 16710e6dadfSbrendan string ipv6_daddr; /* destination address, string */ 16810e6dadfSbrendan ip6_t *ipv6_hdr; /* pointer to raw header */ 16910e6dadfSbrendan} ipv6info_t; 17010e6dadfSbrendan 17110e6dadfSbrendan/* 17210e6dadfSbrendan * void_ip_t is a void pointer to either an IPv4 or IPv6 header. It has 17310e6dadfSbrendan * its own type name so that a translator can be determined. 17410e6dadfSbrendan */ 17510e6dadfSbrendantypedef uintptr_t void_ip_t; 17610e6dadfSbrendan 17710e6dadfSbrendan/* 17810e6dadfSbrendan * __dtrace_ipsr_ill_t is used by the translator to take an ill_t plus an 17910e6dadfSbrendan * additional arg6 from the ip:::send and ip:::recieve probes, and translate 18010e6dadfSbrendan * them to an ifinfo_t. 18110e6dadfSbrendan */ 18210e6dadfSbrendantypedef ill_t __dtrace_ipsr_ill_t; 18310e6dadfSbrendan 184*58dbc507SJonathan Haslam#pragma D binding "1.5" translator 18510e6dadfSbrendantranslator pktinfo_t < mblk_t *M > { 18610e6dadfSbrendan pkt_addr = NULL; 18710e6dadfSbrendan}; 18810e6dadfSbrendan 189*58dbc507SJonathan Haslam#pragma D binding "1.5" translator 19010e6dadfSbrendantranslator csinfo_t < conn_t *C > { 19110e6dadfSbrendan cs_addr = NULL; 19210e6dadfSbrendan}; 19310e6dadfSbrendan 194*58dbc507SJonathan Haslam#pragma D binding "1.5" translator 19510e6dadfSbrendantranslator ipinfo_t < ipha_t *I > { 19610e6dadfSbrendan ip_ver = I->ipha_version_and_hdr_length >> 4; 19710e6dadfSbrendan ip_plength = ntohs(I->ipha_length) - 19810e6dadfSbrendan ((I->ipha_version_and_hdr_length & 0xf) << 2); 19910e6dadfSbrendan ip_saddr = inet_ntoa(&I->ipha_src); 20010e6dadfSbrendan ip_daddr = inet_ntoa(&I->ipha_dst); 20110e6dadfSbrendan}; 20210e6dadfSbrendan 203*58dbc507SJonathan Haslam#pragma D binding "1.5" translator 20410e6dadfSbrendantranslator ipinfo_t < ip6_t *I > { 20510e6dadfSbrendan ip_ver = *(uint8_t *)I >> 4; 20610e6dadfSbrendan ip_plength = ntohs(I->ip6_ctlun.ip6_un1.ip6_un1_plen); 20710e6dadfSbrendan ip_saddr = inet_ntoa6(&I->ip6_src); 20810e6dadfSbrendan ip_daddr = inet_ntoa6(&I->ip6_dst); 20910e6dadfSbrendan}; 21010e6dadfSbrendan 211*58dbc507SJonathan Haslam#pragma D binding "1.5" translator 21210e6dadfSbrendantranslator ipinfo_t < void_ip_t *I > { 21310e6dadfSbrendan ip_ver = I != NULL ? *(uint8_t *)I >> 4 : 0; 21410e6dadfSbrendan ip_plength = I != NULL ? (*(uint8_t *)I >> 4 == 4 ? 21510e6dadfSbrendan ntohs(((ipha_t *)I)->ipha_length) - 21610e6dadfSbrendan ((((ipha_t *)I)->ipha_version_and_hdr_length & 0xf) << 2) : 21710e6dadfSbrendan *(uint8_t *)I >> 4 == 6 ? 21810e6dadfSbrendan ntohs(((ip6_t *)I)->ip6_ctlun.ip6_un1.ip6_un1_plen) : 0) : 0; 21910e6dadfSbrendan ip_saddr = I != NULL ? (*(uint8_t *)I >> 4 == 4 ? 22010e6dadfSbrendan inet_ntoa(&((ipha_t *)I)->ipha_src) : *(uint8_t *)I >> 4 == 6 ? 22110e6dadfSbrendan inet_ntoa6(&((ip6_t *)I)->ip6_src) : "<unknown>") : "<unknown>"; 22210e6dadfSbrendan ip_daddr = I != NULL ? (*(uint8_t *)I >> 4 == 4 ? 22310e6dadfSbrendan inet_ntoa(&((ipha_t *)I)->ipha_dst) : *(uint8_t *)I >> 4 == 6 ? 22410e6dadfSbrendan inet_ntoa6(&((ip6_t *)I)->ip6_dst) : "<unknown>") : "<unknown>"; 22510e6dadfSbrendan}; 22610e6dadfSbrendan 227*58dbc507SJonathan Haslam#pragma D binding "1.5" translator 22810e6dadfSbrendantranslator ifinfo_t < __dtrace_ipsr_ill_t *I > { 22910e6dadfSbrendan if_name = I != NULL ? stringof(I->ill_name) : "<null>"; 23010e6dadfSbrendan if_ipstack = I != NULL ? I->ill_ipst->ips_netstack->netstack_stackid 23110e6dadfSbrendan : 0; 23210e6dadfSbrendan if_local = arg6; /* probe dependent */ 23310e6dadfSbrendan if_addr = (uintptr_t)I; 23410e6dadfSbrendan}; 23510e6dadfSbrendan 236*58dbc507SJonathan Haslam#pragma D binding "1.5" translator 23710e6dadfSbrendantranslator ipv4info_t < ipha_t *I > { 23810e6dadfSbrendan ipv4_ver = I != NULL ? I->ipha_version_and_hdr_length >> 4 : 0; 23910e6dadfSbrendan ipv4_ihl = I != NULL ? (I->ipha_version_and_hdr_length & 0xf) << 2 : 0; 24010e6dadfSbrendan ipv4_tos = I != NULL ? I->ipha_type_of_service : 0; 24110e6dadfSbrendan ipv4_length = I != NULL ? ntohs(I->ipha_length) : 0; 24210e6dadfSbrendan ipv4_ident = I != NULL ? ntohs(I->ipha_ident) : 0; 24310e6dadfSbrendan ipv4_flags = I != NULL ? ntohs(I->ipha_fragment_offset_and_flags) >> 24410e6dadfSbrendan 12 : 0; 24510e6dadfSbrendan ipv4_offset = I != NULL ? ntohs(I->ipha_fragment_offset_and_flags) & 24610e6dadfSbrendan 0x0fff : 0; 24710e6dadfSbrendan ipv4_ttl = I != NULL ? I->ipha_ttl : 0; 24810e6dadfSbrendan ipv4_protocol = I != NULL ? I->ipha_protocol : 0; 24910e6dadfSbrendan ipv4_protostr = I == NULL ? "<null>" : 25010e6dadfSbrendan I->ipha_protocol == IPPROTO_TCP ? "TCP" : 25110e6dadfSbrendan I->ipha_protocol == IPPROTO_UDP ? "UDP" : 25210e6dadfSbrendan I->ipha_protocol == IPPROTO_IP ? "IP" : 25310e6dadfSbrendan I->ipha_protocol == IPPROTO_ICMP ? "ICMP" : 25410e6dadfSbrendan I->ipha_protocol == IPPROTO_IGMP ? "IGMP" : 25510e6dadfSbrendan I->ipha_protocol == IPPROTO_EGP ? "EGP" : 25610e6dadfSbrendan I->ipha_protocol == IPPROTO_IPV6 ? "IPv6" : 25710e6dadfSbrendan I->ipha_protocol == IPPROTO_ROUTING ? "ROUTE" : 25810e6dadfSbrendan I->ipha_protocol == IPPROTO_ESP ? "ESP" : 25910e6dadfSbrendan I->ipha_protocol == IPPROTO_AH ? "AH" : 26010e6dadfSbrendan I->ipha_protocol == IPPROTO_ICMPV6 ? "ICMPv6" : 26110e6dadfSbrendan I->ipha_protocol == IPPROTO_OSPF ? "OSPF" : 26210e6dadfSbrendan I->ipha_protocol == IPPROTO_SCTP ? "SCTP" : 26310e6dadfSbrendan I->ipha_protocol == IPPROTO_RAW ? "RAW" : 26410e6dadfSbrendan lltostr((uint64_t)I->ipha_protocol); 26510e6dadfSbrendan ipv4_checksum = I != NULL ? ntohs(I->ipha_hdr_checksum) : 0; 26610e6dadfSbrendan ipv4_src = I != NULL ? I->ipha_src : 0; 26710e6dadfSbrendan ipv4_dst = I != NULL ? I->ipha_dst : 0; 26810e6dadfSbrendan ipv4_saddr = I != NULL ? inet_ntoa(&I->ipha_src) : "<null>"; 26910e6dadfSbrendan ipv4_daddr = I != NULL ? inet_ntoa(&I->ipha_dst) : "<null>"; 27010e6dadfSbrendan ipv4_hdr = I; 27110e6dadfSbrendan}; 27210e6dadfSbrendan 273*58dbc507SJonathan Haslam#pragma D binding "1.5" translator 27410e6dadfSbrendantranslator ipv6info_t < ip6_t *I > { 27510e6dadfSbrendan ipv6_ver = I != NULL ? I->ip6_ctlun.ip6_un2_vfc >> 4 : 0; 27610e6dadfSbrendan ipv6_tclass = I != NULL ? ((I->ip6_ctlun.ip6_un1.ip6_un1_flow && 27710e6dadfSbrendan 0x0fffffff) >> 20) : 0; 27810e6dadfSbrendan ipv6_flow = I != NULL ? I->ip6_ctlun.ip6_un1.ip6_un1_flow && 27910e6dadfSbrendan 0x000fffff : 0; 28010e6dadfSbrendan ipv6_plen = I != NULL ? ntohs(I->ip6_ctlun.ip6_un1.ip6_un1_plen) : 0; 28110e6dadfSbrendan ipv6_nexthdr = I != NULL ? I->ip6_ctlun.ip6_un1.ip6_un1_nxt : 0; 28210e6dadfSbrendan ipv6_nextstr = I == NULL ? "<null>" : 28310e6dadfSbrendan I->ip6_ctlun.ip6_un1.ip6_un1_nxt == IPPROTO_TCP ? "TCP" : 28410e6dadfSbrendan I->ip6_ctlun.ip6_un1.ip6_un1_nxt == IPPROTO_UDP ? "UDP" : 28510e6dadfSbrendan I->ip6_ctlun.ip6_un1.ip6_un1_nxt == IPPROTO_IP ? "IP" : 28610e6dadfSbrendan I->ip6_ctlun.ip6_un1.ip6_un1_nxt == IPPROTO_ICMP ? "ICMP" : 28710e6dadfSbrendan I->ip6_ctlun.ip6_un1.ip6_un1_nxt == IPPROTO_IGMP ? "IGMP" : 28810e6dadfSbrendan I->ip6_ctlun.ip6_un1.ip6_un1_nxt == IPPROTO_EGP ? "EGP" : 28910e6dadfSbrendan I->ip6_ctlun.ip6_un1.ip6_un1_nxt == IPPROTO_IPV6 ? "IPv6" : 29010e6dadfSbrendan I->ip6_ctlun.ip6_un1.ip6_un1_nxt == IPPROTO_ROUTING ? "ROUTE" : 29110e6dadfSbrendan I->ip6_ctlun.ip6_un1.ip6_un1_nxt == IPPROTO_ESP ? "ESP" : 29210e6dadfSbrendan I->ip6_ctlun.ip6_un1.ip6_un1_nxt == IPPROTO_AH ? "AH" : 29310e6dadfSbrendan I->ip6_ctlun.ip6_un1.ip6_un1_nxt == IPPROTO_ICMPV6 ? "ICMPv6" : 29410e6dadfSbrendan I->ip6_ctlun.ip6_un1.ip6_un1_nxt == IPPROTO_OSPF ? "OSPF" : 29510e6dadfSbrendan I->ip6_ctlun.ip6_un1.ip6_un1_nxt == IPPROTO_SCTP ? "SCTP" : 29610e6dadfSbrendan I->ip6_ctlun.ip6_un1.ip6_un1_nxt == IPPROTO_RAW ? "RAW" : 29710e6dadfSbrendan lltostr((uint64_t)I->ip6_ctlun.ip6_un1.ip6_un1_nxt); 29810e6dadfSbrendan ipv6_hlim = I != NULL ? I->ip6_ctlun.ip6_un1.ip6_un1_hlim : 0; 29910e6dadfSbrendan ipv6_src = I != NULL ? &I->ip6_src : 0; 30010e6dadfSbrendan ipv6_dst = I != NULL ? &I->ip6_dst : 0; 30110e6dadfSbrendan ipv6_saddr = I != NULL ? inet_ntoa6(&I->ip6_src) : "<null>"; 30210e6dadfSbrendan ipv6_daddr = I != NULL ? inet_ntoa6(&I->ip6_dst) : "<null>"; 30310e6dadfSbrendan ipv6_hdr = I; 30410e6dadfSbrendan}; 305