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*9cd928feSAlan Maguire * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. 234edabff4Sbrendan */ 244edabff4Sbrendan 2510e6dadfSbrendan#pragma D depends_on module ip 2610e6dadfSbrendan#pragma D depends_on provider ip 2710e6dadfSbrendan 2810e6dadfSbrendaninline int IPH_DF = @IPH_DF@; 2958dbc507SJonathan Haslam#pragma D binding "1.5" IPH_DF 3010e6dadfSbrendaninline int IPH_MF = @IPH_MF@; 3158dbc507SJonathan Haslam#pragma D binding "1.5" IPH_MF 3210e6dadfSbrendan 3358dbc507SJonathan Haslam#pragma D binding "1.5" IPPROTO_IP 3410e6dadfSbrendaninline int IPPROTO_IP = @IPPROTO_IP@; 3558dbc507SJonathan Haslam#pragma D binding "1.5" IPPROTO_HOPOPTS 3610e6dadfSbrendaninline int IPPROTO_HOPOPTS = @IPPROTO_HOPOPTS@; 3758dbc507SJonathan Haslam#pragma D binding "1.5" IPPROTO_ICMP 3810e6dadfSbrendaninline int IPPROTO_ICMP = @IPPROTO_ICMP@; 3958dbc507SJonathan Haslam#pragma D binding "1.5" IPPROTO_IGMP 4010e6dadfSbrendaninline int IPPROTO_IGMP = @IPPROTO_IGMP@; 4158dbc507SJonathan Haslam#pragma D binding "1.5" IPPROTO_GGP 4210e6dadfSbrendaninline int IPPROTO_GGP = @IPPROTO_GGP@; 4358dbc507SJonathan Haslam#pragma D binding "1.5" IPPROTO_ENCAP 4410e6dadfSbrendaninline int IPPROTO_ENCAP = @IPPROTO_ENCAP@; 4558dbc507SJonathan Haslam#pragma D binding "1.5" IPPROTO_TCP 4610e6dadfSbrendaninline int IPPROTO_TCP = @IPPROTO_TCP@; 4758dbc507SJonathan Haslam#pragma D binding "1.5" IPPROTO_EGP 4810e6dadfSbrendaninline int IPPROTO_EGP = @IPPROTO_EGP@; 4958dbc507SJonathan Haslam#pragma D binding "1.5" IPPROTO_PUP 5010e6dadfSbrendaninline int IPPROTO_PUP = @IPPROTO_PUP@; 5158dbc507SJonathan Haslam#pragma D binding "1.5" IPPROTO_UDP 5210e6dadfSbrendaninline int IPPROTO_UDP = @IPPROTO_UDP@; 5358dbc507SJonathan Haslam#pragma D binding "1.5" IPPROTO_IDP 5410e6dadfSbrendaninline int IPPROTO_IDP = @IPPROTO_IDP@; 5558dbc507SJonathan Haslam#pragma D binding "1.5" IPPROTO_IPV6 5610e6dadfSbrendaninline int IPPROTO_IPV6 = @IPPROTO_IPV6@; 5758dbc507SJonathan Haslam#pragma D binding "1.5" IPPROTO_ROUTING 5810e6dadfSbrendaninline int IPPROTO_ROUTING = @IPPROTO_ROUTING@; 5958dbc507SJonathan Haslam#pragma D binding "1.5" IPPROTO_FRAGMENT 6010e6dadfSbrendaninline int IPPROTO_FRAGMENT = @IPPROTO_FRAGMENT@; 6158dbc507SJonathan Haslam#pragma D binding "1.5" IPPROTO_RSVP 6210e6dadfSbrendaninline int IPPROTO_RSVP = @IPPROTO_RSVP@; 6358dbc507SJonathan Haslam#pragma D binding "1.5" IPPROTO_ESP 6410e6dadfSbrendaninline int IPPROTO_ESP = @IPPROTO_ESP@; 6558dbc507SJonathan Haslam#pragma D binding "1.5" IPPROTO_AH 6610e6dadfSbrendaninline int IPPROTO_AH = @IPPROTO_AH@; 6758dbc507SJonathan Haslam#pragma D binding "1.5" IPPROTO_ICMPV6 6810e6dadfSbrendaninline int IPPROTO_ICMPV6 = @IPPROTO_ICMPV6@; 6958dbc507SJonathan Haslam#pragma D binding "1.5" IPPROTO_NONE 7010e6dadfSbrendaninline int IPPROTO_NONE = @IPPROTO_NONE@; 7158dbc507SJonathan Haslam#pragma D binding "1.5" IPPROTO_DSTOPTS 7210e6dadfSbrendaninline int IPPROTO_DSTOPTS = @IPPROTO_DSTOPTS@; 7358dbc507SJonathan Haslam#pragma D binding "1.5" IPPROTO_HELLO 7410e6dadfSbrendaninline int IPPROTO_HELLO = @IPPROTO_HELLO@; 7558dbc507SJonathan Haslam#pragma D binding "1.5" IPPROTO_ND 7610e6dadfSbrendaninline int IPPROTO_ND = @IPPROTO_ND@; 7758dbc507SJonathan Haslam#pragma D binding "1.5" IPPROTO_EON 7810e6dadfSbrendaninline int IPPROTO_EON = @IPPROTO_EON@; 7958dbc507SJonathan Haslam#pragma D binding "1.5" IPPROTO_OSPF 8010e6dadfSbrendaninline int IPPROTO_OSPF = @IPPROTO_OSPF@; 8158dbc507SJonathan Haslam#pragma D binding "1.5" IPPROTO_PIM 8210e6dadfSbrendaninline int IPPROTO_PIM = @IPPROTO_PIM@; 8358dbc507SJonathan Haslam#pragma D binding "1.5" IPPROTO_SCTP 8410e6dadfSbrendaninline int IPPROTO_SCTP = @IPPROTO_SCTP@; 8558dbc507SJonathan Haslam#pragma D binding "1.5" IPPROTO_RAW 8610e6dadfSbrendaninline int IPPROTO_RAW = @IPPROTO_RAW@; 8758dbc507SJonathan Haslam#pragma D binding "1.5" IPPROTO_MAX 8810e6dadfSbrendaninline int IPPROTO_MAX = @IPPROTO_MAX@; 8910e6dadfSbrendan 9010e6dadfSbrendan/* 9110e6dadfSbrendan * pktinfo is where packet ID info can be made available for deeper 9210e6dadfSbrendan * analysis if packet IDs become supported by the kernel in the future. 9310e6dadfSbrendan * The pkt_addr member is currently always NULL. 9410e6dadfSbrendan */ 9510e6dadfSbrendantypedef struct pktinfo { 9610e6dadfSbrendan uintptr_t pkt_addr; 9710e6dadfSbrendan} pktinfo_t; 9810e6dadfSbrendan 9910e6dadfSbrendan/* 100*9cd928feSAlan Maguire * csinfo is where connection state info is made available. 10110e6dadfSbrendan */ 10210e6dadfSbrendantypedef struct csinfo { 10310e6dadfSbrendan uintptr_t cs_addr; 104*9cd928feSAlan Maguire uint64_t cs_cid; 105*9cd928feSAlan Maguire pid_t cs_pid; 106*9cd928feSAlan Maguire zoneid_t cs_zoneid; 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*9cd928feSAlan Maguire/* 185*9cd928feSAlan Maguire * __dtrace_tcp_void_ip_t is used by the translator to take either the 186*9cd928feSAlan Maguire * non-NULL void_ip_t * passed in or, if it is NULL, uses arg3 (tcp_t *) 187*9cd928feSAlan Maguire * from the tcp:::send and tcp:::recieve probes to translate to an ipinfo_t. 188*9cd928feSAlan Maguire * When no headers are available in the TCP fusion case for tcp:::send 189*9cd928feSAlan Maguire * and tcp:::receive case, this allows us to present the consumer with header 190*9cd928feSAlan Maguire * data based on the tcp_t * content in order to hide the implementation 191*9cd928feSAlan Maguire * details of TCP fusion. 192*9cd928feSAlan Maguire */ 193*9cd928feSAlan Maguiretypedef void * __dtrace_tcp_void_ip_t; 194*9cd928feSAlan Maguire 19558dbc507SJonathan Haslam#pragma D binding "1.5" translator 19610e6dadfSbrendantranslator pktinfo_t < mblk_t *M > { 19710e6dadfSbrendan pkt_addr = NULL; 19810e6dadfSbrendan}; 19910e6dadfSbrendan 20058dbc507SJonathan Haslam#pragma D binding "1.5" translator 20110e6dadfSbrendantranslator csinfo_t < conn_t *C > { 20210e6dadfSbrendan cs_addr = NULL; 20310e6dadfSbrendan}; 20410e6dadfSbrendan 205*9cd928feSAlan Maguire#pragma D binding "1.6.3" translator 206*9cd928feSAlan Maguiretranslator csinfo_t < ip_xmit_attr_t *C > { 207*9cd928feSAlan Maguire cs_addr = (uintptr_t)C; 208*9cd928feSAlan Maguire cs_cid = C ? C->ixa_conn_id : NULL; 209*9cd928feSAlan Maguire cs_pid = C ? C->ixa_cpid : -1; 210*9cd928feSAlan Maguire cs_zoneid = C ? 211*9cd928feSAlan Maguire (C->ixa_ipst == NULL || C->ixa_ipst->ips_netstack == NULL || 212*9cd928feSAlan Maguire C->ixa_ipst->ips_netstack->netstack_stackid == 213*9cd928feSAlan Maguire @GLOBAL_NETSTACKID@ || 214*9cd928feSAlan Maguire C->ixa_cred == NULL || 215*9cd928feSAlan Maguire C->ixa_cred->cr_zone == NULL || 216*9cd928feSAlan Maguire C->ixa_cred->cr_uid == -1 ? 217*9cd928feSAlan Maguire C->ixa_zoneid : C->ixa_cred->cr_zone->zone_id) : -1; 218*9cd928feSAlan Maguire}; 219*9cd928feSAlan Maguire 22058dbc507SJonathan Haslam#pragma D binding "1.5" translator 22110e6dadfSbrendantranslator ipinfo_t < ipha_t *I > { 22210e6dadfSbrendan ip_ver = I->ipha_version_and_hdr_length >> 4; 22310e6dadfSbrendan ip_plength = ntohs(I->ipha_length) - 22410e6dadfSbrendan ((I->ipha_version_and_hdr_length & 0xf) << 2); 22510e6dadfSbrendan ip_saddr = inet_ntoa(&I->ipha_src); 22610e6dadfSbrendan ip_daddr = inet_ntoa(&I->ipha_dst); 22710e6dadfSbrendan}; 22810e6dadfSbrendan 22958dbc507SJonathan Haslam#pragma D binding "1.5" translator 23010e6dadfSbrendantranslator ipinfo_t < ip6_t *I > { 23110e6dadfSbrendan ip_ver = *(uint8_t *)I >> 4; 23210e6dadfSbrendan ip_plength = ntohs(I->ip6_ctlun.ip6_un1.ip6_un1_plen); 23310e6dadfSbrendan ip_saddr = inet_ntoa6(&I->ip6_src); 23410e6dadfSbrendan ip_daddr = inet_ntoa6(&I->ip6_dst); 23510e6dadfSbrendan}; 23610e6dadfSbrendan 23758dbc507SJonathan Haslam#pragma D binding "1.5" translator 23810e6dadfSbrendantranslator ipinfo_t < void_ip_t *I > { 23910e6dadfSbrendan ip_ver = I != NULL ? *(uint8_t *)I >> 4 : 0; 24010e6dadfSbrendan ip_plength = I != NULL ? (*(uint8_t *)I >> 4 == 4 ? 24110e6dadfSbrendan ntohs(((ipha_t *)I)->ipha_length) - 24210e6dadfSbrendan ((((ipha_t *)I)->ipha_version_and_hdr_length & 0xf) << 2) : 24310e6dadfSbrendan *(uint8_t *)I >> 4 == 6 ? 24410e6dadfSbrendan ntohs(((ip6_t *)I)->ip6_ctlun.ip6_un1.ip6_un1_plen) : 0) : 0; 24510e6dadfSbrendan ip_saddr = I != NULL ? (*(uint8_t *)I >> 4 == 4 ? 24610e6dadfSbrendan inet_ntoa(&((ipha_t *)I)->ipha_src) : *(uint8_t *)I >> 4 == 6 ? 24710e6dadfSbrendan inet_ntoa6(&((ip6_t *)I)->ip6_src) : "<unknown>") : "<unknown>"; 24810e6dadfSbrendan ip_daddr = I != NULL ? (*(uint8_t *)I >> 4 == 4 ? 24910e6dadfSbrendan inet_ntoa(&((ipha_t *)I)->ipha_dst) : *(uint8_t *)I >> 4 == 6 ? 25010e6dadfSbrendan inet_ntoa6(&((ip6_t *)I)->ip6_dst) : "<unknown>") : "<unknown>"; 25110e6dadfSbrendan}; 25210e6dadfSbrendan 25358dbc507SJonathan Haslam#pragma D binding "1.5" translator 25410e6dadfSbrendantranslator ifinfo_t < __dtrace_ipsr_ill_t *I > { 25510e6dadfSbrendan if_name = I != NULL ? stringof(I->ill_name) : "<null>"; 25610e6dadfSbrendan if_ipstack = I != NULL ? I->ill_ipst->ips_netstack->netstack_stackid 25710e6dadfSbrendan : 0; 25810e6dadfSbrendan if_local = arg6; /* probe dependent */ 25910e6dadfSbrendan if_addr = (uintptr_t)I; 26010e6dadfSbrendan}; 26110e6dadfSbrendan 262*9cd928feSAlan Maguire/* 263*9cd928feSAlan Maguire * Translate to an ipinfo_t * from either the non-NULL void_ip_t * passed in, 264*9cd928feSAlan Maguire * or use arg3 (tcp_t *) to fabricate ip header info. 265*9cd928feSAlan Maguire */ 266*9cd928feSAlan Maguire#pragma D binding "1.6.3" translator 267*9cd928feSAlan Maguiretranslator ipinfo_t < __dtrace_tcp_void_ip_t *I > { 268*9cd928feSAlan Maguire ip_ver = I != NULL ? *(uint8_t *)I >> 4 : 269*9cd928feSAlan Maguire arg3 != NULL ? ((tcp_t *)arg3)->tcp_connp->conn_ipversion : 0; 270*9cd928feSAlan Maguire ip_plength = 271*9cd928feSAlan Maguire I != NULL && *(uint8_t *)I >> 4 == 4 ? 272*9cd928feSAlan Maguire ntohs(((ipha_t *)I)->ipha_length) - 273*9cd928feSAlan Maguire ((((ipha_t *)I)->ipha_version_and_hdr_length & 0xf) << 2) : 274*9cd928feSAlan Maguire I != NULL && *(uint8_t *)I >> 4 == 6 ? 275*9cd928feSAlan Maguire ntohs(((ip6_t *)I)->ip6_ctlun.ip6_un1.ip6_un1_plen) : 276*9cd928feSAlan Maguire I != NULL ? 0 : 277*9cd928feSAlan Maguire arg3 != NULL && probename == "send" ? 278*9cd928feSAlan Maguire ((tcp_t *)arg3)->tcp_last_sent_len + @TCP_MIN_HEADER_LENGTH@ : 279*9cd928feSAlan Maguire arg3 != NULL && probename == "receive" ? 280*9cd928feSAlan Maguire ((tcp_t *)arg3)->tcp_last_recv_len + @TCP_MIN_HEADER_LENGTH@ : 281*9cd928feSAlan Maguire 0; 282*9cd928feSAlan Maguire ip_saddr = 283*9cd928feSAlan Maguire I != NULL && *(uint8_t *)I >> 4 == 4 ? 284*9cd928feSAlan Maguire inet_ntoa(&((ipha_t *)I)->ipha_src) : 285*9cd928feSAlan Maguire I != NULL && *(uint8_t *)I >> 4 == 6 ? 286*9cd928feSAlan Maguire inet_ntoa6(&((ip6_t *)I)->ip6_src) : 287*9cd928feSAlan Maguire I != NULL ? "<unknown>" : 288*9cd928feSAlan Maguire arg3 != NULL && probename == "send" ? 289*9cd928feSAlan Maguire inet_ntoa6(&((tcp_t *)arg3)->tcp_connp->connua_v6addr.connua_laddr): 290*9cd928feSAlan Maguire arg3 != NULL && probename == "receive" ? 291*9cd928feSAlan Maguire inet_ntoa6(&((tcp_t *)arg3)->tcp_connp->connua_v6addr.connua_faddr): 292*9cd928feSAlan Maguire "<unknown>"; 293*9cd928feSAlan Maguire ip_daddr = 294*9cd928feSAlan Maguire I != NULL && *(uint8_t *)I >> 4 == 4 ? 295*9cd928feSAlan Maguire inet_ntoa(&((ipha_t *)I)->ipha_dst) : 296*9cd928feSAlan Maguire I != NULL && *(uint8_t *)I >> 4 == 6 ? 297*9cd928feSAlan Maguire inet_ntoa6(&((ip6_t *)I)->ip6_dst) : 298*9cd928feSAlan Maguire I != NULL ? "<unknown>" : 299*9cd928feSAlan Maguire arg3 != NULL && probename == "send" ? 300*9cd928feSAlan Maguire inet_ntoa6(&((tcp_t *)arg3)->tcp_connp->connua_v6addr.connua_faddr): 301*9cd928feSAlan Maguire arg3 != NULL && probename == "receive" ? 302*9cd928feSAlan Maguire inet_ntoa6(&((tcp_t *)arg3)->tcp_connp->connua_v6addr.connua_laddr): 303*9cd928feSAlan Maguire "<unknown>"; 304*9cd928feSAlan Maguire}; 305*9cd928feSAlan Maguire 30658dbc507SJonathan Haslam#pragma D binding "1.5" translator 30710e6dadfSbrendantranslator ipv4info_t < ipha_t *I > { 30810e6dadfSbrendan ipv4_ver = I != NULL ? I->ipha_version_and_hdr_length >> 4 : 0; 30910e6dadfSbrendan ipv4_ihl = I != NULL ? (I->ipha_version_and_hdr_length & 0xf) << 2 : 0; 31010e6dadfSbrendan ipv4_tos = I != NULL ? I->ipha_type_of_service : 0; 31110e6dadfSbrendan ipv4_length = I != NULL ? ntohs(I->ipha_length) : 0; 31210e6dadfSbrendan ipv4_ident = I != NULL ? ntohs(I->ipha_ident) : 0; 31310e6dadfSbrendan ipv4_flags = I != NULL ? ntohs(I->ipha_fragment_offset_and_flags) >> 31410e6dadfSbrendan 12 : 0; 31510e6dadfSbrendan ipv4_offset = I != NULL ? ntohs(I->ipha_fragment_offset_and_flags) & 31610e6dadfSbrendan 0x0fff : 0; 31710e6dadfSbrendan ipv4_ttl = I != NULL ? I->ipha_ttl : 0; 31810e6dadfSbrendan ipv4_protocol = I != NULL ? I->ipha_protocol : 0; 31910e6dadfSbrendan ipv4_protostr = I == NULL ? "<null>" : 32010e6dadfSbrendan I->ipha_protocol == IPPROTO_TCP ? "TCP" : 32110e6dadfSbrendan I->ipha_protocol == IPPROTO_UDP ? "UDP" : 32210e6dadfSbrendan I->ipha_protocol == IPPROTO_IP ? "IP" : 32310e6dadfSbrendan I->ipha_protocol == IPPROTO_ICMP ? "ICMP" : 32410e6dadfSbrendan I->ipha_protocol == IPPROTO_IGMP ? "IGMP" : 32510e6dadfSbrendan I->ipha_protocol == IPPROTO_EGP ? "EGP" : 32610e6dadfSbrendan I->ipha_protocol == IPPROTO_IPV6 ? "IPv6" : 32710e6dadfSbrendan I->ipha_protocol == IPPROTO_ROUTING ? "ROUTE" : 32810e6dadfSbrendan I->ipha_protocol == IPPROTO_ESP ? "ESP" : 32910e6dadfSbrendan I->ipha_protocol == IPPROTO_AH ? "AH" : 33010e6dadfSbrendan I->ipha_protocol == IPPROTO_ICMPV6 ? "ICMPv6" : 33110e6dadfSbrendan I->ipha_protocol == IPPROTO_OSPF ? "OSPF" : 33210e6dadfSbrendan I->ipha_protocol == IPPROTO_SCTP ? "SCTP" : 33310e6dadfSbrendan I->ipha_protocol == IPPROTO_RAW ? "RAW" : 33410e6dadfSbrendan lltostr((uint64_t)I->ipha_protocol); 33510e6dadfSbrendan ipv4_checksum = I != NULL ? ntohs(I->ipha_hdr_checksum) : 0; 33610e6dadfSbrendan ipv4_src = I != NULL ? I->ipha_src : 0; 33710e6dadfSbrendan ipv4_dst = I != NULL ? I->ipha_dst : 0; 33810e6dadfSbrendan ipv4_saddr = I != NULL ? inet_ntoa(&I->ipha_src) : "<null>"; 33910e6dadfSbrendan ipv4_daddr = I != NULL ? inet_ntoa(&I->ipha_dst) : "<null>"; 34010e6dadfSbrendan ipv4_hdr = I; 34110e6dadfSbrendan}; 34210e6dadfSbrendan 34358dbc507SJonathan Haslam#pragma D binding "1.5" translator 34410e6dadfSbrendantranslator ipv6info_t < ip6_t *I > { 34510e6dadfSbrendan ipv6_ver = I != NULL ? I->ip6_ctlun.ip6_un2_vfc >> 4 : 0; 34610e6dadfSbrendan ipv6_tclass = I != NULL ? ((I->ip6_ctlun.ip6_un1.ip6_un1_flow && 34710e6dadfSbrendan 0x0fffffff) >> 20) : 0; 34810e6dadfSbrendan ipv6_flow = I != NULL ? I->ip6_ctlun.ip6_un1.ip6_un1_flow && 34910e6dadfSbrendan 0x000fffff : 0; 35010e6dadfSbrendan ipv6_plen = I != NULL ? ntohs(I->ip6_ctlun.ip6_un1.ip6_un1_plen) : 0; 35110e6dadfSbrendan ipv6_nexthdr = I != NULL ? I->ip6_ctlun.ip6_un1.ip6_un1_nxt : 0; 35210e6dadfSbrendan ipv6_nextstr = I == NULL ? "<null>" : 35310e6dadfSbrendan I->ip6_ctlun.ip6_un1.ip6_un1_nxt == IPPROTO_TCP ? "TCP" : 35410e6dadfSbrendan I->ip6_ctlun.ip6_un1.ip6_un1_nxt == IPPROTO_UDP ? "UDP" : 35510e6dadfSbrendan I->ip6_ctlun.ip6_un1.ip6_un1_nxt == IPPROTO_IP ? "IP" : 35610e6dadfSbrendan I->ip6_ctlun.ip6_un1.ip6_un1_nxt == IPPROTO_ICMP ? "ICMP" : 35710e6dadfSbrendan I->ip6_ctlun.ip6_un1.ip6_un1_nxt == IPPROTO_IGMP ? "IGMP" : 35810e6dadfSbrendan I->ip6_ctlun.ip6_un1.ip6_un1_nxt == IPPROTO_EGP ? "EGP" : 35910e6dadfSbrendan I->ip6_ctlun.ip6_un1.ip6_un1_nxt == IPPROTO_IPV6 ? "IPv6" : 36010e6dadfSbrendan I->ip6_ctlun.ip6_un1.ip6_un1_nxt == IPPROTO_ROUTING ? "ROUTE" : 36110e6dadfSbrendan I->ip6_ctlun.ip6_un1.ip6_un1_nxt == IPPROTO_ESP ? "ESP" : 36210e6dadfSbrendan I->ip6_ctlun.ip6_un1.ip6_un1_nxt == IPPROTO_AH ? "AH" : 36310e6dadfSbrendan I->ip6_ctlun.ip6_un1.ip6_un1_nxt == IPPROTO_ICMPV6 ? "ICMPv6" : 36410e6dadfSbrendan I->ip6_ctlun.ip6_un1.ip6_un1_nxt == IPPROTO_OSPF ? "OSPF" : 36510e6dadfSbrendan I->ip6_ctlun.ip6_un1.ip6_un1_nxt == IPPROTO_SCTP ? "SCTP" : 36610e6dadfSbrendan I->ip6_ctlun.ip6_un1.ip6_un1_nxt == IPPROTO_RAW ? "RAW" : 36710e6dadfSbrendan lltostr((uint64_t)I->ip6_ctlun.ip6_un1.ip6_un1_nxt); 36810e6dadfSbrendan ipv6_hlim = I != NULL ? I->ip6_ctlun.ip6_un1.ip6_un1_hlim : 0; 36910e6dadfSbrendan ipv6_src = I != NULL ? &I->ip6_src : 0; 37010e6dadfSbrendan ipv6_dst = I != NULL ? &I->ip6_dst : 0; 37110e6dadfSbrendan ipv6_saddr = I != NULL ? inet_ntoa6(&I->ip6_src) : "<null>"; 37210e6dadfSbrendan ipv6_daddr = I != NULL ? inet_ntoa6(&I->ip6_dst) : "<null>"; 37310e6dadfSbrendan ipv6_hdr = I; 37410e6dadfSbrendan}; 375