diff options
| author | Marek Lindner <lindner_marek@yahoo.de> | 2010-08-09 17:56:41 -0400 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@suse.de> | 2010-08-23 21:15:36 -0400 |
| commit | b7a23bce7bc9cac85eab1b958e922b2c472ab8fd (patch) | |
| tree | 1f3d960e4a096dcd3bc1850a809c1543a5afbeca | |
| parent | 13334d4875dbaeeb44e7905463f07e236f80311f (diff) | |
Staging: batman-adv: always reply batman icmp packets with primary mac
When receiving an batman icmp echo request or in case of a time-to-live
exceeded batman would reply with the mac address of the outgoing
interface which might be a secondary interface. Because secondary
interfaces are not globally known this might lead to confusion.
Now, replies are sent with the mac address of the primary interface.
Signed-off-by: Marek Lindner <lindner_marek@yahoo.de>
Signed-off-by: Sven Eckelmann <sven.eckelmann@gmx.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
| -rw-r--r-- | drivers/staging/batman-adv/routing.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/drivers/staging/batman-adv/routing.c b/drivers/staging/batman-adv/routing.c index 066cc9149bf1..032195e6de94 100644 --- a/drivers/staging/batman-adv/routing.c +++ b/drivers/staging/batman-adv/routing.c | |||
| @@ -783,6 +783,8 @@ int recv_bat_packet(struct sk_buff *skb, | |||
| 783 | 783 | ||
| 784 | static int recv_my_icmp_packet(struct sk_buff *skb, size_t icmp_len) | 784 | static int recv_my_icmp_packet(struct sk_buff *skb, size_t icmp_len) |
| 785 | { | 785 | { |
| 786 | /* FIXME: each batman_if will be attached to a softif */ | ||
| 787 | struct bat_priv *bat_priv = netdev_priv(soft_device); | ||
| 786 | struct orig_node *orig_node; | 788 | struct orig_node *orig_node; |
| 787 | struct icmp_packet_rr *icmp_packet; | 789 | struct icmp_packet_rr *icmp_packet; |
| 788 | struct ethhdr *ethhdr; | 790 | struct ethhdr *ethhdr; |
| @@ -801,6 +803,9 @@ static int recv_my_icmp_packet(struct sk_buff *skb, size_t icmp_len) | |||
| 801 | return NET_RX_DROP; | 803 | return NET_RX_DROP; |
| 802 | } | 804 | } |
| 803 | 805 | ||
| 806 | if (!bat_priv->primary_if) | ||
| 807 | return NET_RX_DROP; | ||
| 808 | |||
| 804 | /* answer echo request (ping) */ | 809 | /* answer echo request (ping) */ |
| 805 | /* get routing information */ | 810 | /* get routing information */ |
| 806 | spin_lock_irqsave(&orig_hash_lock, flags); | 811 | spin_lock_irqsave(&orig_hash_lock, flags); |
| @@ -830,7 +835,8 @@ static int recv_my_icmp_packet(struct sk_buff *skb, size_t icmp_len) | |||
| 830 | } | 835 | } |
| 831 | 836 | ||
| 832 | memcpy(icmp_packet->dst, icmp_packet->orig, ETH_ALEN); | 837 | memcpy(icmp_packet->dst, icmp_packet->orig, ETH_ALEN); |
| 833 | memcpy(icmp_packet->orig, ethhdr->h_dest, ETH_ALEN); | 838 | memcpy(icmp_packet->orig, |
| 839 | bat_priv->primary_if->net_dev->dev_addr, ETH_ALEN); | ||
| 834 | icmp_packet->msg_type = ECHO_REPLY; | 840 | icmp_packet->msg_type = ECHO_REPLY; |
| 835 | icmp_packet->ttl = TTL; | 841 | icmp_packet->ttl = TTL; |
| 836 | 842 | ||
| @@ -845,6 +851,8 @@ static int recv_my_icmp_packet(struct sk_buff *skb, size_t icmp_len) | |||
| 845 | 851 | ||
| 846 | static int recv_icmp_ttl_exceeded(struct sk_buff *skb, size_t icmp_len) | 852 | static int recv_icmp_ttl_exceeded(struct sk_buff *skb, size_t icmp_len) |
| 847 | { | 853 | { |
| 854 | /* FIXME: each batman_if will be attached to a softif */ | ||
| 855 | struct bat_priv *bat_priv = netdev_priv(soft_device); | ||
| 848 | struct orig_node *orig_node; | 856 | struct orig_node *orig_node; |
| 849 | struct icmp_packet *icmp_packet; | 857 | struct icmp_packet *icmp_packet; |
| 850 | struct ethhdr *ethhdr; | 858 | struct ethhdr *ethhdr; |
| @@ -865,6 +873,9 @@ static int recv_icmp_ttl_exceeded(struct sk_buff *skb, size_t icmp_len) | |||
| 865 | return NET_RX_DROP; | 873 | return NET_RX_DROP; |
| 866 | } | 874 | } |
| 867 | 875 | ||
| 876 | if (!bat_priv->primary_if) | ||
| 877 | return NET_RX_DROP; | ||
| 878 | |||
| 868 | /* get routing information */ | 879 | /* get routing information */ |
| 869 | spin_lock_irqsave(&orig_hash_lock, flags); | 880 | spin_lock_irqsave(&orig_hash_lock, flags); |
| 870 | orig_node = ((struct orig_node *) | 881 | orig_node = ((struct orig_node *) |
| @@ -892,7 +903,8 @@ static int recv_icmp_ttl_exceeded(struct sk_buff *skb, size_t icmp_len) | |||
| 892 | } | 903 | } |
| 893 | 904 | ||
| 894 | memcpy(icmp_packet->dst, icmp_packet->orig, ETH_ALEN); | 905 | memcpy(icmp_packet->dst, icmp_packet->orig, ETH_ALEN); |
| 895 | memcpy(icmp_packet->orig, ethhdr->h_dest, ETH_ALEN); | 906 | memcpy(icmp_packet->orig, |
| 907 | bat_priv->primary_if->net_dev->dev_addr, ETH_ALEN); | ||
| 896 | icmp_packet->msg_type = TTL_EXCEEDED; | 908 | icmp_packet->msg_type = TTL_EXCEEDED; |
| 897 | icmp_packet->ttl = TTL; | 909 | icmp_packet->ttl = TTL; |
| 898 | 910 | ||
