diff options
author | Glenn Elliott <gelliott@cs.unc.edu> | 2012-03-04 19:47:13 -0500 |
---|---|---|
committer | Glenn Elliott <gelliott@cs.unc.edu> | 2012-03-04 19:47:13 -0500 |
commit | c71c03bda1e86c9d5198c5d83f712e695c4f2a1e (patch) | |
tree | ecb166cb3e2b7e2adb3b5e292245fefd23381ac8 /net/phonet/af_phonet.c | |
parent | ea53c912f8a86a8567697115b6a0d8152beee5c8 (diff) | |
parent | 6a00f206debf8a5c8899055726ad127dbeeed098 (diff) |
Merge branch 'mpi-master' into wip-k-fmlpwip-k-fmlp
Conflicts:
litmus/sched_cedf.c
Diffstat (limited to 'net/phonet/af_phonet.c')
-rw-r--r-- | net/phonet/af_phonet.c | 49 |
1 files changed, 36 insertions, 13 deletions
diff --git a/net/phonet/af_phonet.c b/net/phonet/af_phonet.c index 73aee7f2fcdc..c6fffd946d42 100644 --- a/net/phonet/af_phonet.c +++ b/net/phonet/af_phonet.c | |||
@@ -37,7 +37,7 @@ | |||
37 | /* Transport protocol registration */ | 37 | /* Transport protocol registration */ |
38 | static struct phonet_protocol *proto_tab[PHONET_NPROTO] __read_mostly; | 38 | static struct phonet_protocol *proto_tab[PHONET_NPROTO] __read_mostly; |
39 | 39 | ||
40 | static struct phonet_protocol *phonet_proto_get(int protocol) | 40 | static struct phonet_protocol *phonet_proto_get(unsigned int protocol) |
41 | { | 41 | { |
42 | struct phonet_protocol *pp; | 42 | struct phonet_protocol *pp; |
43 | 43 | ||
@@ -110,6 +110,7 @@ static int pn_socket_create(struct net *net, struct socket *sock, int protocol, | |||
110 | sk->sk_protocol = protocol; | 110 | sk->sk_protocol = protocol; |
111 | pn = pn_sk(sk); | 111 | pn = pn_sk(sk); |
112 | pn->sobject = 0; | 112 | pn->sobject = 0; |
113 | pn->dobject = 0; | ||
113 | pn->resource = 0; | 114 | pn->resource = 0; |
114 | sk->sk_prot->init(sk); | 115 | sk->sk_prot->init(sk); |
115 | err = 0; | 116 | err = 0; |
@@ -194,11 +195,7 @@ static int pn_send(struct sk_buff *skb, struct net_device *dev, | |||
194 | if (skb->pkt_type == PACKET_LOOPBACK) { | 195 | if (skb->pkt_type == PACKET_LOOPBACK) { |
195 | skb_reset_mac_header(skb); | 196 | skb_reset_mac_header(skb); |
196 | skb_orphan(skb); | 197 | skb_orphan(skb); |
197 | if (irq) | 198 | err = (irq ? netif_rx(skb) : netif_rx_ni(skb)) ? -ENOBUFS : 0; |
198 | netif_rx(skb); | ||
199 | else | ||
200 | netif_rx_ni(skb); | ||
201 | err = 0; | ||
202 | } else { | 199 | } else { |
203 | err = dev_hard_header(skb, dev, ntohs(skb->protocol), | 200 | err = dev_hard_header(skb, dev, ntohs(skb->protocol), |
204 | NULL, NULL, skb->len); | 201 | NULL, NULL, skb->len); |
@@ -207,6 +204,8 @@ static int pn_send(struct sk_buff *skb, struct net_device *dev, | |||
207 | goto drop; | 204 | goto drop; |
208 | } | 205 | } |
209 | err = dev_queue_xmit(skb); | 206 | err = dev_queue_xmit(skb); |
207 | if (unlikely(err > 0)) | ||
208 | err = net_xmit_errno(err); | ||
210 | } | 209 | } |
211 | 210 | ||
212 | return err; | 211 | return err; |
@@ -242,8 +241,18 @@ int pn_skb_send(struct sock *sk, struct sk_buff *skb, | |||
242 | struct net_device *dev; | 241 | struct net_device *dev; |
243 | struct pn_sock *pn = pn_sk(sk); | 242 | struct pn_sock *pn = pn_sk(sk); |
244 | int err; | 243 | int err; |
245 | u16 src; | 244 | u16 src, dst; |
246 | u8 daddr = pn_sockaddr_get_addr(target), saddr = PN_NO_ADDR; | 245 | u8 daddr, saddr, res; |
246 | |||
247 | src = pn->sobject; | ||
248 | if (target != NULL) { | ||
249 | dst = pn_sockaddr_get_object(target); | ||
250 | res = pn_sockaddr_get_resource(target); | ||
251 | } else { | ||
252 | dst = pn->dobject; | ||
253 | res = pn->resource; | ||
254 | } | ||
255 | daddr = pn_addr(dst); | ||
247 | 256 | ||
248 | err = -EHOSTUNREACH; | 257 | err = -EHOSTUNREACH; |
249 | if (sk->sk_bound_dev_if) | 258 | if (sk->sk_bound_dev_if) |
@@ -251,6 +260,15 @@ int pn_skb_send(struct sock *sk, struct sk_buff *skb, | |||
251 | else if (phonet_address_lookup(net, daddr) == 0) { | 260 | else if (phonet_address_lookup(net, daddr) == 0) { |
252 | dev = phonet_device_get(net); | 261 | dev = phonet_device_get(net); |
253 | skb->pkt_type = PACKET_LOOPBACK; | 262 | skb->pkt_type = PACKET_LOOPBACK; |
263 | } else if (dst == 0) { | ||
264 | /* Resource routing (small race until phonet_rcv()) */ | ||
265 | struct sock *sk = pn_find_sock_by_res(net, res); | ||
266 | if (sk) { | ||
267 | sock_put(sk); | ||
268 | dev = phonet_device_get(net); | ||
269 | skb->pkt_type = PACKET_LOOPBACK; | ||
270 | } else | ||
271 | dev = phonet_route_output(net, daddr); | ||
254 | } else | 272 | } else |
255 | dev = phonet_route_output(net, daddr); | 273 | dev = phonet_route_output(net, daddr); |
256 | 274 | ||
@@ -261,12 +279,10 @@ int pn_skb_send(struct sock *sk, struct sk_buff *skb, | |||
261 | if (saddr == PN_NO_ADDR) | 279 | if (saddr == PN_NO_ADDR) |
262 | goto drop; | 280 | goto drop; |
263 | 281 | ||
264 | src = pn->sobject; | ||
265 | if (!pn_addr(src)) | 282 | if (!pn_addr(src)) |
266 | src = pn_object(saddr, pn_obj(src)); | 283 | src = pn_object(saddr, pn_obj(src)); |
267 | 284 | ||
268 | err = pn_send(skb, dev, pn_sockaddr_get_object(target), | 285 | err = pn_send(skb, dev, dst, src, res, 0); |
269 | src, pn_sockaddr_get_resource(target), 0); | ||
270 | dev_put(dev); | 286 | dev_put(dev); |
271 | return err; | 287 | return err; |
272 | 288 | ||
@@ -383,6 +399,13 @@ static int phonet_rcv(struct sk_buff *skb, struct net_device *dev, | |||
383 | goto out; | 399 | goto out; |
384 | } | 400 | } |
385 | 401 | ||
402 | /* resource routing */ | ||
403 | if (pn_sockaddr_get_object(&sa) == 0) { | ||
404 | struct sock *sk = pn_find_sock_by_res(net, sa.spn_resource); | ||
405 | if (sk) | ||
406 | return sk_receive_skb(sk, skb, 0); | ||
407 | } | ||
408 | |||
386 | /* check if we are the destination */ | 409 | /* check if we are the destination */ |
387 | if (phonet_address_lookup(net, pn_sockaddr_get_addr(&sa)) == 0) { | 410 | if (phonet_address_lookup(net, pn_sockaddr_get_addr(&sa)) == 0) { |
388 | /* Phonet packet input */ | 411 | /* Phonet packet input */ |
@@ -441,7 +464,7 @@ static struct packet_type phonet_packet_type __read_mostly = { | |||
441 | 464 | ||
442 | static DEFINE_MUTEX(proto_tab_lock); | 465 | static DEFINE_MUTEX(proto_tab_lock); |
443 | 466 | ||
444 | int __init_or_module phonet_proto_register(int protocol, | 467 | int __init_or_module phonet_proto_register(unsigned int protocol, |
445 | struct phonet_protocol *pp) | 468 | struct phonet_protocol *pp) |
446 | { | 469 | { |
447 | int err = 0; | 470 | int err = 0; |
@@ -464,7 +487,7 @@ int __init_or_module phonet_proto_register(int protocol, | |||
464 | } | 487 | } |
465 | EXPORT_SYMBOL(phonet_proto_register); | 488 | EXPORT_SYMBOL(phonet_proto_register); |
466 | 489 | ||
467 | void phonet_proto_unregister(int protocol, struct phonet_protocol *pp) | 490 | void phonet_proto_unregister(unsigned int protocol, struct phonet_protocol *pp) |
468 | { | 491 | { |
469 | mutex_lock(&proto_tab_lock); | 492 | mutex_lock(&proto_tab_lock); |
470 | BUG_ON(proto_tab[protocol] != pp); | 493 | BUG_ON(proto_tab[protocol] != pp); |