aboutsummaryrefslogtreecommitdiffstats
path: root/net/phonet/af_phonet.c
diff options
context:
space:
mode:
authorGlenn Elliott <gelliott@cs.unc.edu>2012-03-04 19:47:13 -0500
committerGlenn Elliott <gelliott@cs.unc.edu>2012-03-04 19:47:13 -0500
commitc71c03bda1e86c9d5198c5d83f712e695c4f2a1e (patch)
treeecb166cb3e2b7e2adb3b5e292245fefd23381ac8 /net/phonet/af_phonet.c
parentea53c912f8a86a8567697115b6a0d8152beee5c8 (diff)
parent6a00f206debf8a5c8899055726ad127dbeeed098 (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.c49
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 */
38static struct phonet_protocol *proto_tab[PHONET_NPROTO] __read_mostly; 38static struct phonet_protocol *proto_tab[PHONET_NPROTO] __read_mostly;
39 39
40static struct phonet_protocol *phonet_proto_get(int protocol) 40static 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
442static DEFINE_MUTEX(proto_tab_lock); 465static DEFINE_MUTEX(proto_tab_lock);
443 466
444int __init_or_module phonet_proto_register(int protocol, 467int __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}
465EXPORT_SYMBOL(phonet_proto_register); 488EXPORT_SYMBOL(phonet_proto_register);
466 489
467void phonet_proto_unregister(int protocol, struct phonet_protocol *pp) 490void 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);