Phonet: look up the resource routing table when forwarding
authorRémi Denis-Courmont <remi.denis-courmont@nokia.com>
Wed, 15 Sep 2010 12:30:13 +0000 (12:30 +0000)
committerDavid S. Miller <davem@davemloft.net>
Thu, 16 Sep 2010 04:31:33 +0000 (21:31 -0700)
Signed-off-by: Rémi Denis-Courmont <remi.denis-courmont@nokia.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/phonet/af_phonet.c

index 73aee7f2fcdccd56b77f19f818d95085b89e2843..fd95beb72f5de707f968f24954942827225a3029 100644 (file)
@@ -251,6 +251,16 @@ int pn_skb_send(struct sock *sk, struct sk_buff *skb,
        else if (phonet_address_lookup(net, daddr) == 0) {
                dev = phonet_device_get(net);
                skb->pkt_type = PACKET_LOOPBACK;
+       } else if (pn_sockaddr_get_object(target) == 0) {
+               /* Resource routing (small race until phonet_rcv()) */
+               struct sock *sk = pn_find_sock_by_res(net,
+                                                       target->spn_resource);
+               if (sk) {
+                       sock_put(sk);
+                       dev = phonet_device_get(net);
+                       skb->pkt_type = PACKET_LOOPBACK;
+               } else
+                       dev = phonet_route_output(net, daddr);
        } else
                dev = phonet_route_output(net, daddr);
 
@@ -383,6 +393,13 @@ static int phonet_rcv(struct sk_buff *skb, struct net_device *dev,
                goto out;
        }
 
+       /* resource routing */
+       if (pn_sockaddr_get_object(&sa) == 0) {
+               struct sock *sk = pn_find_sock_by_res(net, sa.spn_resource);
+               if (sk)
+                       return sk_receive_skb(sk, skb, 0);
+       }
+
        /* check if we are the destination */
        if (phonet_address_lookup(net, pn_sockaddr_get_addr(&sa)) == 0) {
                /* Phonet packet input */