Author: marek Date: 2010-07-25 02:16:04 +0200 (Sun, 25 Jul 2010) New Revision: 1746
Modified: trunk/batman-adv/icmp_socket.c trunk/batman-adv/types.h Log: 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: Marek Lindner lindner_marek@yahoo.de
Modified: trunk/batman-adv/icmp_socket.c =================================================================== --- trunk/batman-adv/icmp_socket.c 2010-07-24 17:52:55 UTC (rev 1745) +++ trunk/batman-adv/icmp_socket.c 2010-07-25 00:16:04 UTC (rev 1746) @@ -69,6 +69,7 @@ INIT_LIST_HEAD(&socket_client->queue_list); socket_client->queue_len = 0; socket_client->index = i; + socket_client->bat_priv = inode->i_private; spin_lock_init(&socket_client->lock); init_waitqueue_head(&socket_client->queue_wait);
@@ -153,9 +154,8 @@ static ssize_t bat_socket_write(struct file *file, const char __user *buff, 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 bat_priv *bat_priv = socket_client->bat_priv; struct sk_buff *skb; struct icmp_packet_rr *icmp_packet; struct orig_node *orig_node; @@ -171,6 +171,9 @@ return -EINVAL; }
+ if (!bat_priv->primary_if) + return -EFAULT; + if (len >= sizeof(struct icmp_packet_rr)) packet_len = sizeof(struct icmp_packet_rr);
@@ -239,7 +242,8 @@ if (batman_if->if_status != IF_ACTIVE) 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)) memcpy(icmp_packet->rr, batman_if->net_dev->dev_addr, ETH_ALEN); @@ -289,7 +293,7 @@ goto err;
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) goto err;
Modified: trunk/batman-adv/types.h =================================================================== --- trunk/batman-adv/types.h 2010-07-24 17:52:55 UTC (rev 1745) +++ trunk/batman-adv/types.h 2010-07-25 00:16:04 UTC (rev 1746) @@ -142,6 +142,7 @@ unsigned char index; spinlock_t lock; wait_queue_head_t queue_wait; + struct bat_priv *bat_priv; };
struct socket_packet {