Blame view

kernel/linux-imx6_3.14.28/net/tipc/msg.c 3.28 KB
6b13f685e   김민수   BSP 최초 추가
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
  /*
   * net/tipc/msg.c: TIPC message header routines
   *
   * Copyright (c) 2000-2006, Ericsson AB
   * Copyright (c) 2005, 2010-2011, Wind River Systems
   * All rights reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in the
   *    documentation and/or other materials provided with the distribution.
   * 3. Neither the names of the copyright holders nor the names of its
   *    contributors may be used to endorse or promote products derived from
   *    this software without specific prior written permission.
   *
   * Alternatively, this software may be distributed under the terms of the
   * GNU General Public License ("GPL") version 2 as published by the Free
   * Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
   * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
   * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
   * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
   * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
   * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
   * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
   * POSSIBILITY OF SUCH DAMAGE.
   */
  
  #include "core.h"
  #include "msg.h"
  
  u32 tipc_msg_tot_importance(struct tipc_msg *m)
  {
  	if (likely(msg_isdata(m))) {
  		if (likely(msg_orignode(m) == tipc_own_addr))
  			return msg_importance(m);
  		return msg_importance(m) + 4;
  	}
  	if ((msg_user(m) == MSG_FRAGMENTER)  &&
  	    (msg_type(m) == FIRST_FRAGMENT))
  		return msg_importance(msg_get_wrapped(m));
  	return msg_importance(m);
  }
  
  
  void tipc_msg_init(struct tipc_msg *m, u32 user, u32 type, u32 hsize,
  		   u32 destnode)
  {
  	memset(m, 0, hsize);
  	msg_set_version(m);
  	msg_set_user(m, user);
  	msg_set_hdr_sz(m, hsize);
  	msg_set_size(m, hsize);
  	msg_set_prevnode(m, tipc_own_addr);
  	msg_set_type(m, type);
  	msg_set_orignode(m, tipc_own_addr);
  	msg_set_destnode(m, destnode);
  }
  
  /**
   * tipc_msg_build - create message using specified header and data
   *
   * Note: Caller must not hold any locks in case copy_from_user() is interrupted!
   *
   * Returns message data size or errno
   */
  int tipc_msg_build(struct tipc_msg *hdr, struct iovec const *msg_sect,
  		   unsigned int len, int max_size, struct sk_buff **buf)
  {
  	int dsz, sz, hsz;
  	unsigned char *to;
  
  	dsz = len;
  	hsz = msg_hdr_sz(hdr);
  	sz = hsz + dsz;
  	msg_set_size(hdr, sz);
  	if (unlikely(sz > max_size)) {
  		*buf = NULL;
  		return dsz;
  	}
  
  	*buf = tipc_buf_acquire(sz);
  	if (!(*buf))
  		return -ENOMEM;
  	skb_copy_to_linear_data(*buf, hdr, hsz);
  	to = (*buf)->data + hsz;
  	if (len && memcpy_fromiovecend(to, msg_sect, 0, dsz)) {
  		kfree_skb(*buf);
  		*buf = NULL;
  		return -EFAULT;
  	}
  	return dsz;
  }