aboutsummaryrefslogtreecommitdiffstats
path: root/net/tipc
diff options
context:
space:
mode:
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{