Commit aa6c45f3 authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont Committed by David S. Miller

Phonet: route outgoing packets

Signed-off-by: default avatarRémi Denis-Courmont <remi.denis-courmont@nokia.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent f062f41d
...@@ -190,9 +190,8 @@ static int pn_send(struct sk_buff *skb, struct net_device *dev, ...@@ -190,9 +190,8 @@ static int pn_send(struct sk_buff *skb, struct net_device *dev,
skb->priority = 0; skb->priority = 0;
skb->dev = dev; skb->dev = dev;
if (pn_addr(src) == pn_addr(dst)) { if (skb->pkt_type == PACKET_LOOPBACK) {
skb_reset_mac_header(skb); skb_reset_mac_header(skb);
skb->pkt_type = PACKET_LOOPBACK;
skb_orphan(skb); skb_orphan(skb);
if (irq) if (irq)
netif_rx(skb); netif_rx(skb);
...@@ -222,6 +221,9 @@ static int pn_raw_send(const void *data, int len, struct net_device *dev, ...@@ -222,6 +221,9 @@ static int pn_raw_send(const void *data, int len, struct net_device *dev,
if (skb == NULL) if (skb == NULL)
return -ENOMEM; return -ENOMEM;
if (phonet_address_lookup(dev_net(dev), pn_addr(dst)) == 0)
skb->pkt_type = PACKET_LOOPBACK;
skb_reserve(skb, MAX_PHONET_HEADER); skb_reserve(skb, MAX_PHONET_HEADER);
__skb_put(skb, len); __skb_put(skb, len);
skb_copy_to_linear_data(skb, data, len); skb_copy_to_linear_data(skb, data, len);
...@@ -235,6 +237,7 @@ static int pn_raw_send(const void *data, int len, struct net_device *dev, ...@@ -235,6 +237,7 @@ static int pn_raw_send(const void *data, int len, struct net_device *dev,
int pn_skb_send(struct sock *sk, struct sk_buff *skb, int pn_skb_send(struct sock *sk, struct sk_buff *skb,
const struct sockaddr_pn *target) const struct sockaddr_pn *target)
{ {
struct net *net = sock_net(sk);
struct net_device *dev; struct net_device *dev;
struct pn_sock *pn = pn_sk(sk); struct pn_sock *pn = pn_sk(sk);
int err; int err;
...@@ -243,9 +246,13 @@ int pn_skb_send(struct sock *sk, struct sk_buff *skb, ...@@ -243,9 +246,13 @@ int pn_skb_send(struct sock *sk, struct sk_buff *skb,
err = -EHOSTUNREACH; err = -EHOSTUNREACH;
if (sk->sk_bound_dev_if) if (sk->sk_bound_dev_if)
dev = dev_get_by_index(sock_net(sk), sk->sk_bound_dev_if); dev = dev_get_by_index(net, sk->sk_bound_dev_if);
else else if (phonet_address_lookup(net, daddr) == 0) {
dev = phonet_device_get(sock_net(sk)); dev = phonet_device_get(net);
skb->pkt_type = PACKET_LOOPBACK;
} else
dev = phonet_route_output(net, daddr);
if (!dev || !(dev->flags & IFF_UP)) if (!dev || !(dev->flags & IFF_UP))
goto drop; goto drop;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment