aboutsummaryrefslogtreecommitdiffstats
path: root/net/tipc
diff options
context:
space:
mode:
authorRichard Alpe <richard.alpe@ericsson.com>2016-08-26 04:52:51 -0400
committerDavid S. Miller <davem@davemloft.net>2016-08-27 00:38:40 -0400
commitce984da36e11c1e6db6002ea4f8a4b54e46f45c0 (patch)
treed570de4ff75c81495b3e1dcc48bcf5f83b54d1a5 /net/tipc
parentba5aa84a2d2243d56328e51497a6106dcdf67eef (diff)
tipc: split UDP send function
Split the UDP send function into two. One callback that prepares the skb and one transmit function that sends the skb. This will come in handy in later patches, when we introduce UDP replicast. Signed-off-by: Richard Alpe <richard.alpe@ericsson.com> Reviewed-by: Jon Maloy <jon.maloy@ericsson.com> Acked-by: Ying Xue <ying.xue@windriver.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/tipc')
-rw-r--r--net/tipc/udp_media.c50
1 files changed, 32 insertions, 18 deletions
diff --git a/net/tipc/udp_media.c b/net/tipc/udp_media.c
index adb3c2117a1c..7033b4a1a655 100644
--- a/net/tipc/udp_media.c
+++ b/net/tipc/udp_media.c
@@ -140,28 +140,13 @@ static int tipc_udp_addr2msg(char *msg, struct tipc_media_addr *a)
140} 140}
141 141
142/* tipc_send_msg - enqueue a send request */ 142/* tipc_send_msg - enqueue a send request */
143static int tipc_udp_send_msg(struct net *net, struct sk_buff *skb, 143static int tipc_udp_xmit(struct net *net, struct sk_buff *skb,
144 struct tipc_bearer *b, 144 struct udp_bearer *ub, struct udp_media_addr *src,
145 struct tipc_media_addr *dest) 145 struct udp_media_addr *dst)
146{ 146{
147 int ttl, err = 0; 147 int ttl, err = 0;
148 struct udp_bearer *ub;
149 struct udp_media_addr *dst = (struct udp_media_addr *)&dest->value;
150 struct udp_media_addr *src = (struct udp_media_addr *)&b->addr.value;
151 struct rtable *rt; 148 struct rtable *rt;
152 149
153 if (skb_headroom(skb) < UDP_MIN_HEADROOM) {
154 err = pskb_expand_head(skb, UDP_MIN_HEADROOM, 0, GFP_ATOMIC);
155 if (err)
156 goto tx_error;
157 }
158
159 skb_set_inner_protocol(skb, htons(ETH_P_TIPC));
160 ub = rcu_dereference_rtnl(b->media_ptr);
161 if (!ub) {
162 err = -ENODEV;
163 goto tx_error;
164 }
165 if (dst->proto == htons(ETH_P_IP)) { 150 if (dst->proto == htons(ETH_P_IP)) {
166 struct flowi4 fl = { 151 struct flowi4 fl = {
167 .daddr = dst->ipv4.s_addr, 152 .daddr = dst->ipv4.s_addr,
@@ -207,6 +192,35 @@ tx_error:
207 return err; 192 return err;
208} 193}
209 194
195static int tipc_udp_send_msg(struct net *net, struct sk_buff *skb,
196 struct tipc_bearer *b,
197 struct tipc_media_addr *addr)
198{
199 struct udp_media_addr *src = (struct udp_media_addr *)&b->addr.value;
200 struct udp_media_addr *dst = (struct udp_media_addr *)&addr->value;
201 struct udp_bearer *ub;
202 int err = 0;
203
204 if (skb_headroom(skb) < UDP_MIN_HEADROOM) {
205 err = pskb_expand_head(skb, UDP_MIN_HEADROOM, 0, GFP_ATOMIC);
206 if (err)
207 goto tx_error;
208 }
209
210 skb_set_inner_protocol(skb, htons(ETH_P_TIPC));
211 ub = rcu_dereference_rtnl(b->media_ptr);
212 if (!ub) {
213 err = -ENODEV;
214 goto tx_error;
215 }
216
217 return tipc_udp_xmit(net, skb, ub, src, dst);
218
219tx_error:
220 kfree_skb(skb);
221 return err;
222}
223
210/* tipc_udp_recv - read data from bearer socket */ 224/* tipc_udp_recv - read data from bearer socket */
211static int tipc_udp_recv(struct sock *sk, struct sk_buff *skb) 225static int tipc_udp_recv(struct sock *sk, struct sk_buff *skb)
212{ 226{