Lines Matching +full:max +full:- +full:msg +full:- +full:size

2  * net/tipc/msg.c: TIPC message header routines
4 * Copyright (c) 2000-2006, 2014-2015, Ericsson AB
5 * Copyright (c) 2005, 2010-2011, Wind River Systems
39 #include "msg.h"
54 const int one_page_mtu = PAGE_SIZE - SKB_DATA_ALIGN(BUF_OVERHEAD) -
58 * tipc_buf_acquire - creates a TIPC message buffer
59 * @size: message size (including TIPC header)
62 * Return: a new buffer with data pointers set to the specified size.
68 struct sk_buff *tipc_buf_acquire(u32 size, gfp_t gfp) in tipc_buf_acquire() argument
72 skb = alloc_skb_fclone(BUF_OVERHEAD + size, gfp); in tipc_buf_acquire()
75 skb_put(skb, size); in tipc_buf_acquire()
76 skb->next = NULL; in tipc_buf_acquire()
101 struct tipc_msg *msg; in tipc_msg_create() local
108 msg = buf_msg(buf); in tipc_msg_create()
109 tipc_msg_init(onode, msg, user, type, hdr_sz, dnode); in tipc_msg_create()
110 msg_set_size(msg, hdr_sz + data_sz); in tipc_msg_create()
111 msg_set_origport(msg, oport); in tipc_msg_create()
112 msg_set_destport(msg, dport); in tipc_msg_create()
113 msg_set_errcode(msg, errcode); in tipc_msg_create()
119 * out: set when successful non-complete reassembly, otherwise NULL
129 struct tipc_msg *msg; in tipc_buf_append() local
137 msg = buf_msg(frag); in tipc_buf_append()
138 fragid = msg_type(msg); in tipc_buf_append()
139 frag->next = NULL; in tipc_buf_append()
140 skb_pull(frag, msg_hdr_sz(msg)); in tipc_buf_append()
152 TIPC_SKB_CB(head)->tail = NULL; in tipc_buf_append()
167 tail = TIPC_SKB_CB(head)->tail; in tipc_buf_append()
169 skb_shinfo(head)->frag_list = frag; in tipc_buf_append()
171 tail->next = frag; in tipc_buf_append()
172 head->truesize += frag->truesize; in tipc_buf_append()
173 head->data_len += frag->len; in tipc_buf_append()
174 head->len += frag->len; in tipc_buf_append()
175 TIPC_SKB_CB(head)->tail = frag; in tipc_buf_append()
179 TIPC_SKB_CB(head)->validated = 0; in tipc_buf_append()
183 TIPC_SKB_CB(head)->tail = NULL; in tipc_buf_append()
199 * @mss: max allowable size of buffer
200 * @dlen: size of data to be appended
218 if (!skb || skb->len >= mss) { in tipc_msg_append()
221 return -ENOMEM; in tipc_msg_append()
234 cpy = min_t(size_t, rem, mss - mlen); in tipc_msg_append()
235 if (cpy != copy_from_iter(skb->data + mlen, cpy, &m->msg_iter)) in tipc_msg_append()
236 return -EFAULT; in tipc_msg_append()
239 rem -= cpy; in tipc_msg_append()
240 total += msg_blocks(hdr) - curr; in tipc_msg_append()
242 return total - accounted; in tipc_msg_append()
245 /* tipc_msg_validate - validate basic format of received message
263 if (unlikely(skb->truesize / buf_roundup_len(skb) >= 4)) { in tipc_msg_validate()
271 if (unlikely(TIPC_SKB_CB(skb)->validated)) in tipc_msg_validate()
290 if (unlikely((msz - hsz) > TIPC_MAX_USER_MSG_SIZE)) in tipc_msg_validate()
292 if (unlikely(skb->len < msz)) in tipc_msg_validate()
295 TIPC_SKB_CB(skb)->validated = 1; in tipc_msg_validate()
300 * tipc_msg_fragment - build a fragment skb list for TIPC message
303 * @hdr: internal msg header to be put on the top of the fragments
304 * @pktmax: max size of a fragment incl. the header
307 * Return: 0 if the fragmentation is successful, otherwise: -EINVAL
308 * or -ENOMEM
318 /* Non-linear buffer? */ in tipc_msg_fragment()
320 return -ENOMEM; in tipc_msg_fragment()
322 data = (u8 *)skb->data; in tipc_msg_fragment()
324 dmax = pktmax - INT_H_SIZE; in tipc_msg_fragment()
326 return -EINVAL; in tipc_msg_fragment()
355 return -ENOMEM; in tipc_msg_fragment()
359 * tipc_msg_build - create buffer chain containing specified header and data
364 * @pktmax: Max packet size that can be used
370 * Return: message data size or errno: -ENOMEM, -EFAULT
395 return -ENOMEM; in tipc_msg_build()
402 return -ENOMEM; in tipc_msg_build()
407 pktpos = skb->data + mhsz; in tipc_msg_build()
408 if (copy_from_iter_full(pktpos, dsz, &m->msg_iter)) in tipc_msg_build()
410 rc = -EFAULT; in tipc_msg_build()
424 return -ENOMEM; in tipc_msg_build()
427 pktpos = skb->data; in tipc_msg_build()
430 pktrem -= INT_H_SIZE; in tipc_msg_build()
433 pktrem -= mhsz; in tipc_msg_build()
439 if (!copy_from_iter_full(pktpos, pktrem, &m->msg_iter)) { in tipc_msg_build()
440 rc = -EFAULT; in tipc_msg_build()
443 drem -= pktrem; in tipc_msg_build()
449 if (drem < (pktmax - INT_H_SIZE)) in tipc_msg_build()
455 rc = -ENOMEM; in tipc_msg_build()
464 pktpos = skb->data + INT_H_SIZE; in tipc_msg_build()
465 pktrem = pktsz - INT_H_SIZE; in tipc_msg_build()
477 * tipc_msg_bundle - Append contents of a buffer to tail of an existing one
479 * @msg: message to be appended
480 * @max: max allowable size for the bundle buffer
484 static bool tipc_msg_bundle(struct sk_buff *bskb, struct tipc_msg *msg, in tipc_msg_bundle() argument
485 u32 max) in tipc_msg_bundle() argument
490 msz = msg_size(msg); in tipc_msg_bundle()
493 pad = offset - bsz; in tipc_msg_bundle()
497 if (unlikely(max < (offset + msz))) in tipc_msg_bundle()
501 skb_copy_to_linear_data_offset(bskb, offset, msg, msz); in tipc_msg_bundle()
508 * tipc_msg_try_bundle - Try to bundle a new message to the last one
511 * @mss: max message size (header inclusive)
523 struct tipc_msg *msg, *inner, *outer; in tipc_msg_try_bundle() local
527 msg = buf_msg(*skb); in tipc_msg_try_bundle()
528 if (msg_user(msg) == MSG_FRAGMENTER) in tipc_msg_try_bundle()
530 if (msg_user(msg) == TUNNEL_PROTOCOL) in tipc_msg_try_bundle()
532 if (msg_user(msg) == BCAST_PROTOCOL) in tipc_msg_try_bundle()
534 if (mss <= INT_H_SIZE + msg_size(msg)) in tipc_msg_try_bundle()
549 if (unlikely(mss < BUF_ALIGN(INT_H_SIZE + tsz) + msg_size(msg))) in tipc_msg_try_bundle()
551 if (unlikely(pskb_expand_head(tskb, INT_H_SIZE, mss - tsz - INT_H_SIZE, in tipc_msg_try_bundle()
565 if (likely(tipc_msg_bundle(tskb, msg, mss))) { in tipc_msg_try_bundle()
576 * @pos: position in outer message of msg to be extracted.
577 * Returns position of next msg.
591 if (unlikely(*pos > (msg_data_sz(hdr) - MIN_H_SIZE))) in tipc_msg_extract()
646 /* Don't return data along with SYN+, - sender has a clone */ in tipc_msg_reverse()
654 memcpy((*skb)->data, _skb->data, msg_hdr_sz(_hdr)); in tipc_msg_reverse()
655 memcpy((*skb)->data + hlen, msg_data(_hdr), dlen); in tipc_msg_reverse()
677 bool tipc_msg_skb_clone(struct sk_buff_head *msg, struct sk_buff_head *cpy) in tipc_msg_skb_clone() argument
681 skb_queue_walk(msg, skb) { in tipc_msg_skb_clone()
703 struct tipc_msg *msg = buf_msg(skb); in tipc_msg_lookup_dest() local
704 u32 scope = msg_lookup_scope(msg); in tipc_msg_lookup_dest()
706 u32 inst = msg_nameinst(msg); in tipc_msg_lookup_dest()
710 if (!msg_isdata(msg)) in tipc_msg_lookup_dest()
712 if (!msg_named(msg)) in tipc_msg_lookup_dest()
714 if (msg_errcode(msg)) in tipc_msg_lookup_dest()
719 msg = buf_msg(skb); in tipc_msg_lookup_dest()
720 if (msg_reroute_cnt(msg)) in tipc_msg_lookup_dest()
723 msg_nametype(msg), inst, inst); in tipc_msg_lookup_dest()
727 msg_incr_reroute_cnt(msg); in tipc_msg_lookup_dest()
729 msg_set_prevnode(msg, self); in tipc_msg_lookup_dest()
730 msg_set_destnode(msg, sk.node); in tipc_msg_lookup_dest()
731 msg_set_destport(msg, sk.ref); in tipc_msg_lookup_dest()
737 /* tipc_msg_assemble() - assemble chain of fragments into one message
747 skb->next = NULL; in tipc_msg_assemble()
761 /* tipc_msg_reassemble() - clone a buffer chain of fragments and
787 frag->next = NULL; in tipc_msg_reassemble()
801 bool tipc_msg_pskb_copy(u32 dst, struct sk_buff_head *msg, in tipc_msg_pskb_copy() argument
806 skb_queue_walk(msg, skb) { in tipc_msg_pskb_copy()