本文整理汇总了C++中MBLKL函数的典型用法代码示例。如果您正苦于以下问题:C++ MBLKL函数的具体用法?C++ MBLKL怎么用?C++ MBLKL使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了MBLKL函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: dm2s_prep_scatgath
/*
* dm2s_prep_scatgath - Prepare scatter/gather elements for transmission
* of a streams message.
*/
static int
dm2s_prep_scatgath(mblk_t *mp, uint32_t *numsg, mscat_gath_t *sgp, int maxsg)
{
uint32_t num = 0;
mblk_t *tmp = mp;
while ((tmp != NULL) && (num < maxsg)) {
sgp[num].msc_dptr = (caddr_t)tmp->b_rptr;
sgp[num].msc_len = MBLKL(tmp);
tmp = tmp->b_cont;
num++;
}
if (tmp != NULL) {
/*
* Number of scatter/gather elements available are not
* enough, so lets pullup the msg.
*/
if (pullupmsg(mp, -1) != 1) {
return (EAGAIN);
}
sgp[0].msc_dptr = (caddr_t)mp->b_rptr;
sgp[0].msc_len = MBLKL(mp);
num = 1;
}
*numsg = num;
return (0);
}
示例2: xdrmblk_putmblk
/*
* We avoid a copy by merely adding this mblk to the list. The caller is
* responsible for allocating and filling in the mblk. If len is
* not a multiple of BYTES_PER_XDR_UNIT, the caller has the option
* of making the data a BYTES_PER_XDR_UNIT multiple (b_wptr - b_rptr is
* a BYTES_PER_XDR_UNIT multiple), but in this case the caller has to ensure
* that the filler bytes are initialized to zero.
*/
bool_t
xdrmblk_putmblk(XDR *xdrs, mblk_t *m, uint_t len)
{
struct xdrmblk_params *p;
int32_t llen = (int32_t)len;
if ((DLEN(m) % BYTES_PER_XDR_UNIT) != 0)
return (FALSE);
if (!xdrmblk_putint32(xdrs, &llen))
return (FALSE);
p = (struct xdrmblk_params *)xdrs->x_private;
/* LINTED pointer alignment */
((mblk_t *)xdrs->x_base)->b_cont = m;
p->apos += p->rpos;
/* base points to the last mblk */
while (m->b_cont) {
p->apos += MBLKL(m);
m = m->b_cont;
}
xdrs->x_base = (caddr_t)m;
xdrs->x_handy = 0;
p->rpos = MBLKL(m);
return (TRUE);
}
示例3: xdrmblk_getmblk
bool_t
xdrmblk_getmblk(XDR *xdrs, mblk_t **mm, uint_t *lenp)
{
mblk_t *m, *nextm;
struct xdrmblk_params *p;
int len;
uint32_t llen;
if (!xdrmblk_getint32(xdrs, (int32_t *)&llen))
return (FALSE);
*lenp = llen;
/* LINTED pointer alignment */
m = (mblk_t *)xdrs->x_base;
*mm = m;
/*
* Walk the mblk chain until we get to the end or we've gathered
* enough data.
*/
len = 0;
llen = roundup(llen, BYTES_PER_XDR_UNIT);
while (m != NULL && len + (int)MBLKL(m) <= llen) {
len += (int)MBLKL(m);
m = m->b_cont;
}
if (len < llen) {
if (m == NULL) {
return (FALSE);
} else {
int tail_bytes = llen - len;
/*
* Split the mblk with the last chunk of data and
* insert it into the chain. The new mblk goes
* after the existing one so that it will get freed
* properly.
*/
nextm = dupb(m);
if (nextm == NULL)
return (FALSE);
nextm->b_cont = m->b_cont;
m->b_cont = nextm;
m->b_wptr = m->b_rptr + tail_bytes;
nextm->b_rptr += tail_bytes;
ASSERT(nextm->b_rptr != nextm->b_wptr);
m = nextm; /* for x_base */
}
}
xdrs->x_base = (caddr_t)m;
xdrs->x_handy = m != NULL ? MBLKL(m) : 0;
p = (struct xdrmblk_params *)xdrs->x_private;
p->apos += p->rpos + llen;
p->rpos = 0;
return (TRUE);
}
示例4: BnxeDumpPkt
void BnxeDumpPkt(um_device_t * pUM,
char * pTag,
mblk_t * pMblk,
boolean_t contents)
{
char buf[256];
char c[32];
u8_t * pMem;
int i, xx = 0;
mutex_enter(&bnxeLoaderMutex);
cmn_err(CE_WARN, "!%s ++++++++++++ %s", BnxeDevName(pUM), pTag);
while (pMblk)
{
pMem = pMblk->b_rptr;
strcpy(buf, "!** > ");
snprintf(c, sizeof(c), "%03x", xx);
strcat(buf, c);
strcat(buf, ": ");
if (contents)
{
for (i = 0; i < MBLKL(pMblk); i++)
{
if ((xx != 0) && (xx % 16 == 0))
{
cmn_err(CE_WARN, buf);
strcpy(buf, "!** ");
snprintf(c, sizeof(c), "%03x", xx);
strcat(buf, c);
strcat(buf, ": ");
}
snprintf(c, sizeof(c), "%02x ", *pMem);
strcat(buf, c);
pMem++;
xx++;
}
}
else
{
snprintf(c, sizeof(c), "%d", (int)MBLKL(pMblk));
strcat(buf, c);
xx += MBLKL(pMblk);
}
cmn_err(CE_WARN, buf);
pMblk = pMblk->b_cont;
}
cmn_err(CE_WARN, "!%s ------------ %s", BnxeDevName(pUM), pTag);
mutex_exit(&bnxeLoaderMutex);
}
示例5: dl_capab
static int
dl_capab(ldi_handle_t lh, mblk_t **mpp)
{
dl_capability_req_t *capb;
union DL_primitives *dl_prim;
mblk_t *mp;
int err;
if ((mp = allocb(sizeof (dl_capability_req_t), BPRI_MED)) == NULL)
return (ENOMEM);
mp->b_datap->db_type = M_PROTO;
capb = (dl_capability_req_t *)mp->b_wptr;
mp->b_wptr += sizeof (dl_capability_req_t);
bzero(mp->b_rptr, sizeof (dl_capability_req_t));
capb->dl_primitive = DL_CAPABILITY_REQ;
(void) ldi_putmsg(lh, mp);
if ((err = ldi_getmsg(lh, &mp, (timestruc_t *)NULL)) != 0)
return (err);
dl_prim = (union DL_primitives *)mp->b_rptr;
switch (dl_prim->dl_primitive) {
case DL_CAPABILITY_ACK:
if (MBLKL(mp) < DL_CAPABILITY_ACK_SIZE) {
printf("dl_capability: DL_CAPABILITY_ACK "
"protocol err\n");
break;
}
*mpp = mp;
return (0);
case DL_ERROR_ACK:
if (MBLKL(mp) < DL_ERROR_ACK_SIZE) {
printf("dl_capability: DL_ERROR_ACK protocol err\n");
break;
}
if (((dl_error_ack_t *)dl_prim)->dl_error_primitive !=
DL_CAPABILITY_REQ) {
printf("dl_capability: DL_ERROR_ACK rtnd prim %u\n",
((dl_error_ack_t *)dl_prim)->dl_error_primitive);
break;
}
*mpp = mp;
return (0);
default:
printf("dl_capability: bad ACK header %u\n",
dl_prim->dl_primitive);
break;
}
freemsg(mp);
return (-1);
}
示例6: skein_digest_final_mblk
/*
* Performs a Final on a context and writes to an mblk digest output.
*/
static int
skein_digest_final_mblk(skein_ctx_t *ctx, crypto_data_t *digest,
crypto_req_handle_t req)
{
off_t offset = digest->cd_offset;
mblk_t *mp;
/* Jump to the first mblk_t that will be used to store the digest. */
for (mp = digest->cd_mp; mp != NULL && offset >= MBLKL(mp);
offset -= MBLKL(mp), mp = mp->b_cont)
;
if (mp == NULL) {
/* caller specified offset is too large */
return (CRYPTO_DATA_LEN_RANGE);
}
if (offset + CRYPTO_BITS2BYTES(ctx->sc_digest_bitlen) <= MBLKL(mp)) {
/* The digest will fit in the current mblk. */
SKEIN_OP(ctx, Final, mp->b_rptr + offset);
} else {
/* Split the digest up between the individual buffers. */
uint8_t *digest_tmp;
off_t scratch_offset = 0;
size_t length = CRYPTO_BITS2BYTES(ctx->sc_digest_bitlen);
size_t cur_len;
digest_tmp = kmem_alloc(CRYPTO_BITS2BYTES(
ctx->sc_digest_bitlen), crypto_kmflag(req));
if (digest_tmp == NULL)
return (CRYPTO_HOST_MEMORY);
SKEIN_OP(ctx, Final, digest_tmp);
while (mp != NULL && length > 0) {
cur_len = MIN(MBLKL(mp) - offset, length);
bcopy(digest_tmp + scratch_offset,
mp->b_rptr + offset, cur_len);
length -= cur_len;
mp = mp->b_cont;
scratch_offset += cur_len;
offset = 0;
}
kmem_free(digest_tmp, CRYPTO_BITS2BYTES(ctx->sc_digest_bitlen));
if (mp == NULL && length > 0) {
/* digest too long to fit in the mblk buffers */
return (CRYPTO_DATA_LEN_RANGE);
}
}
return (CRYPTO_SUCCESS);
}
示例7: mmd_getsize
/*
* Return total size of buffers and total size of areas referenced
* by all in-use (unremoved) packet descriptors.
*/
void
mmd_getsize(multidata_t *mmd, uint_t *ptotal, uint_t *pinuse)
{
pdesc_t *pd;
pdescinfo_t *pdi;
int i;
ASSERT(mmd != NULL);
ASSERT(mmd->mmd_magic == MULTIDATA_MAGIC);
mutex_enter(&mmd->mmd_pd_slab_lock);
if (ptotal != NULL) {
*ptotal = 0;
if (mmd->mmd_hbuf != NULL)
*ptotal += MBLKL(mmd->mmd_hbuf);
for (i = 0; i < mmd->mmd_pbuf_cnt; i++) {
ASSERT(mmd->mmd_pbuf[i] != NULL);
*ptotal += MBLKL(mmd->mmd_pbuf[i]);
}
}
if (pinuse != NULL) {
*pinuse = 0;
/* first pdesc */
pd = mmd_getpdesc(mmd, NULL, NULL, 1, B_TRUE);
while (pd != NULL) {
pdi = &pd->pd_pdi;
/* next pdesc */
pd = mmd_getpdesc(mmd, pd, NULL, 1, B_TRUE);
/* skip over removed descriptor */
if (pdi->flags & PDESC_REM_DEFER)
continue;
if (pdi->flags & PDESC_HBUF_REF)
*pinuse += PDESC_HDRL(pdi);
if (pdi->flags & PDESC_PBUF_REF) {
for (i = 0; i < pdi->pld_cnt; i++)
*pinuse += PDESC_PLDL(pdi, i);
}
}
}
mutex_exit(&mmd->mmd_pd_slab_lock);
}
示例8: uftdi_send_data
static int
uftdi_send_data(uftdi_state_t *uf, mblk_t *data)
{
usb_bulk_req_t *br;
int len = MBLKL(data);
int rval;
USB_DPRINTF_L4(DPRINT_OUT_PIPE, uf->uf_lh,
"uftdi_send_data: %d 0x%x 0x%x 0x%x", len, data->b_rptr[0],
(len > 1) ? data->b_rptr[1] : 0, (len > 2) ? data->b_rptr[2] : 0);
ASSERT(!mutex_owned(&uf->uf_lock));
br = usb_alloc_bulk_req(uf->uf_dip, 0, USB_FLAGS_SLEEP);
br->bulk_data = data;
br->bulk_len = len;
br->bulk_timeout = UFTDI_BULKOUT_TIMEOUT;
br->bulk_cb = uftdi_bulkout_cb;
br->bulk_exc_cb = uftdi_bulkout_cb;
br->bulk_client_private = (usb_opaque_t)uf;
br->bulk_attributes = USB_ATTRS_AUTOCLEARING;
rval = usb_pipe_bulk_xfer(uf->uf_bulkout_ph, br, 0);
if (rval != USB_SUCCESS) {
USB_DPRINTF_L2(DPRINT_OUT_PIPE, uf->uf_lh,
"uftdi_send_data: xfer failed %d", rval);
br->bulk_data = NULL;
usb_free_bulk_req(br);
}
return (rval);
}
示例9: proto_detach_req
/*
* DL_DETACH_REQ
*/
static void
proto_detach_req(dld_str_t *dsp, mblk_t *mp)
{
queue_t *q = dsp->ds_wq;
t_uscalar_t dl_err;
if (MBLKL(mp) < sizeof (dl_detach_req_t)) {
dl_err = DL_BADPRIM;
goto failed;
}
if (dsp->ds_dlstate != DL_UNBOUND) {
dl_err = DL_OUTSTATE;
goto failed;
}
if (dsp->ds_style == DL_STYLE1) {
dl_err = DL_BADPRIM;
goto failed;
}
ASSERT(dsp->ds_datathr_cnt == 0);
dsp->ds_dlstate = DL_DETACH_PENDING;
dld_str_detach(dsp);
dlokack(dsp->ds_wq, mp, DL_DETACH_REQ);
return;
failed:
dlerrorack(q, mp, DL_DETACH_REQ, dl_err, 0);
}
示例10: xdrmblk_skip_fully_read_mblks
/*
* Skip fully read or empty mblks
*/
static void
xdrmblk_skip_fully_read_mblks(XDR *xdrs)
{
mblk_t *m;
struct xdrmblk_params *p;
if (xdrs->x_handy != 0)
return;
/* LINTED pointer alignment */
m = (mblk_t *)xdrs->x_base;
if (m == NULL)
return;
p = (struct xdrmblk_params *)xdrs->x_private;
p->apos += p->rpos;
p->rpos = 0;
do {
m = m->b_cont;
if (m == NULL)
break;
xdrs->x_handy = (int)MBLKL(m);
} while (xdrs->x_handy == 0);
xdrs->x_base = (caddr_t)m;
}
示例11: proto_unbind_req
/*
* DL_UNBIND_REQ
*/
static void
proto_unbind_req(dld_str_t *dsp, mblk_t *mp)
{
queue_t *q = dsp->ds_wq;
t_uscalar_t dl_err;
mac_perim_handle_t mph;
if (MBLKL(mp) < sizeof (dl_unbind_req_t)) {
dl_err = DL_BADPRIM;
goto failed;
}
if (dsp->ds_dlstate != DL_IDLE) {
dl_err = DL_OUTSTATE;
goto failed;
}
mutex_enter(&dsp->ds_lock);
while (dsp->ds_datathr_cnt != 0)
cv_wait(&dsp->ds_datathr_cv, &dsp->ds_lock);
dsp->ds_dlstate = DL_UNBIND_PENDING;
mutex_exit(&dsp->ds_lock);
mac_perim_enter_by_mh(dsp->ds_mh, &mph);
/*
* Unbind the channel to stop packets being received.
*/
dls_unbind(dsp);
/*
* Disable polling mode, if it is enabled.
*/
(void) dld_capab_poll_disable(dsp, NULL);
/*
* Clear LSO flags.
*/
dsp->ds_lso = B_FALSE;
dsp->ds_lso_max = 0;
/*
* Clear the receive callback.
*/
dls_rx_set(dsp, NULL, NULL);
dsp->ds_direct = B_FALSE;
/*
* Set the mode back to the default (unitdata).
*/
dsp->ds_mode = DLD_UNITDATA;
dsp->ds_dlstate = DL_UNBOUND;
dls_active_clear(dsp, B_FALSE);
mac_perim_exit(mph);
dlokack(dsp->ds_wq, mp, DL_UNBIND_REQ);
return;
failed:
dlerrorack(q, mp, DL_UNBIND_REQ, dl_err, 0);
}
示例12: proto_udqos_req
/*
* DL_UDQOS_REQ
*/
static void
proto_udqos_req(dld_str_t *dsp, mblk_t *mp)
{
dl_udqos_req_t *dlp = (dl_udqos_req_t *)mp->b_rptr;
dl_qos_cl_sel1_t *selp;
int off, len;
t_uscalar_t dl_err;
queue_t *q = dsp->ds_wq;
off = dlp->dl_qos_offset;
len = dlp->dl_qos_length;
if (MBLKL(mp) < sizeof (dl_udqos_req_t) || !MBLKIN(mp, off, len)) {
dl_err = DL_BADPRIM;
goto failed;
}
selp = (dl_qos_cl_sel1_t *)(mp->b_rptr + off);
if (selp->dl_qos_type != DL_QOS_CL_SEL1) {
dl_err = DL_BADQOSTYPE;
goto failed;
}
if (selp->dl_priority > (1 << VLAN_PRI_SIZE) - 1 ||
selp->dl_priority < 0) {
dl_err = DL_BADQOSPARAM;
goto failed;
}
dsp->ds_pri = selp->dl_priority;
dlokack(q, mp, DL_UDQOS_REQ);
return;
failed:
dlerrorack(q, mp, DL_UDQOS_REQ, dl_err, 0);
}
示例13: mac_ether_header_info
/* ARGSUSED */
int
mac_ether_header_info(mblk_t *mp, void *mac_pdata, mac_header_info_t *hdr_info)
{
struct ether_header *ehp;
uint16_t ether_type;
if (MBLKL(mp) < sizeof (struct ether_header))
return (EINVAL);
ehp = (void *)mp->b_rptr;
ether_type = ntohs(ehp->ether_type);
hdr_info->mhi_hdrsize = sizeof (struct ether_header);
hdr_info->mhi_daddr = (const uint8_t *)&(ehp->ether_dhost);
hdr_info->mhi_saddr = (const uint8_t *)&(ehp->ether_shost);
hdr_info->mhi_origsap = ether_type;
hdr_info->mhi_bindsap = (ether_type > ETHERMTU) ?
ether_type : DLS_SAP_LLC;
hdr_info->mhi_pktsize = (hdr_info->mhi_bindsap == DLS_SAP_LLC) ?
hdr_info->mhi_hdrsize + ether_type : 0;
if (mac_ether_unicst_verify(hdr_info->mhi_daddr, NULL) == 0)
hdr_info->mhi_dsttype = MAC_ADDRTYPE_UNICAST;
else if (mac_ether_multicst_verify(hdr_info->mhi_daddr, NULL) == 0)
hdr_info->mhi_dsttype = MAC_ADDRTYPE_MULTICAST;
else
hdr_info->mhi_dsttype = MAC_ADDRTYPE_BROADCAST;
return (0);
}
示例14: proto_passive_req
/*
* DL_PASSIVE_REQ
*/
static void
proto_passive_req(dld_str_t *dsp, mblk_t *mp)
{
t_uscalar_t dl_err;
/*
* If we've already become active by issuing an active primitive,
* then it's too late to try to become passive.
*/
if (dsp->ds_passivestate == DLD_ACTIVE) {
dl_err = DL_OUTSTATE;
goto failed;
}
if (MBLKL(mp) < sizeof (dl_passive_req_t)) {
dl_err = DL_BADPRIM;
goto failed;
}
dsp->ds_passivestate = DLD_PASSIVE;
dlokack(dsp->ds_wq, mp, DL_PASSIVE_REQ);
return;
failed:
dlerrorack(dsp->ds_wq, mp, DL_PASSIVE_REQ, dl_err, 0);
}
示例15: uftdi_bulkout_cb
/*ARGSUSED*/
static void
uftdi_bulkout_cb(usb_pipe_handle_t pipe, usb_bulk_req_t *req)
{
uftdi_state_t *uf = (uftdi_state_t *)req->bulk_client_private;
int data_len;
mblk_t *data = req->bulk_data;
data_len = data ? MBLKL(data) : 0;
USB_DPRINTF_L4(DPRINT_OUT_PIPE, uf->uf_lh,
"uftdi_bulkout_cb: cr=%d len=%d",
req->bulk_completion_reason, data_len);
if (uf->uf_port_state == UFTDI_PORT_OPEN &&
req->bulk_completion_reason && data_len > 0) {
uftdi_put_head(&uf->uf_tx_mp, data);
req->bulk_data = NULL;
}
usb_free_bulk_req(req);
/* notify GSD */
if (uf->uf_cb.cb_tx)
uf->uf_cb.cb_tx(uf->uf_cb.cb_arg);
/* send more */
mutex_enter(&uf->uf_lock);
uf->uf_bulkout_state = UFTDI_PIPE_IDLE;
if (uf->uf_tx_mp == NULL)
cv_broadcast(&uf->uf_tx_cv);
else
uftdi_tx_start(uf, NULL);
mutex_exit(&uf->uf_lock);
}