Lines Matching refs:nw

48 nlmsg_get_buf(struct nl_writer *nw, size_t len, bool waitok)  in nlmsg_get_buf()  argument
52 MPASS(nw->buf == NULL); in nlmsg_get_buf()
54 NL_LOG(LOG_DEBUG3, "Setting up nw %p len %zu %s", nw, len, in nlmsg_get_buf()
57 nw->buf = nl_buf_alloc(len, mflag); in nlmsg_get_buf()
58 if (__predict_false(nw->buf == NULL)) in nlmsg_get_buf()
60 nw->hdr = NULL; in nlmsg_get_buf()
61 nw->malloc_flag = mflag; in nlmsg_get_buf()
62 nw->num_messages = 0; in nlmsg_get_buf()
63 nw->enomem = false; in nlmsg_get_buf()
69 nl_send_one(struct nl_writer *nw) in nl_send_one() argument
72 return (nl_send(nw, nw->nlp)); in nl_send_one()
76 _nl_writer_unicast(struct nl_writer *nw, size_t size, struct nlpcb *nlp, in _nl_writer_unicast() argument
79 *nw = (struct nl_writer){ in _nl_writer_unicast()
84 return (nlmsg_get_buf(nw, size, waitok)); in _nl_writer_unicast()
88 _nl_writer_group(struct nl_writer *nw, size_t size, uint16_t protocol, in _nl_writer_group() argument
91 *nw = (struct nl_writer){ in _nl_writer_group()
98 return (nlmsg_get_buf(nw, size, waitok)); in _nl_writer_group()
102 _nlmsg_ignore_limit(struct nl_writer *nw) in _nlmsg_ignore_limit() argument
104 nw->ignore_limit = true; in _nlmsg_ignore_limit()
108 _nlmsg_flush(struct nl_writer *nw) in _nlmsg_flush() argument
112 if (__predict_false(nw->hdr != NULL)) { in _nlmsg_flush()
114 int completed_len = (char *)nw->hdr - nw->buf->data; in _nlmsg_flush()
116 nw->buf->datalen -= nw->buf->datalen - completed_len; in _nlmsg_flush()
117 nw->hdr = NULL; in _nlmsg_flush()
120 if (nw->buf->datalen == 0) { in _nlmsg_flush()
121 MPASS(nw->num_messages == 0); in _nlmsg_flush()
122 nl_buf_free(nw->buf); in _nlmsg_flush()
123 nw->buf = NULL; in _nlmsg_flush()
127 result = nw->cb(nw); in _nlmsg_flush()
128 nw->num_messages = 0; in _nlmsg_flush()
131 NL_LOG(LOG_DEBUG, "nw %p flush with %p() failed", nw, nw->cb); in _nlmsg_flush()
143 _nlmsg_refill_buffer(struct nl_writer *nw, size_t required_len) in _nlmsg_refill_buffer() argument
148 MPASS(nw->buf != NULL); in _nlmsg_refill_buffer()
150 if (nw->enomem) in _nlmsg_refill_buffer()
154 "reclaim", nw->buf->datalen, nw->buf->buflen, required_len); in _nlmsg_refill_buffer()
157 completed_len = (nw->hdr != NULL) ? in _nlmsg_refill_buffer()
158 (char *)nw->hdr - nw->buf->data : nw->buf->datalen; in _nlmsg_refill_buffer()
161 new_len = max(nw->buf->buflen, NLMBUFSIZE); in _nlmsg_refill_buffer()
163 if (nw->buf->buflen < NLMBUFSIZE) in _nlmsg_refill_buffer()
167 new_len = nw->buf->buflen * 2; in _nlmsg_refill_buffer()
172 new = nl_buf_alloc(new_len, nw->malloc_flag | M_ZERO); in _nlmsg_refill_buffer()
174 nw->enomem = true; in _nlmsg_refill_buffer()
180 last_len = nw->buf->datalen - completed_len; in _nlmsg_refill_buffer()
182 memcpy(new->data, nw->hdr, last_len); in _nlmsg_refill_buffer()
190 nlmsg_flush(nw); in _nlmsg_refill_buffer()
191 MPASS(nw->buf == NULL); in _nlmsg_refill_buffer()
193 nl_buf_free(nw->buf); in _nlmsg_refill_buffer()
194 nw->buf = new; in _nlmsg_refill_buffer()
195 nw->hdr = (last_len > 0) ? (struct nlmsghdr *)new->data : NULL; in _nlmsg_refill_buffer()
203 _nlmsg_add(struct nl_writer *nw, uint32_t portid, uint32_t seq, uint16_t type, in _nlmsg_add() argument
206 struct nl_buf *nb = nw->buf; in _nlmsg_add()
210 MPASS(nw->hdr == NULL); in _nlmsg_add()
214 if (!nlmsg_refill_buffer(nw, required_len)) in _nlmsg_add()
216 nb = nw->buf; in _nlmsg_add()
227 nw->hdr = hdr; in _nlmsg_add()
234 _nlmsg_end(struct nl_writer *nw) in _nlmsg_end() argument
236 struct nl_buf *nb = nw->buf; in _nlmsg_end()
238 MPASS(nw->hdr != NULL); in _nlmsg_end()
240 if (nw->enomem) { in _nlmsg_end()
242 nlmsg_abort(nw); in _nlmsg_end()
246 nw->hdr->nlmsg_len = nb->data + nb->datalen - (char *)nw->hdr; in _nlmsg_end()
248 nw->hdr->nlmsg_len, nw->hdr->nlmsg_type, nw->hdr->nlmsg_flags, in _nlmsg_end()
249 nw->hdr->nlmsg_seq, nw->hdr->nlmsg_pid); in _nlmsg_end()
250 nw->hdr = NULL; in _nlmsg_end()
251 nw->num_messages++; in _nlmsg_end()
256 _nlmsg_abort(struct nl_writer *nw) in _nlmsg_abort() argument
258 struct nl_buf *nb = nw->buf; in _nlmsg_abort()
260 if (nw->hdr != NULL) { in _nlmsg_abort()
261 nb->datalen = (char *)nw->hdr - nb->data; in _nlmsg_abort()
262 nw->hdr = NULL; in _nlmsg_abort()
273 struct nl_writer *nw = npt->nw; in nlmsg_ack() local
295 if (!nlmsg_add(nw, nlp->nl_port, hdr->nlmsg_seq, NLMSG_ERROR, nl_flags, payload_len)) in nlmsg_ack()
298 errmsg = nlmsg_reserve_data(nw, payload_len, struct nlmsgerr); in nlmsg_ack()
304 nlattr_add_string(nw, NLMSGERR_ATTR_MSG, npt->err_msg); in nlmsg_ack()
306 nlattr_add_u32(nw, NLMSGERR_ATTR_OFFS, npt->err_off); in nlmsg_ack()
308 nlattr_add_raw(nw, npt->cookie); in nlmsg_ack()
310 if (nlmsg_end(nw)) in nlmsg_ack()
315 nlmsg_abort(nw); in nlmsg_ack()
319 _nlmsg_end_dump(struct nl_writer *nw, int error, struct nlmsghdr *hdr) in _nlmsg_end_dump() argument
321 if (!nlmsg_add(nw, hdr->nlmsg_pid, hdr->nlmsg_seq, NLMSG_DONE, 0, sizeof(int))) { in _nlmsg_end_dump()
326 int *perror = nlmsg_reserve_object(nw, int); in _nlmsg_end_dump()
328 nw->buf->datalen, perror); in _nlmsg_end_dump()
330 nlmsg_end(nw); in _nlmsg_end_dump()
331 nw->suppress_ack = true; in _nlmsg_end_dump()
341 nlattr_save_offset(const struct nl_writer *nw) in nlattr_save_offset() argument
343 return (nw->buf->datalen - ((char *)nw->hdr - nw->buf->data)); in nlattr_save_offset()
347 nlmsg_reserve_data_raw(struct nl_writer *nw, size_t sz) in nlmsg_reserve_data_raw() argument
349 struct nl_buf *nb = nw->buf; in nlmsg_reserve_data_raw()
354 if (!nlmsg_refill_buffer(nw, sz)) in nlmsg_reserve_data_raw()
356 nb = nw->buf; in nlmsg_reserve_data_raw()
367 nlattr_add(struct nl_writer *nw, uint16_t attr_type, uint16_t attr_len, in nlattr_add() argument
370 struct nl_buf *nb = nw->buf; in nlattr_add()
379 if (!nlmsg_refill_buffer(nw, required_len)) in nlattr_add()
381 nb = nw->buf; in nlattr_add()