diff options
Diffstat (limited to 'net/tipc')
-rw-r--r-- | net/tipc/udp_media.c | 50 |
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 */ |
143 | static int tipc_udp_send_msg(struct net *net, struct sk_buff *skb, | 143 | static 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 | ||
195 | static 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 | |||
219 | tx_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 */ |
211 | static int tipc_udp_recv(struct sock *sk, struct sk_buff *skb) | 225 | static int tipc_udp_recv(struct sock *sk, struct sk_buff *skb) |
212 | { | 226 | { |