Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b7a23bce authored by Marek Lindner's avatar Marek Lindner Committed by Greg Kroah-Hartman
Browse files

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: default avatarMarek Lindner <lindner_marek@yahoo.de>
Signed-off-by: default avatarSven Eckelmann <sven.eckelmann@gmx.de>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 13334d48
Loading
Loading
Loading
Loading
+14 −2
Original line number Diff line number Diff line
@@ -783,6 +783,8 @@ int recv_bat_packet(struct sk_buff *skb,

static int recv_my_icmp_packet(struct sk_buff *skb, size_t icmp_len)
{
	/* FIXME: each batman_if will be attached to a softif */
	struct bat_priv *bat_priv = netdev_priv(soft_device);
	struct orig_node *orig_node;
	struct icmp_packet_rr *icmp_packet;
	struct ethhdr *ethhdr;
@@ -801,6 +803,9 @@ static int recv_my_icmp_packet(struct sk_buff *skb, size_t icmp_len)
		return NET_RX_DROP;
	}

	if (!bat_priv->primary_if)
		return NET_RX_DROP;

	/* answer echo request (ping) */
	/* get routing information */
	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)
		}

		memcpy(icmp_packet->dst, icmp_packet->orig, ETH_ALEN);
		memcpy(icmp_packet->orig, ethhdr->h_dest, ETH_ALEN);
		memcpy(icmp_packet->orig,
		       bat_priv->primary_if->net_dev->dev_addr, ETH_ALEN);
		icmp_packet->msg_type = ECHO_REPLY;
		icmp_packet->ttl = TTL;

@@ -845,6 +851,8 @@ static int recv_my_icmp_packet(struct sk_buff *skb, size_t icmp_len)

static int recv_icmp_ttl_exceeded(struct sk_buff *skb, size_t icmp_len)
{
	/* FIXME: each batman_if will be attached to a softif */
	struct bat_priv *bat_priv = netdev_priv(soft_device);
	struct orig_node *orig_node;
	struct icmp_packet *icmp_packet;
	struct ethhdr *ethhdr;
@@ -865,6 +873,9 @@ static int recv_icmp_ttl_exceeded(struct sk_buff *skb, size_t icmp_len)
		return NET_RX_DROP;
	}

	if (!bat_priv->primary_if)
		return NET_RX_DROP;

	/* get routing information */
	spin_lock_irqsave(&orig_hash_lock, flags);
	orig_node = ((struct orig_node *)
@@ -892,7 +903,8 @@ static int recv_icmp_ttl_exceeded(struct sk_buff *skb, size_t icmp_len)
		}

		memcpy(icmp_packet->dst, icmp_packet->orig, ETH_ALEN);
		memcpy(icmp_packet->orig, ethhdr->h_dest, ETH_ALEN);
		memcpy(icmp_packet->orig,
		       bat_priv->primary_if->net_dev->dev_addr, ETH_ALEN);
		icmp_packet->msg_type = TTL_EXCEEDED;
		icmp_packet->ttl = TTL;