本文整理汇总了C++中DBGC2函数的典型用法代码示例。如果您正苦于以下问题:C++ DBGC2函数的具体用法?C++ DBGC2怎么用?C++ DBGC2使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了DBGC2函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: ocsp_parse_responder_id
/**
* Parse OCSP responder ID
*
* @v ocsp OCSP check
* @v raw ASN.1 cursor
* @ret rc Return status code
*/
static int ocsp_parse_responder_id ( struct ocsp_check *ocsp,
const struct asn1_cursor *raw ) {
struct ocsp_responder *responder = &ocsp->response.responder;
struct asn1_cursor *responder_id = &responder->id;
unsigned int type;
/* Enter responder ID */
memcpy ( responder_id, raw, sizeof ( *responder_id ) );
type = asn1_type ( responder_id );
asn1_enter_any ( responder_id );
/* Identify responder ID type */
switch ( type ) {
case ASN1_EXPLICIT_TAG ( 1 ) :
DBGC2 ( ocsp, "OCSP %p \"%s\" responder identified by name\n",
ocsp, x509_name ( ocsp->cert ) );
responder->compare = ocsp_compare_responder_name;
return 0;
case ASN1_EXPLICIT_TAG ( 2 ) :
DBGC2 ( ocsp, "OCSP %p \"%s\" responder identified by key "
"hash\n", ocsp, x509_name ( ocsp->cert ) );
responder->compare = ocsp_compare_responder_key_hash;
return 0;
default:
DBGC ( ocsp, "OCSP %p \"%s\" unsupported responder ID type "
"%d\n", ocsp, x509_name ( ocsp->cert ), type );
return -ENOTSUP_RESPONDER_ID;
}
}
示例2: netfront_poll_tx
/**
* Poll for completed packets
*
* @v netdev Network device
*/
static void netfront_poll_tx ( struct net_device *netdev ) {
struct netfront_nic *netfront = netdev->priv;
struct xen_device *xendev = netfront->xendev;
struct netif_tx_response *response;
struct io_buffer *iobuf;
unsigned int status;
int rc;
/* Consume any unconsumed responses */
while ( RING_HAS_UNCONSUMED_RESPONSES ( &netfront->tx_fring ) ) {
/* Get next response */
response = RING_GET_RESPONSE ( &netfront->tx_fring,
netfront->tx_fring.rsp_cons++ );
/* Retrieve from descriptor ring */
iobuf = netfront_pull ( netfront, &netfront->tx, response->id );
status = response->status;
if ( status == NETIF_RSP_OKAY ) {
DBGC2 ( netfront, "NETFRONT %s TX id %d complete\n",
xendev->key, response->id );
netdev_tx_complete ( netdev, iobuf );
} else {
rc = -EIO_NETIF_RSP ( status );
DBGC2 ( netfront, "NETFRONT %s TX id %d error %d: %s\n",
xendev->key, response->id, status,
strerror ( rc ) );
netdev_tx_complete_err ( netdev, iobuf, rc );
}
}
}
示例3: xenstore_response
/**
* Receive XenStore response
*
* @v xen Xen hypervisor
* @v req_id Request ID
* @v value Value to fill in
* @v len Length to fill in
* @ret rc Return status code
*
* The caller is responsible for eventually calling free() on the
* returned value. Note that the value may comprise multiple
* NUL-terminated strings concatenated together. A terminating NUL
* will always be appended to the returned value.
*/
static int xenstore_response ( struct xen_hypervisor *xen, uint32_t req_id,
char **value, size_t *len ) {
struct xsd_sockmsg msg;
char *string;
int rc;
/* Receive message header */
xenstore_recv ( xen, &msg, sizeof ( msg ) );
*len = msg.len;
/* Allocate space for response */
*value = zalloc ( msg.len + 1 /* terminating NUL */ );
/* Receive data. Do this even if allocation failed, or if the
* request ID was incorrect, to avoid leaving data in the
* ring.
*/
xenstore_recv ( xen, *value, msg.len );
/* Validate request ID */
if ( msg.req_id != req_id ) {
DBGC ( xen, "XENSTORE response ID mismatch (got %d, expected "
"%d)\n", msg.req_id, req_id );
rc = -EPROTO;
goto err_req_id;
}
/* Check for allocation failure */
if ( ! *value ) {
DBGC ( xen, "XENSTORE could not allocate %d bytes for "
"response\n", msg.len );
rc = -ENOMEM;
goto err_alloc;
}
/* Check for explicit errors */
if ( msg.type == XS_ERROR ) {
DBGC ( xen, "XENSTORE response error \"%s\"\n", *value );
rc = -EIO;
goto err_explicit;
}
DBGC2 ( xen, "XENSTORE response ID %d\n", req_id );
if ( DBG_EXTRA ) {
for ( string = *value ; string < ( *value + msg.len ) ;
string += ( strlen ( string ) + 1 /* NUL */ ) ) {
DBGC2 ( xen, " - \"%s\"\n", string );
}
}
return 0;
err_explicit:
err_alloc:
err_req_id:
free ( *value );
*value = NULL;
return rc;
}
示例4: tls_p_hash_va
/**
* Generate secure pseudo-random data using a single hash function
*
* @v tls TLS session
* @v digest Hash function to use
* @v secret Secret
* @v secret_len Length of secret
* @v out Output buffer
* @v out_len Length of output buffer
* @v seeds ( data, len ) pairs of seed data, terminated by NULL
*/
static void tls_p_hash_va ( struct tls_session *tls,
struct digest_algorithm *digest,
void *secret, size_t secret_len,
void *out, size_t out_len,
va_list seeds ) {
uint8_t secret_copy[secret_len];
uint8_t digest_ctx[digest->ctxsize];
uint8_t digest_ctx_partial[digest->ctxsize];
uint8_t a[digest->digestsize];
uint8_t out_tmp[digest->digestsize];
size_t frag_len = digest->digestsize;
va_list tmp;
/* Copy the secret, in case HMAC modifies it */
memcpy ( secret_copy, secret, secret_len );
secret = secret_copy;
DBGC2 ( tls, "TLS %p %s secret:\n", tls, digest->name );
DBGC2_HD ( tls, secret, secret_len );
/* Calculate A(1) */
hmac_init ( digest, digest_ctx, secret, &secret_len );
va_copy ( tmp, seeds );
tls_hmac_update_va ( digest, digest_ctx, tmp );
va_end ( tmp );
hmac_final ( digest, digest_ctx, secret, &secret_len, a );
DBGC2 ( tls, "TLS %p %s A(1):\n", tls, digest->name );
DBGC2_HD ( tls, &a, sizeof ( a ) );
/* Generate as much data as required */
while ( out_len ) {
/* Calculate output portion */
hmac_init ( digest, digest_ctx, secret, &secret_len );
hmac_update ( digest, digest_ctx, a, sizeof ( a ) );
memcpy ( digest_ctx_partial, digest_ctx, digest->ctxsize );
va_copy ( tmp, seeds );
tls_hmac_update_va ( digest, digest_ctx, tmp );
va_end ( tmp );
hmac_final ( digest, digest_ctx,
secret, &secret_len, out_tmp );
/* Copy output */
if ( frag_len > out_len )
frag_len = out_len;
memcpy ( out, out_tmp, frag_len );
DBGC2 ( tls, "TLS %p %s output:\n", tls, digest->name );
DBGC2_HD ( tls, out, frag_len );
/* Calculate A(i) */
hmac_final ( digest, digest_ctx_partial,
secret, &secret_len, a );
DBGC2 ( tls, "TLS %p %s A(n):\n", tls, digest->name );
DBGC2_HD ( tls, &a, sizeof ( a ) );
out += frag_len;
out_len -= frag_len;
}
}
示例5: xenstore_request
/**
* Send XenStore request
*
* @v xen Xen hypervisor
* @v type Message type
* @v req_id Request ID
* @v value Value, or NULL to omit
* @v key Key path components
* @ret rc Return status code
*/
static int xenstore_request ( struct xen_hypervisor *xen,
enum xsd_sockmsg_type type, uint32_t req_id,
const char *value, va_list key ) {
struct xsd_sockmsg msg;
struct evtchn_send event;
const char *string;
va_list tmp;
int xenrc;
int rc;
/* Construct message header */
msg.type = type;
msg.req_id = req_id;
msg.tx_id = 0;
msg.len = 0;
DBGC2 ( xen, "XENSTORE request ID %d type %d ", req_id, type );
/* Calculate total length */
va_copy ( tmp, key );
while ( ( string = va_arg ( tmp, const char * ) ) != NULL ) {
DBGC2 ( xen, "%s%s", ( msg.len ? "/" : "" ), string );
msg.len += ( strlen ( string ) + 1 /* '/' or NUL */ );
}
va_end ( tmp );
if ( value ) {
DBGC2 ( xen, " = \"%s\"", value );
msg.len += strlen ( value );
}
DBGC2 ( xen, "\n" );
/* Send message */
xenstore_send ( xen, &msg, sizeof ( msg ) );
string = va_arg ( key, const char * );
assert ( string != NULL );
xenstore_send_string ( xen, string );
while ( ( string = va_arg ( key, const char * ) ) != NULL ) {
xenstore_send_string ( xen, "/" );
xenstore_send_string ( xen, string );
}
xenstore_send ( xen, "", 1 ); /* Separating NUL */
if ( value )
xenstore_send_string ( xen, value );
/* Notify the back end */
event.port = xen->store.port;
if ( ( xenrc = xenevent_send ( xen, &event ) ) != 0 ) {
rc = -EXEN ( xenrc );
DBGC ( xen, "XENSTORE could not notify back end: %s\n",
strerror ( rc ) );
return rc;
}
return 0;
}
示例6: ocsp_parse_certs
/**
* Parse OCSP certificates
*
* @v ocsp OCSP check
* @v raw ASN.1 cursor
* @ret rc Return status code
*/
static int ocsp_parse_certs ( struct ocsp_check *ocsp,
const struct asn1_cursor *raw ) {
struct ocsp_response *response = &ocsp->response;
struct asn1_cursor cursor;
struct x509_certificate *cert;
int rc;
/* Enter certs */
memcpy ( &cursor, raw, sizeof ( cursor ) );
asn1_enter ( &cursor, ASN1_EXPLICIT_TAG ( 0 ) );
asn1_enter ( &cursor, ASN1_SEQUENCE );
/* Parse certificate, if present. The data structure permits
* multiple certificates, but the protocol requires that the
* OCSP signing certificate must either be the issuer itself,
* or must be directly issued by the issuer (see RFC2560
* section 4.2.2.2 "Authorized Responders"). We therefore
* need to identify only the single certificate matching the
* Responder ID.
*/
while ( cursor.len ) {
/* Parse certificate */
if ( ( rc = x509_certificate ( cursor.data, cursor.len,
&cert ) ) != 0 ) {
DBGC ( ocsp, "OCSP %p \"%s\" could not parse "
"certificate: %s\n", ocsp,
x509_name ( ocsp->cert ), strerror ( rc ) );
DBGC_HDA ( ocsp, 0, cursor.data, cursor.len );
return rc;
}
/* Use if this certificate matches the responder ID */
if ( response->responder.compare ( ocsp, cert ) == 0 ) {
response->signer = cert;
DBGC2 ( ocsp, "OCSP %p \"%s\" response is signed by ",
ocsp, x509_name ( ocsp->cert ) );
DBGC2 ( ocsp, "\"%s\"\n",
x509_name ( response->signer ) );
return 0;
}
/* Otherwise, discard this certificate */
x509_put ( cert );
asn1_skip_any ( &cursor );
}
DBGC ( ocsp, "OCSP %p \"%s\" missing responder certificate\n",
ocsp, x509_name ( ocsp->cert ) );
return -EACCES_NO_RESPONDER;
}
示例7: nii_issue_cpb_db
/**
* Issue command with parameter block and data block
*
* @v nii NII NIC
* @v op Operation
* @v cpb Command parameter block, or NULL
* @v cpb_len Command parameter block length
* @v db Data block, or NULL
* @v db_len Data block length
* @ret stat Status flags, or negative status code
*/
static int nii_issue_cpb_db ( struct nii_nic *nii, unsigned int op, void *cpb,
size_t cpb_len, void *db, size_t db_len ) {
PXE_CDB cdb;
/* Prepare command descriptor block */
memset ( &cdb, 0, sizeof ( cdb ) );
cdb.OpCode = NII_OPCODE ( op );
cdb.OpFlags = NII_OPFLAGS ( op );
cdb.CPBaddr = ( ( intptr_t ) cpb );
cdb.CPBsize = cpb_len;
cdb.DBaddr = ( ( intptr_t ) db );
cdb.DBsize = db_len;
cdb.IFnum = nii->nii->IfNum;
/* Issue command */
DBGC2 ( nii, "NII %s issuing %02x:%04x ifnum %d%s%s\n",
nii->dev.name, cdb.OpCode, cdb.OpFlags, cdb.IFnum,
( cpb ? " cpb" : "" ), ( db ? " db" : "" ) );
if ( cpb )
DBGC2_HD ( nii, cpb, cpb_len );
if ( db )
DBGC2_HD ( nii, db, db_len );
nii->issue ( ( intptr_t ) &cdb );
/* Check completion status */
if ( cdb.StatCode != PXE_STATCODE_SUCCESS )
return -cdb.StatCode;
/* Return command-specific status flags */
return ( cdb.StatFlags & ~PXE_STATFLAGS_STATUS_MASK );
}
示例8: netfront_read_mac
/**
* Fetch MAC address
*
* @v netfront Netfront device
* @v hw_addr Hardware address to fill in
* @ret rc Return status code
*/
static int netfront_read_mac ( struct netfront_nic *netfront, void *hw_addr ) {
struct xen_device *xendev = netfront->xendev;
struct xen_hypervisor *xen = xendev->xen;
char *mac;
int len;
int rc;
/* Fetch MAC address */
if ( ( rc = xenstore_read ( xen, &mac, xendev->key, "mac", NULL ) )!=0){
DBGC ( netfront, "NETFRONT %s could not read MAC address: %s\n",
xendev->key, strerror ( rc ) );
goto err_xenstore_read;
}
DBGC2 ( netfront, "NETFRONT %s has MAC address \"%s\"\n",
xendev->key, mac );
/* Decode MAC address */
len = hex_decode ( mac, ':', hw_addr, ETH_ALEN );
if ( len < 0 ) {
rc = len;
DBGC ( netfront, "NETFRONT %s could not decode MAC address "
"\"%s\": %s\n", xendev->key, mac, strerror ( rc ) );
goto err_decode;
}
/* Success */
rc = 0;
err_decode:
free ( mac );
err_xenstore_read:
return rc;
}
示例9: rhine_mii_write
/**
* Write to MII register
*
* @v mii MII interface
* @v reg Register address
* @v data Data to write
* @ret rc Return status code
*/
static int rhine_mii_write ( struct mii_interface *mii, unsigned int reg,
unsigned int data ) {
struct rhine_nic *rhn = container_of ( mii, struct rhine_nic, mii );
unsigned int timeout = RHINE_TIMEOUT_US;
uint8_t cr;
DBGC2 ( rhn, "RHINE %p MII write reg %d data 0x%04x\n",
rhn, reg, data );
/* Initiate write */
writeb ( reg, rhn->regs + RHINE_MII_ADDR );
writew ( data, rhn->regs + RHINE_MII_RDWR );
cr = readb ( rhn->regs + RHINE_MII_CR );
writeb ( ( cr | RHINE_MII_CR_WREN ), rhn->regs + RHINE_MII_CR );
/* Wait for write to complete */
while ( timeout-- ) {
udelay ( 1 );
cr = readb ( rhn->regs + RHINE_MII_CR );
if ( ! ( cr & RHINE_MII_CR_WREN ) )
return 0;
}
DBGC ( rhn, "RHINE %p MII write timeout\n", rhn );
return -ETIMEDOUT;
}
示例10: rhine_poll_tx
/**
* Poll for completed packets
*
* @v netdev Network device
*/
static void rhine_poll_tx ( struct net_device *netdev ) {
struct rhine_nic *rhn = netdev->priv;
struct rhine_descriptor *desc;
unsigned int tx_idx;
uint32_t des0;
/* Check for completed packets */
while ( rhn->tx.cons != rhn->tx.prod ) {
/* Get next transmit descriptor */
tx_idx = ( rhn->tx.cons % RHINE_TXDESC_NUM );
desc = &rhn->tx.desc[tx_idx];
/* Stop if descriptor is still in use */
if ( desc->des0 & cpu_to_le32 ( RHINE_DES0_OWN ) )
return;
/* Complete TX descriptor */
des0 = le32_to_cpu ( desc->des0 );
if ( des0 & RHINE_TDES0_TERR ) {
DBGC ( rhn, "RHINE %p TX %d error (DES0 %08x)\n",
rhn, tx_idx, des0 );
netdev_tx_complete_next_err ( netdev, -EIO );
} else {
DBGC2 ( rhn, "RHINE %p TX %d complete\n", rhn, tx_idx );
netdev_tx_complete_next ( netdev );
}
rhn->tx.cons++;
}
}
示例11: rhine_transmit
/**
* Transmit packet
*
* @v netdev Network device
* @v iobuf I/O buffer
* @ret rc Return status code
*/
static int rhine_transmit ( struct net_device *netdev,
struct io_buffer *iobuf ) {
struct rhine_nic *rhn = netdev->priv;
struct rhine_descriptor *desc;
physaddr_t address;
unsigned int tx_idx;
/* Get next transmit descriptor */
if ( ( rhn->tx.prod - rhn->tx.cons ) >= RHINE_TXDESC_NUM )
return -ENOBUFS;
tx_idx = ( rhn->tx.prod++ % RHINE_TXDESC_NUM );
desc = &rhn->tx.desc[tx_idx];
/* Pad and align packet */
iob_pad ( iobuf, ETH_ZLEN );
address = virt_to_bus ( iobuf->data );
/* Populate transmit descriptor */
desc->buffer = cpu_to_le32 ( address );
desc->des1 = cpu_to_le32 ( RHINE_DES1_IC | RHINE_TDES1_STP |
RHINE_TDES1_EDP | RHINE_DES1_CHAIN |
RHINE_DES1_SIZE ( iob_len ( iobuf ) ) );
wmb();
desc->des0 = cpu_to_le32 ( RHINE_DES0_OWN );
wmb();
/* Notify card that there are packets ready to transmit */
writeb ( ( rhn->cr1 | RHINE_CR1_TXPOLL ), rhn->regs + RHINE_CR1 );
DBGC2 ( rhn, "RHINE %p TX %d is [%llx,%llx)\n", rhn, tx_idx,
( ( unsigned long long ) address ),
( ( unsigned long long ) address + iob_len ( iobuf ) ) );
return 0;
}
示例12: myson_poll_tx
/**
* Poll for completed packets
*
* @v netdev Network device
*/
static void myson_poll_tx ( struct net_device *netdev ) {
struct myson_nic *myson = netdev->priv;
struct myson_descriptor *tx;
unsigned int tx_idx;
/* Check for completed packets */
while ( myson->tx.cons != myson->tx.prod ) {
/* Get next transmit descriptor */
tx_idx = ( myson->tx.cons % MYSON_NUM_TX_DESC );
tx = &myson->tx.desc[tx_idx];
/* Stop if descriptor is still in use */
if ( tx->status & cpu_to_le32 ( MYSON_TX_STAT_OWN ) )
return;
/* Complete TX descriptor */
if ( tx->status & cpu_to_le32 ( MYSON_TX_STAT_ABORT |
MYSON_TX_STAT_CSL ) ) {
DBGC ( myson, "MYSON %p TX %d completion error "
"(%08x)\n", myson, tx_idx,
le32_to_cpu ( tx->status ) );
netdev_tx_complete_next_err ( netdev, -EIO );
} else {
DBGC2 ( myson, "MYSON %p TX %d complete\n",
myson, tx_idx );
netdev_tx_complete_next ( netdev );
}
myson->tx.cons++;
}
}
示例13: ccmp_encrypt
/**
* Encapsulate and encrypt a packet using CCMP
*
* @v crypto CCMP cryptosystem
* @v iob I/O buffer containing cleartext packet
* @ret eiob I/O buffer containing encrypted packet
*/
struct io_buffer * ccmp_encrypt ( struct net80211_crypto *crypto,
struct io_buffer *iob )
{
struct ccmp_ctx *ctx = crypto->priv;
struct ieee80211_frame *hdr = iob->data;
struct io_buffer *eiob;
const int hdrlen = IEEE80211_TYP_FRAME_HEADER_LEN;
int datalen = iob_len ( iob ) - hdrlen;
struct ccmp_head head;
struct ccmp_nonce nonce;
struct ccmp_aad aad;
u8 mic[8], tx_pn[6];
void *edata, *emic;
ctx->tx_seq++;
u64_to_pn ( ctx->tx_seq, tx_pn, PN_LSB );
/* Allocate memory */
eiob = alloc_iob ( iob_len ( iob ) + CCMP_HEAD_LEN + CCMP_MIC_LEN );
if ( ! eiob )
return NULL;
/* Copy frame header */
memcpy ( iob_put ( eiob, hdrlen ), iob->data, hdrlen );
hdr = eiob->data;
hdr->fc |= IEEE80211_FC_PROTECTED;
/* Fill in packet number and extended IV */
memcpy ( head.pn_lo, tx_pn, 2 );
memcpy ( head.pn_hi, tx_pn + 2, 4 );
head.kid = 0x20; /* have Extended IV, key ID 0 */
head._rsvd = 0;
memcpy ( iob_put ( eiob, sizeof ( head ) ), &head, sizeof ( head ) );
/* Form nonce */
nonce.prio = 0;
memcpy ( nonce.a2, hdr->addr2, ETH_ALEN );
u64_to_pn ( ctx->tx_seq, nonce.pn, PN_MSB );
/* Form additional authentication data */
aad.fc = hdr->fc & CCMP_AAD_FC_MASK;
memcpy ( aad.a1, hdr->addr1, 3 * ETH_ALEN ); /* all 3 at once */
aad.seq = hdr->seq & CCMP_AAD_SEQ_MASK;
/* Calculate MIC over the data */
ccmp_cbc_mac ( ctx, &nonce, iob->data + hdrlen, datalen, &aad, mic );
/* Copy and encrypt data and MIC */
edata = iob_put ( eiob, datalen );
emic = iob_put ( eiob, CCMP_MIC_LEN );
ccmp_ctr_xor ( ctx, &nonce,
iob->data + hdrlen, edata, datalen,
mic, emic );
/* Done! */
DBGC2 ( ctx, "WPA-CCMP %p: encrypted packet %p -> %p\n", ctx,
iob, eiob );
return eiob;
}
示例14: srp_login_rsp
/**
* Handle SRP login response
*
* @v srp SRP device
* @v iobuf I/O buffer
* @ret rc Return status code
*/
static int srp_login_rsp ( struct srp_device *srp, struct io_buffer *iobuf ) {
struct srp_login_rsp *login_rsp = iobuf->data;
int rc;
DBGC2 ( srp, "SRP %p RX login response tag %08x%08x\n",
srp, ntohl ( login_rsp->tag.dwords[0] ),
ntohl ( login_rsp->tag.dwords[1] ) );
/* Sanity check */
if ( iob_len ( iobuf ) < sizeof ( *login_rsp ) ) {
DBGC ( srp, "SRP %p RX login response too short (%zd bytes)\n",
srp, iob_len ( iobuf ) );
rc = -EINVAL;
goto out;
}
DBGC ( srp, "SRP %p logged in\n", srp );
/* Mark as logged in */
srp->state |= SRP_STATE_LOGGED_IN;
/* Reset error counter */
srp->retry_count = 0;
/* Issue pending command */
srp_cmd ( srp );
rc = 0;
out:
free_iob ( iobuf );
return rc;
}
示例15: srp_login_rej
/**
* Handle SRP login rejection
*
* @v srp SRP device
* @v iobuf I/O buffer
* @ret rc Return status code
*/
static int srp_login_rej ( struct srp_device *srp, struct io_buffer *iobuf ) {
struct srp_login_rej *login_rej = iobuf->data;
int rc;
DBGC2 ( srp, "SRP %p RX login rejection tag %08x%08x\n",
srp, ntohl ( login_rej->tag.dwords[0] ),
ntohl ( login_rej->tag.dwords[1] ) );
/* Sanity check */
if ( iob_len ( iobuf ) < sizeof ( *login_rej ) ) {
DBGC ( srp, "SRP %p RX login rejection too short (%zd "
"bytes)\n", srp, iob_len ( iobuf ) );
rc = -EINVAL;
goto out;
}
/* Login rejection always indicates an error */
DBGC ( srp, "SRP %p login rejected (reason %08x)\n",
srp, ntohl ( login_rej->reason ) );
rc = -EPERM;
out:
free_iob ( iobuf );
return rc;
}