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

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

Staging: batman-adv: fix batman icmp originating from secondary interface



If a batman icmp packet had to be routed over a secondary interface
at the first hop, the mac address of that secondary interface would
be written in the 'orig' field of the icmp packet. A node which is
more than one hop away is not aware of the mac address because
secondary interfaces are not flooded through the whole mesh and
therefore can't send a reply.
This patch always sends the mac address of the primary interface
in the 'orig' field of the icmp packet.

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 9abc1023
Loading
Loading
Loading
Loading
+8 −4
Original line number Original line Diff line number Diff line
@@ -67,6 +67,7 @@ static int bat_socket_open(struct inode *inode, struct file *file)
	INIT_LIST_HEAD(&socket_client->queue_list);
	INIT_LIST_HEAD(&socket_client->queue_list);
	socket_client->queue_len = 0;
	socket_client->queue_len = 0;
	socket_client->index = i;
	socket_client->index = i;
	socket_client->bat_priv = inode->i_private;
	spin_lock_init(&socket_client->lock);
	spin_lock_init(&socket_client->lock);
	init_waitqueue_head(&socket_client->queue_wait);
	init_waitqueue_head(&socket_client->queue_wait);


@@ -151,9 +152,8 @@ static ssize_t bat_socket_read(struct file *file, char __user *buf,
static ssize_t bat_socket_write(struct file *file, const char __user *buff,
static ssize_t bat_socket_write(struct file *file, const char __user *buff,
				size_t len, loff_t *off)
				size_t len, loff_t *off)
{
{
	/* FIXME: each orig_node->batman_if will be attached to a softif */
	struct bat_priv *bat_priv = netdev_priv(soft_device);
	struct socket_client *socket_client = file->private_data;
	struct socket_client *socket_client = file->private_data;
	struct bat_priv *bat_priv = socket_client->bat_priv;
	struct icmp_packet_rr icmp_packet;
	struct icmp_packet_rr icmp_packet;
	struct orig_node *orig_node;
	struct orig_node *orig_node;
	struct batman_if *batman_if;
	struct batman_if *batman_if;
@@ -168,6 +168,9 @@ static ssize_t bat_socket_write(struct file *file, const char __user *buff,
		return -EINVAL;
		return -EINVAL;
	}
	}


	if (!bat_priv->primary_if)
		return -EFAULT;

	if (len >= sizeof(struct icmp_packet_rr))
	if (len >= sizeof(struct icmp_packet_rr))
		packet_len = sizeof(struct icmp_packet_rr);
		packet_len = sizeof(struct icmp_packet_rr);


@@ -223,7 +226,8 @@ static ssize_t bat_socket_write(struct file *file, const char __user *buff,
	if (batman_if->if_status != IF_ACTIVE)
	if (batman_if->if_status != IF_ACTIVE)
		goto dst_unreach;
		goto dst_unreach;


	memcpy(icmp_packet.orig, batman_if->net_dev->dev_addr, ETH_ALEN);
	memcpy(icmp_packet.orig,
	       bat_priv->primary_if->net_dev->dev_addr, ETH_ALEN);


	if (packet_len == sizeof(struct icmp_packet_rr))
	if (packet_len == sizeof(struct icmp_packet_rr))
		memcpy(icmp_packet.rr, batman_if->net_dev->dev_addr, ETH_ALEN);
		memcpy(icmp_packet.rr, batman_if->net_dev->dev_addr, ETH_ALEN);
@@ -271,7 +275,7 @@ int bat_socket_setup(struct bat_priv *bat_priv)
		goto err;
		goto err;


	d = debugfs_create_file(ICMP_SOCKET, S_IFREG | S_IWUSR | S_IRUSR,
	d = debugfs_create_file(ICMP_SOCKET, S_IFREG | S_IWUSR | S_IRUSR,
				bat_priv->debug_dir, NULL, &fops);
				bat_priv->debug_dir, bat_priv, &fops);
	if (d)
	if (d)
		goto err;
		goto err;


+1 −0
Original line number Original line Diff line number Diff line
@@ -126,6 +126,7 @@ struct socket_client {
	unsigned char index;
	unsigned char index;
	spinlock_t lock;
	spinlock_t lock;
	wait_queue_head_t queue_wait;
	wait_queue_head_t queue_wait;
	struct bat_priv *bat_priv;
};
};


struct socket_packet {
struct socket_packet {