diff options
author | David S. Miller <davem@davemloft.net> | 2014-08-23 14:18:41 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-08-23 14:18:41 -0400 |
commit | 5aa8dbbd5f9ae6ec6f5ab88596a29a5b5d4caf31 (patch) | |
tree | dd7368248aaf26d2476a54a345ede9f0db44eeb9 /net/tipc/msg.c | |
parent | f9474ddfaa009ead12bba44fa8fd49dc4536a124 (diff) | |
parent | 301bae56f21295a4ba71367818d80735687f11ac (diff) |
Merge branch 'tipc-next'
Jon Maloy says:
====================
tipc: Merge port and socket layer code
After the removal of the TIPC native interface, there is no reason to
keep a distinction between a "generic" port layer and a "specific"
socket layer in the code. Throughout the last months, we have posted
several series that aimed at facilitating removal of the port layer,
and in particular the port_lock spinlock, which in reality duplicates
the role normally kept by lock_sock()/bh_lock_sock().
In this series, we finalize this work, by making a significant number of
changes to the link, node, port and socket code, all with the aim of
reducing dependencies between the layers. In the final commits, we then
remove the port spinlock, port.c and port.h altogether.
After this series, we have a socket layer that has only few dependencies
to the rest of the stack, so that it should be possible to continue
cleanups of its code without significantly affecting other code.
====================
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/tipc/msg.c')
-rw-r--r-- | net/tipc/msg.c | 38 |
1 files changed, 34 insertions, 4 deletions
diff --git a/net/tipc/msg.c b/net/tipc/msg.c index 9680be6d388a..74745a47d72a 100644 --- a/net/tipc/msg.c +++ b/net/tipc/msg.c | |||
@@ -56,8 +56,35 @@ void tipc_msg_init(struct tipc_msg *m, u32 user, u32 type, u32 hsize, | |||
56 | msg_set_size(m, hsize); | 56 | msg_set_size(m, hsize); |
57 | msg_set_prevnode(m, tipc_own_addr); | 57 | msg_set_prevnode(m, tipc_own_addr); |
58 | msg_set_type(m, type); | 58 | msg_set_type(m, type); |
59 | msg_set_orignode(m, tipc_own_addr); | 59 | if (hsize > SHORT_H_SIZE) { |
60 | msg_set_destnode(m, destnode); | 60 | msg_set_orignode(m, tipc_own_addr); |
61 | msg_set_destnode(m, destnode); | ||
62 | } | ||
63 | } | ||
64 | |||
65 | struct sk_buff *tipc_msg_create(uint user, uint type, uint hdr_sz, | ||
66 | uint data_sz, u32 dnode, u32 onode, | ||
67 | u32 dport, u32 oport, int errcode) | ||
68 | { | ||
69 | struct tipc_msg *msg; | ||
70 | struct sk_buff *buf; | ||
71 | |||
72 | buf = tipc_buf_acquire(hdr_sz + data_sz); | ||
73 | if (unlikely(!buf)) | ||
74 | return NULL; | ||
75 | |||
76 | msg = buf_msg(buf); | ||
77 | tipc_msg_init(msg, user, type, hdr_sz, dnode); | ||
78 | msg_set_size(msg, hdr_sz + data_sz); | ||
79 | msg_set_prevnode(msg, onode); | ||
80 | msg_set_origport(msg, oport); | ||
81 | msg_set_destport(msg, dport); | ||
82 | msg_set_errcode(msg, errcode); | ||
83 | if (hdr_sz > SHORT_H_SIZE) { | ||
84 | msg_set_orignode(msg, onode); | ||
85 | msg_set_destnode(msg, dnode); | ||
86 | } | ||
87 | return buf; | ||
61 | } | 88 | } |
62 | 89 | ||
63 | /* tipc_buf_append(): Append a buffer to the fragment list of another buffer | 90 | /* tipc_buf_append(): Append a buffer to the fragment list of another buffer |
@@ -155,7 +182,7 @@ int tipc_msg_build(struct tipc_msg *mhdr, struct iovec const *iov, | |||
155 | struct sk_buff *buf, *prev; | 182 | struct sk_buff *buf, *prev; |
156 | char *pktpos; | 183 | char *pktpos; |
157 | int rc; | 184 | int rc; |
158 | 185 | uint chain_sz = 0; | |
159 | msg_set_size(mhdr, msz); | 186 | msg_set_size(mhdr, msz); |
160 | 187 | ||
161 | /* No fragmentation needed? */ | 188 | /* No fragmentation needed? */ |
@@ -166,6 +193,7 @@ int tipc_msg_build(struct tipc_msg *mhdr, struct iovec const *iov, | |||
166 | return -ENOMEM; | 193 | return -ENOMEM; |
167 | skb_copy_to_linear_data(buf, mhdr, mhsz); | 194 | skb_copy_to_linear_data(buf, mhdr, mhsz); |
168 | pktpos = buf->data + mhsz; | 195 | pktpos = buf->data + mhsz; |
196 | TIPC_SKB_CB(buf)->chain_sz = 1; | ||
169 | if (!dsz || !memcpy_fromiovecend(pktpos, iov, offset, dsz)) | 197 | if (!dsz || !memcpy_fromiovecend(pktpos, iov, offset, dsz)) |
170 | return dsz; | 198 | return dsz; |
171 | rc = -EFAULT; | 199 | rc = -EFAULT; |
@@ -182,6 +210,7 @@ int tipc_msg_build(struct tipc_msg *mhdr, struct iovec const *iov, | |||
182 | *chain = buf = tipc_buf_acquire(pktmax); | 210 | *chain = buf = tipc_buf_acquire(pktmax); |
183 | if (!buf) | 211 | if (!buf) |
184 | return -ENOMEM; | 212 | return -ENOMEM; |
213 | chain_sz = 1; | ||
185 | pktpos = buf->data; | 214 | pktpos = buf->data; |
186 | skb_copy_to_linear_data(buf, &pkthdr, INT_H_SIZE); | 215 | skb_copy_to_linear_data(buf, &pkthdr, INT_H_SIZE); |
187 | pktpos += INT_H_SIZE; | 216 | pktpos += INT_H_SIZE; |
@@ -215,6 +244,7 @@ int tipc_msg_build(struct tipc_msg *mhdr, struct iovec const *iov, | |||
215 | rc = -ENOMEM; | 244 | rc = -ENOMEM; |
216 | goto error; | 245 | goto error; |
217 | } | 246 | } |
247 | chain_sz++; | ||
218 | prev->next = buf; | 248 | prev->next = buf; |
219 | msg_set_type(&pkthdr, FRAGMENT); | 249 | msg_set_type(&pkthdr, FRAGMENT); |
220 | msg_set_size(&pkthdr, pktsz); | 250 | msg_set_size(&pkthdr, pktsz); |
@@ -224,7 +254,7 @@ int tipc_msg_build(struct tipc_msg *mhdr, struct iovec const *iov, | |||
224 | pktrem = pktsz - INT_H_SIZE; | 254 | pktrem = pktsz - INT_H_SIZE; |
225 | 255 | ||
226 | } while (1); | 256 | } while (1); |
227 | 257 | TIPC_SKB_CB(*chain)->chain_sz = chain_sz; | |
228 | msg_set_type(buf_msg(buf), LAST_FRAGMENT); | 258 | msg_set_type(buf_msg(buf), LAST_FRAGMENT); |
229 | return dsz; | 259 | return dsz; |
230 | error: | 260 | error: |