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