2N/Adnl
2N/Adnl CDDL HEADER START
2N/Adnl
2N/Adnl The contents of this file are subject to the terms of the
2N/Adnl Common Development and Distribution License (the "License").
2N/Adnl You may not use this file except in compliance with the License.
2N/Adnl
2N/Adnl You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
2N/Adnl or http://www.opensolaris.org/os/licensing.
2N/Adnl See the License for the specific language governing permissions
2N/Adnl and limitations under the License.
2N/Adnl
2N/Adnl When distributing Covered Code, include this CDDL HEADER in each
2N/Adnl file and include the License file at usr/src/OPENSOLARIS.LICENSE.
2N/Adnl If applicable, add the following below this CDDL HEADER, with the
2N/Adnl fields enclosed by brackets "[]" replaced with your own identifying
2N/Adnl information: Portions Copyright [yyyy] [name of copyright owner]
2N/Adnl
2N/Adnl CDDL HEADER END
2N/Adnl
2N/Adnl
2N/Adnl
2N/Adnl Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
2N/Adnl
2N/Adivert(-1)
2N/A
2N/Adnl There are three main types of parameter data being copyin()ed and
2N/Adnl translated:
2N/Adnl - integers
2N/Adnl - strings
2N/Adnl - raw data
2N/Adnl For each type there is a corresponding macro.
2N/Adnl PREFIX(), INT_TYPE() and ARG() are defined by a call to BEGIN_XLATOR() which
2N/Adnl marks the beginning of a translator.
2N/Adnl
2N/Adnl The translators tranlate between the intermediate data structures shared
2N/Adnl between mech_krb5 and DTrace and the external data structures exposed to the
2N/Adnl user of the kerberos provider.
2N/Adnl The translators take care of copyin() the data and converting data types to
2N/Adnl the exposed interface types - e.g.
2N/Adnl uint32_t -> uint32_t [no conversion required, just copyin()]
2N/Adnl char * -> string [string]
2N/Adnl char * + length -> uintptr_t [raw data]
2N/A
2N/Adefine(`COPYIN',
2N/A`PREFIX()_$2 = *(($1 *)copyin((uintptr_t)(&
2N/A (*((INT_TYPE() **)(copyin((uintptr_t)&x->ARG(),
2N/A sizeof (INT_TYPE() *)))))->$2),
2N/A sizeof ($1)));')
2N/A
2N/Adnl Check for a NULL pointer and returns "<NULL>" if found.
2N/Adefine(`COPYINSTR',
2N/A`PREFIX()_$1 = *((char **)copyin((uintptr_t)(&
2N/A (*((INT_TYPE() **)(copyin((uintptr_t)&x->ARG(),
2N/A sizeof (INT_TYPE() *)))))->$1),
2N/A sizeof (char *))) != NULL ?
2N/A copyinstr((uintptr_t)*((char **)copyin((uintptr_t)(&
2N/A (*((INT_TYPE() **)(copyin((uintptr_t)&x->ARG(),
2N/A sizeof (INT_TYPE() *)))))->$1),
2N/A sizeof (char *)))) : "<NULL>";')
2N/A
2N/Adnl
2N/Adnl Given a length and a pointer copyin that amount of data from the
2N/Adnl pointer. Returns NULL if pointer is NULL.
2N/Adnl
2N/Adefine(`COPYINDATA',
2N/A`PREFIX()_$1 = *((char **)copyin((uintptr_t)(&
2N/A (*((INT_TYPE() **)(copyin((uintptr_t)&x->ARG(),
2N/A sizeof (INT_TYPE() *)))))->$1),
2N/A sizeof (char *))) != NULL ?
2N/A (uintptr_t)copyin((uintptr_t)*((char **)copyin((uintptr_t)(&
2N/A (*((INT_TYPE() **)(copyin((uintptr_t)&x->ARG(),
2N/A sizeof (INT_TYPE() *)))))->$1),
2N/A sizeof (char *))),
2N/A *((uint32_t *)copyin((uintptr_t)(&
2N/A (*((INT_TYPE() **)(copyin((uintptr_t)&x->ARG(),
2N/A sizeof (INT_TYPE() *)))))->$2),
2N/A sizeof (uint32_t)))) : (self->__krb = (char *)alloca(1),
2N/A self->__krb[0] = NULL, (uintptr_t)self->__krb);')
2N/A
2N/Adnl
2N/Adnl The internal data structures closely mimic the external interfaces
2N/Adnl both in name and in content.
2N/Adnl
2N/Adefine(`BEGIN_XLATOR',
2N/A`define(`ARG', $2)dnl'
2N/A`define(`EXT_TYPE', `$1`'info_t')dnl'
2N/A`define(`INT_TYPE', `k5_`'EXT_TYPE()')dnl'
2N/Adnl Use kauth instead of kauthenticator kauthenticator is just too long
2N/A`define(`PREFIX', ifelse($1, kauthenticator, kauth, $1))dnl'
2N/A`translator $1`'info_t < k5_trace_t *x > {')
2N/A
2N/Adefine(`END_XLATOR', `};')
2N/A
2N/Adnl A translator defined like this:
2N/Adnl
2N/Adnl BEGIN_XLATOR(krb, info)
2N/Adnl
2N/Adnl COPYIN(uint8_t, version)
2N/Adnl
2N/Adnl COPYINSTR(message_type)
2N/Adnl
2N/Adnl COPYINDATA(message, message_length)
2N/Adnl END_XLATOR()
2N/Adnl
2N/Adnl Will produce something like this:
2N/Adnl
2N/Adnl translator krbinfo_t < k5_trace_t *x > {
2N/Adnl
2N/Adnl krb_version = *((uint8_t *)copyin((uintptr_t)(&
2N/Adnl (*((k5_krbinfo_t **)(copyin((uintptr_t)&x->info,
2N/Adnl sizeof (k5_krbinfo_t *)))))->version),
2N/Adnl sizeof (uint8_t)));
2N/Adnl
2N/Adnl krb_message_type = *((char **)copyin((uintptr_t)(&
2N/Adnl (*((k5_krbinfo_t **)(copyin((uintptr_t)&x->info,
2N/Adnl sizeof (k5_krbinfo_t *)))))->message_type),
2N/Adnl sizeof (char *))) != NULL ?
2N/Adnl copyinstr((uintptr_t)*((char **)copyin((uintptr_t)(&
2N/Adnl (*((k5_krbinfo_t **)(copyin((uintptr_t)&x->info,
2N/Adnl sizeof (k5_krbinfo_t *)))))->message_type),
2N/Adnl sizeof (char *)))) : "<NULL>";
2N/Adnl
2N/Adnl krb_message = *((char **)copyin((uintptr_t)(&
2N/Adnl (*((k5_krbinfo_t **)(copyin((uintptr_t)&x->info,
2N/Adnl sizeof (k5_krbinfo_t *)))))->message),
2N/Adnl sizeof (char *))) != NULL ?
2N/Adnl (uintptr_t)copyin((uintptr_t)*((char **)copyin((uintptr_t)(&
2N/Adnl (*((k5_krbinfo_t **)(copyin((uintptr_t)&x->info,
2N/Adnl sizeof (k5_krbinfo_t *)))))->message),
2N/Adnl sizeof (char *))),
2N/Adnl *((uint32_t *)copyin((uintptr_t)(&
2N/Adnl (*((k5_krbinfo_t **)(copyin((uintptr_t)&x->info,
2N/Adnl sizeof (k5_krbinfo_t *)))))->message_length),
2N/Adnl sizeof (uint32_t)))) : (self->__krb = (char *)alloca(1),
2N/Adnl self->__krb[0] = NULL, (uintptr_t)self->__krb);
2N/Adnl };
2N/Adnl
2N/Adnl which may look complicated but is really pretty straightforward.
2N/Adnl e.g. to dnl copy in a uint8_t member value from a structure from userspace
2N/Adnl (mech_krb5) into the kernel (DTrace) the following must be done:
2N/Adnl
2N/Adnl 1. Copy in the pointer to the data structure which contains the member
2N/Adnl we're interested in.
2N/Adnl copyin((uintptr_t)&x->info, sizeof (k5_krbinfo_t *))
2N/Adnl
2N/Adnl 2. Cast and dereference the returned value to get the actual pointer.
2N/Adnl copyin() will return a pointer to the copyin()ed value.
2N/Adnl (*((k5_krbinfo_t **)( #1 )))
2N/Adnl
2N/Adnl 3. Do 1. again to get a pointer to the value of the member
2N/Adnl copyin((uintptr_t)(& #2 ->version), sizeof (uint8_t))
2N/Adnl
2N/Adnl 4. Do 2. again to get the member value
2N/Adnl *((uint8_t *)( #3 ))
2N/Adnl
2N/Adnl The above four steps are what is being done for COPYIN(). COPYINSTR()
2N/Adnl and COPYINDATA() are very similar to COPYIN() but copy in strings and
2N/Adnl data respectively instead of integer values.
2N/A
2N/Adivert(0)dnl
2N/A/*
2N/A * CDDL HEADER START
2N/A *
2N/A * The contents of this file are subject to the terms of the
2N/A * Common Development and Distribution License (the "License").
2N/A * You may not use this file except in compliance with the License.
2N/A *
2N/A * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
2N/A * or http://www.opensolaris.org/os/licensing.
2N/A * See the License for the specific language governing permissions
2N/A * and limitations under the License.
2N/A *
2N/A * When distributing Covered Code, `include' this CDDL HEADER in each
2N/A * file and `include' the License file at usr/src/OPENSOLARIS.LICENSE.
2N/A * If applicable, add the following below this CDDL HEADER, with the
2N/A * fields enclosed by brackets "[]" replaced with your own identifying
2N/A * information: Portions Copyright [yyyy] [name of copyright owner]
2N/A *
2N/A * CDDL HEADER END
2N/A */
2N/A
2N/A/*
2N/A * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
2N/A */
2N/A
2N/A/*
2N/A * Internal Interfaces.
2N/A */
2N/A
2N/Adnl Shared intermediate data structures.
2N/Ainclude(`../dtrace/kerberos_dtrace_impl.h.m4')dnl
2N/A
2N/A
2N/A/*
2N/A * External Interfaces.
2N/A */
2N/A
2N/Atypedef struct krbinfo {
2N/A uint8_t krb_version;
2N/A string krb_message_type;
2N/A uint64_t krb_message_id;
2N/A uint32_t krb_message_length;
2N/A uintptr_t krb_message;
2N/A} krbinfo_t;
2N/A
2N/Atypedef struct kerrorinfo {
2N/A uint32_t kerror_ctime;
2N/A uint32_t kerror_cusec;
2N/A uint32_t kerror_stime;
2N/A uint32_t kerror_susec;
2N/A string kerror_error_code;
2N/A string kerror_client;
2N/A string kerror_server;
2N/A string kerror_e_text;
2N/A string kerror_e_data;
2N/A} kerrorinfo_t;
2N/A
2N/Atypedef struct kdcreqinfo {
2N/A string kdcreq_padata_types;
2N/A string kdcreq_kdc_options;
2N/A string kdcreq_client;
2N/A string kdcreq_server;
2N/A uint32_t kdcreq_from;
2N/A uint32_t kdcreq_till;
2N/A uint32_t kdcreq_rtime;
2N/A uint32_t kdcreq_nonce;
2N/A string kdcreq_etype;
2N/A string kdcreq_addresses;
2N/A string kdcreq_authorization_data;
2N/A uint32_t kdcreq_num_additional_tickets;
2N/A} kdcreqinfo_t;
2N/A
2N/Atypedef struct kdcrepinfo {
2N/A string kdcrep_padata_types;
2N/A string kdcrep_client;
2N/A uint32_t kdcrep_enc_part_kvno;
2N/A string kdcrep_enc_part_etype;
2N/A string kdcrep_enc_key_type;
2N/A uint32_t kdcrep_enc_key_length;
2N/A uintptr_t kdcrep_enc_key_value;
2N/A string kdcrep_enc_last_req;
2N/A uint32_t kdcrep_enc_nonce;
2N/A uint32_t kdcrep_enc_key_expiration;
2N/A string kdcrep_enc_flags;
2N/A uint32_t kdcrep_enc_authtime;
2N/A uint32_t kdcrep_enc_starttime;
2N/A uint32_t kdcrep_enc_endtime;
2N/A uint32_t kdcrep_enc_renew_till;
2N/A string kdcrep_enc_server;
2N/A string kdcrep_enc_caddr;
2N/A} kdcrepinfo_t;
2N/A
2N/Atypedef struct kticketinfo_t {
2N/A string kticket_server;
2N/A uint32_t kticket_enc_part_kvno;
2N/A string kticket_enc_part_etype;
2N/A string kticket_enc_flags;
2N/A string kticket_enc_key_type;
2N/A uint32_t kticket_enc_key_length;
2N/A uintptr_t kticket_enc_key_value;
2N/A string kticket_enc_client;
2N/A string kticket_enc_transited;
2N/A string kticket_enc_transited_type;
2N/A uint32_t kticket_enc_authtime;
2N/A uint32_t kticket_enc_starttime;
2N/A uint32_t kticket_enc_endtime;
2N/A uint32_t kticket_enc_renew_till;
2N/A string kticket_enc_addresses;
2N/A string kticket_enc_authorization_data;
2N/A} kticketinfo_t;
2N/A
2N/Atypedef struct kaprepinfo {
2N/A uint32_t kaprep_enc_part_kvno;
2N/A string kaprep_enc_part_etype;
2N/A uint32_t kaprep_enc_ctime;
2N/A uint32_t kaprep_enc_cusec;
2N/A string kaprep_enc_subkey_type;
2N/A uint32_t kaprep_enc_subkey_length;
2N/A uintptr_t kaprep_enc_subkey_value;
2N/A uint32_t kaprep_enc_seq_number;
2N/A} kaprepinfo_t;
2N/A
2N/Atypedef struct kapreqinfo {
2N/A string kapreq_ap_options;
2N/A uint32_t kapreq_authenticator_kvno;
2N/A string kapreq_authenticator_etype;
2N/A} kapreqinfo_t;
2N/A
2N/Atypedef struct kauthenticatorinfo {
2N/A string kauth_client;
2N/A string kauth_cksum_type;
2N/A uint32_t kauth_cksum_length;
2N/A uintptr_t kauth_cksum_value;
2N/A uint32_t kauth_cusec;
2N/A uint32_t kauth_ctime;
2N/A string kauth_subkey_type;
2N/A uint32_t kauth_subkey_length;
2N/A uintptr_t kauth_subkey_value;
2N/A uint32_t kauth_seq_number;
2N/A string kauth_authorization_data;
2N/A} kauthenticatorinfo_t;
2N/A
2N/Atypedef struct ksafeinfo {
2N/A uintptr_t ksafe_user_data;
2N/A uint32_t ksafe_user_data_length;
2N/A uint32_t ksafe_timestamp;
2N/A uint32_t ksafe_usec;
2N/A uint32_t ksafe_seq_number;
2N/A string ksafe_s_address;
2N/A string ksafe_r_address;
2N/A string ksafe_cksum_type;
2N/A uint32_t ksafe_cksum_length;
2N/A uintptr_t ksafe_cksum_value;
2N/A} ksafeinfo_t;
2N/A
2N/Atypedef struct kprivinfo {
2N/A uint32_t kpriv_enc_part_kvno;
2N/A string kpriv_enc_part_etype;
2N/A uintptr_t kpriv_enc_user_data;
2N/A uint32_t kpriv_enc_user_data_length;
2N/A uint32_t kpriv_enc_timestamp;
2N/A uint32_t kpriv_enc_usec;
2N/A uint32_t kpriv_enc_seq_number;
2N/A string kpriv_enc_s_address;
2N/A string kpriv_enc_r_address;
2N/A} kprivinfo_t;
2N/A
2N/Atypedef struct kcredinfo {
2N/A uint32_t kcred_enc_part_kvno;
2N/A string kcred_enc_part_etype;
2N/A uint32_t kcred_tickets;
2N/A uint32_t kcred_enc_nonce;
2N/A uint32_t kcred_enc_timestamp;
2N/A uint32_t kcred_enc_usec;
2N/A string kcred_enc_s_address;
2N/A string kcred_enc_r_address;
2N/A} kcredinfo_t;
2N/A
2N/Atypedef struct kconninfo {
2N/A string kconn_remote;
2N/A string kconn_local;
2N/A string kconn_protocol;
2N/A string kconn_type;
2N/A uint16_t kconn_localport;
2N/A uint16_t kconn_remoteport;
2N/A} kconninfo_t;
2N/A
2N/A
2N/A/*
2N/A * Translators.
2N/A */
2N/A
2N/ABEGIN_XLATOR(krb, info)
2N/A
2N/A COPYIN(uint8_t, version)
2N/A
2N/A COPYINSTR(message_type)
2N/A
2N/A COPYIN(uint64_t, message_id)
2N/A
2N/A COPYIN(uint32_t, message_length)
2N/A
2N/A COPYINDATA(message, message_length)
2N/AEND_XLATOR()
2N/A
2N/ABEGIN_XLATOR(kerror, arg)
2N/A
2N/A COPYIN(uint32_t, ctime)
2N/A
2N/A COPYIN(uint32_t, cusec)
2N/A
2N/A COPYIN(uint32_t, stime)
2N/A
2N/A COPYIN(uint32_t, susec)
2N/A
2N/A COPYINSTR(error_code)
2N/A
2N/A COPYINSTR(client)
2N/A
2N/A COPYINSTR(server)
2N/A
2N/A COPYINSTR(e_text)
2N/A
2N/A COPYINSTR(e_data)
2N/AEND_XLATOR()
2N/A
2N/ABEGIN_XLATOR(kdcreq, arg)
2N/A
2N/A COPYINSTR(padata_types)
2N/A
2N/A COPYINSTR(kdc_options)
2N/A
2N/A COPYINSTR(client)
2N/A
2N/A COPYINSTR(server)
2N/A
2N/A COPYIN(uint32_t, from)
2N/A
2N/A COPYIN(uint32_t, till)
2N/A
2N/A COPYIN(uint32_t, rtime)
2N/A
2N/A COPYIN(uint32_t, nonce)
2N/A
2N/A COPYINSTR(etype)
2N/A
2N/A COPYINSTR(addresses)
2N/A
2N/A COPYINSTR(authorization_data)
2N/A
2N/A COPYIN(uint32_t, num_additional_tickets)
2N/A
2N/AEND_XLATOR()
2N/A
2N/ABEGIN_XLATOR(kdcrep, arg)
2N/A
2N/A COPYINSTR(padata_types)
2N/A
2N/A COPYINSTR(client)
2N/A
2N/A COPYIN(uint32_t, enc_part_kvno)
2N/A
2N/A COPYINSTR(enc_part_etype)
2N/A
2N/A COPYINSTR(enc_key_type)
2N/A
2N/A COPYIN(uint32_t, enc_key_length)
2N/A
2N/A COPYINDATA(enc_key_value, enc_key_length)
2N/A
2N/A COPYINSTR(enc_last_req)
2N/A
2N/A COPYIN(uint32_t, enc_nonce)
2N/A
2N/A COPYIN(uint32_t, enc_key_expiration)
2N/A
2N/A COPYINSTR(enc_flags)
2N/A
2N/A COPYIN(uint32_t, enc_authtime)
2N/A
2N/A COPYIN(uint32_t, enc_starttime)
2N/A
2N/A COPYIN(uint32_t, enc_endtime)
2N/A
2N/A COPYIN(uint32_t, enc_renew_till)
2N/A
2N/A COPYINSTR(enc_server)
2N/A
2N/A COPYINSTR(enc_caddr)
2N/A
2N/AEND_XLATOR()
2N/A
2N/ABEGIN_XLATOR(kticket, tkt)
2N/A
2N/A COPYINSTR(server)
2N/A
2N/A COPYIN(uint32_t, enc_part_kvno)
2N/A
2N/A COPYINSTR(enc_part_etype)
2N/A
2N/A COPYINSTR(enc_flags)
2N/A
2N/A COPYINSTR(enc_key_type)
2N/A
2N/A COPYIN(uint32_t, enc_key_length)
2N/A
2N/A COPYINDATA(enc_key_value, enc_key_length)
2N/A
2N/A COPYINSTR(enc_client)
2N/A
2N/A COPYINSTR(enc_transited_type)
2N/A
2N/A COPYINSTR(enc_transited)
2N/A
2N/A COPYIN(uint32_t, enc_authtime)
2N/A
2N/A COPYIN(uint32_t, enc_starttime)
2N/A
2N/A COPYIN(uint32_t, enc_endtime)
2N/A
2N/A COPYIN(uint32_t, enc_renew_till)
2N/A
2N/A COPYINSTR(enc_addresses)
2N/A
2N/A COPYINSTR(enc_authorization_data)
2N/AEND_XLATOR()
2N/A
2N/ABEGIN_XLATOR(kaprep, arg)
2N/A
2N/A COPYIN(uint32_t, enc_part_kvno)
2N/A
2N/A COPYINSTR(enc_part_etype)
2N/A
2N/A COPYIN(uint32_t, enc_ctime)
2N/A
2N/A COPYIN(uint32_t, enc_cusec)
2N/A
2N/A COPYINSTR(enc_subkey_type)
2N/A
2N/A COPYIN(uint32_t, enc_subkey_length)
2N/A
2N/A COPYINDATA(enc_subkey_value, enc_subkey_length)
2N/A
2N/A COPYIN(uint32_t, enc_seq_number)
2N/AEND_XLATOR()
2N/A
2N/ABEGIN_XLATOR(kapreq, arg)
2N/A
2N/A COPYINSTR(ap_options)
2N/A
2N/A COPYIN(uint32_t, authenticator_kvno)
2N/A
2N/A COPYINSTR(authenticator_etype)
2N/AEND_XLATOR()
2N/A
2N/ABEGIN_XLATOR(kauthenticator, auth)
2N/A
2N/A COPYINSTR(client)
2N/A
2N/A COPYINSTR(cksum_type)
2N/A
2N/A COPYIN(uint32_t, cksum_length)
2N/A
2N/A COPYINDATA(cksum_value, cksum_length)
2N/A
2N/A COPYIN(uint32_t, cusec)
2N/A
2N/A COPYIN(uint32_t, ctime)
2N/A
2N/A COPYINSTR(subkey_type)
2N/A
2N/A COPYIN(uint32_t, subkey_length)
2N/A
2N/A COPYINDATA(subkey_value, subkey_length)
2N/A
2N/A COPYIN(uint32_t, seq_number)
2N/A
2N/A COPYINSTR(authorization_data)
2N/AEND_XLATOR()
2N/A
2N/ABEGIN_XLATOR(ksafe, arg)
2N/A
2N/A COPYINDATA(user_data, user_data_length)
2N/A
2N/A COPYIN(uint32_t, user_data_length)
2N/A
2N/A COPYIN(uint32_t, timestamp)
2N/A
2N/A COPYIN(uint32_t, usec)
2N/A
2N/A COPYIN(uint32_t, seq_number)
2N/A
2N/A COPYINSTR(s_address)
2N/A
2N/A COPYINSTR(r_address)
2N/A
2N/A COPYINSTR(cksum_type)
2N/A
2N/A COPYIN(uint32_t, cksum_length)
2N/A
2N/A COPYINDATA(cksum_value, cksum_length)
2N/AEND_XLATOR()
2N/A
2N/ABEGIN_XLATOR(kpriv, arg)
2N/A
2N/A COPYINSTR(enc_part_etype)
2N/A
2N/A COPYIN(uint32_t, enc_part_kvno)
2N/A
2N/A COPYINDATA(enc_user_data, enc_user_data_length)
2N/A
2N/A COPYIN(uint32_t, enc_user_data_length)
2N/A
2N/A COPYIN(uint32_t, enc_timestamp)
2N/A
2N/A COPYIN(uint32_t, enc_usec)
2N/A
2N/A COPYIN(uint32_t, enc_seq_number)
2N/A
2N/A COPYINSTR(enc_s_address)
2N/A
2N/A COPYINSTR(enc_r_address)
2N/AEND_XLATOR()
2N/A
2N/ABEGIN_XLATOR(kcred, arg)
2N/A
2N/A COPYINSTR(enc_part_etype)
2N/A
2N/A COPYIN(uint32_t, enc_part_kvno)
2N/A
2N/A COPYIN(uint32_t, tickets)
2N/A
2N/A COPYIN(uint32_t, enc_nonce)
2N/A
2N/A COPYIN(uint32_t, enc_timestamp)
2N/A
2N/A COPYIN(uint32_t, enc_usec)
2N/A
2N/A COPYINSTR(enc_s_address)
2N/A
2N/A COPYINSTR(enc_r_address)
2N/AEND_XLATOR()
2N/A
2N/ABEGIN_XLATOR(kconn, arg)
2N/A
2N/A COPYINSTR(remote)
2N/A
2N/A COPYINSTR(local)
2N/A
2N/A COPYINSTR(protocol)
2N/A
2N/A COPYINSTR(type)
2N/A
2N/A COPYIN(uint16_t, localport)
2N/A
2N/A COPYIN(uint16_t, remoteport)
2N/AEND_XLATOR()