/* * Given a request with it's body already composed, * rewind to the start and fill in the SMB header. * This is called after the request is enqueued, * so we have the final MID, seq num. etc. */ void smb_rq_fillhdr(struct smb_rq *rqp) { struct mbchain mbtmp, *mbp = &mbtmp; mblk_t *m; /* * Fill in the SMB header using a dup of the first mblk, * which points at the same data but has its own wptr, * so we can rewind without trashing the message. */ m = dupb(rqp->sr_rq.mb_top); m->b_wptr = m->b_rptr; /* rewind */ mb_initm(mbp, m); mb_put_mem(mbp, SMB_SIGNATURE, 4, MB_MSYSTEM); mb_put_uint8(mbp, rqp->sr_cmd); mb_put_uint32le(mbp, 0); /* status */ mb_put_uint8(mbp, rqp->sr_rqflags); mb_put_uint16le(mbp, rqp->sr_rqflags2); mb_put_uint16le(mbp, 0); /* pid-high */ mb_put_mem(mbp, NULL, 8, MB_MZERO); /* MAC sig. (later) */ mb_put_uint16le(mbp, 0); /* reserved */ mb_put_uint16le(mbp, rqp->sr_rqtid); mb_put_uint16le(mbp, rqp->sr_pid); mb_put_uint16le(mbp, rqp->sr_rquid); mb_put_uint16le(mbp, rqp->sr_mid); /* This will free the mblk from dupb. */ mb_done(mbp); }
/* * Various helper functions */ int mb_init(struct mbchain *mbp) { struct mbuf *m; m = m_gethdr(M_WAIT, MT_DATA); m->m_len = 0; mb_initm(mbp, m); return 0; }
int mb_init(struct mbdata *mbp, size_t size) { struct mbuf *m; int error; if ((error = m_get(size, &m)) != 0) return error; return mb_initm(mbp, m); }
int mb_init(struct mbchain *mbp) { struct mbuf *m; m = m_gethdr(M_WAIT, MT_DATA); if (m == NULL) return ENOBUFS; m->m_len = 0; mb_initm(mbp, m); return 0; }