diff options
| -rw-r--r-- | Documentation/ABI/testing/sysfs-class-net-mesh | 8 | ||||
| -rw-r--r-- | net/batman-adv/Kconfig | 14 | ||||
| -rw-r--r-- | net/batman-adv/Makefile | 1 | ||||
| -rw-r--r-- | net/batman-adv/bat_iv_ogm.c | 5 | ||||
| -rw-r--r-- | net/batman-adv/debugfs.c | 18 | ||||
| -rw-r--r-- | net/batman-adv/distributed-arp-table.c | 22 | ||||
| -rw-r--r-- | net/batman-adv/main.c | 6 | ||||
| -rw-r--r-- | net/batman-adv/main.h | 12 | ||||
| -rw-r--r-- | net/batman-adv/network-coding.c | 1821 | ||||
| -rw-r--r-- | net/batman-adv/network-coding.h | 123 | ||||
| -rw-r--r-- | net/batman-adv/originator.c | 6 | ||||
| -rw-r--r-- | net/batman-adv/packet.h | 33 | ||||
| -rw-r--r-- | net/batman-adv/routing.c | 49 | ||||
| -rw-r--r-- | net/batman-adv/send.c | 5 | ||||
| -rw-r--r-- | net/batman-adv/soft-interface.c | 14 | ||||
| -rw-r--r-- | net/batman-adv/sysfs.c | 16 | ||||
| -rw-r--r-- | net/batman-adv/translation-table.c | 29 | ||||
| -rw-r--r-- | net/batman-adv/types.h | 136 | ||||
| -rw-r--r-- | net/batman-adv/unicast.c | 6 |
19 files changed, 2259 insertions, 65 deletions
diff --git a/Documentation/ABI/testing/sysfs-class-net-mesh b/Documentation/ABI/testing/sysfs-class-net-mesh index bc41da61608d..bdcd8b4e38f2 100644 --- a/Documentation/ABI/testing/sysfs-class-net-mesh +++ b/Documentation/ABI/testing/sysfs-class-net-mesh | |||
| @@ -67,6 +67,14 @@ Description: | |||
| 67 | Defines the penalty which will be applied to an | 67 | Defines the penalty which will be applied to an |
| 68 | originator message's tq-field on every hop. | 68 | originator message's tq-field on every hop. |
| 69 | 69 | ||
| 70 | What: /sys/class/net/<mesh_iface>/mesh/network_coding | ||
| 71 | Date: Nov 2012 | ||
| 72 | Contact: Martin Hundeboll <martin@hundeboll.net> | ||
| 73 | Description: | ||
| 74 | Controls whether Network Coding (using some magic | ||
| 75 | to send fewer wifi packets but still the same | ||
| 76 | content) is enabled or not. | ||
| 77 | |||
| 70 | What: /sys/class/net/<mesh_iface>/mesh/orig_interval | 78 | What: /sys/class/net/<mesh_iface>/mesh/orig_interval |
| 71 | Date: May 2010 | 79 | Date: May 2010 |
| 72 | Contact: Marek Lindner <lindner_marek@yahoo.de> | 80 | Contact: Marek Lindner <lindner_marek@yahoo.de> |
diff --git a/net/batman-adv/Kconfig b/net/batman-adv/Kconfig index 8d8afb134b3a..fa780b76630e 100644 --- a/net/batman-adv/Kconfig +++ b/net/batman-adv/Kconfig | |||
| @@ -36,6 +36,20 @@ config BATMAN_ADV_DAT | |||
| 36 | mesh networks. If you think that your network does not need | 36 | mesh networks. If you think that your network does not need |
| 37 | this option you can safely remove it and save some space. | 37 | this option you can safely remove it and save some space. |
| 38 | 38 | ||
| 39 | config BATMAN_ADV_NC | ||
| 40 | bool "Network Coding" | ||
| 41 | depends on BATMAN_ADV | ||
| 42 | default n | ||
| 43 | help | ||
| 44 | This option enables network coding, a mechanism that aims to | ||
| 45 | increase the overall network throughput by fusing multiple | ||
| 46 | packets in one transmission. | ||
| 47 | Note that interfaces controlled by batman-adv must be manually | ||
| 48 | configured to have promiscuous mode enabled in order to make | ||
| 49 | network coding work. | ||
| 50 | If you think that your network does not need this feature you | ||
| 51 | can safely disable it and save some space. | ||
| 52 | |||
| 39 | config BATMAN_ADV_DEBUG | 53 | config BATMAN_ADV_DEBUG |
| 40 | bool "B.A.T.M.A.N. debugging" | 54 | bool "B.A.T.M.A.N. debugging" |
| 41 | depends on BATMAN_ADV | 55 | depends on BATMAN_ADV |
diff --git a/net/batman-adv/Makefile b/net/batman-adv/Makefile index e45e3b4e32e3..4b8f192a9e43 100644 --- a/net/batman-adv/Makefile +++ b/net/batman-adv/Makefile | |||
| @@ -30,6 +30,7 @@ batman-adv-y += hard-interface.o | |||
| 30 | batman-adv-y += hash.o | 30 | batman-adv-y += hash.o |
| 31 | batman-adv-y += icmp_socket.o | 31 | batman-adv-y += icmp_socket.o |
| 32 | batman-adv-y += main.o | 32 | batman-adv-y += main.o |
| 33 | batman-adv-$(CONFIG_BATMAN_ADV_NC) += network-coding.o | ||
| 33 | batman-adv-y += originator.o | 34 | batman-adv-y += originator.o |
| 34 | batman-adv-y += ring_buffer.o | 35 | batman-adv-y += ring_buffer.o |
| 35 | batman-adv-y += routing.o | 36 | batman-adv-y += routing.o |
diff --git a/net/batman-adv/bat_iv_ogm.c b/net/batman-adv/bat_iv_ogm.c index a5bb0a769eb9..071f288b77a8 100644 --- a/net/batman-adv/bat_iv_ogm.c +++ b/net/batman-adv/bat_iv_ogm.c | |||
| @@ -27,6 +27,7 @@ | |||
| 27 | #include "hard-interface.h" | 27 | #include "hard-interface.h" |
| 28 | #include "send.h" | 28 | #include "send.h" |
| 29 | #include "bat_algo.h" | 29 | #include "bat_algo.h" |
| 30 | #include "network-coding.h" | ||
| 30 | 31 | ||
| 31 | static struct batadv_neigh_node * | 32 | static struct batadv_neigh_node * |
| 32 | batadv_iv_ogm_neigh_new(struct batadv_hard_iface *hard_iface, | 33 | batadv_iv_ogm_neigh_new(struct batadv_hard_iface *hard_iface, |
| @@ -1185,6 +1186,10 @@ static void batadv_iv_ogm_process(const struct ethhdr *ethhdr, | |||
| 1185 | if (!orig_neigh_node) | 1186 | if (!orig_neigh_node) |
| 1186 | goto out; | 1187 | goto out; |
| 1187 | 1188 | ||
| 1189 | /* Update nc_nodes of the originator */ | ||
| 1190 | batadv_nc_update_nc_node(bat_priv, orig_node, orig_neigh_node, | ||
| 1191 | batadv_ogm_packet, is_single_hop_neigh); | ||
| 1192 | |||
| 1188 | orig_neigh_router = batadv_orig_node_get_router(orig_neigh_node); | 1193 | orig_neigh_router = batadv_orig_node_get_router(orig_neigh_node); |
| 1189 | 1194 | ||
| 1190 | /* drop packet if sender is not a direct neighbor and if we | 1195 | /* drop packet if sender is not a direct neighbor and if we |
diff --git a/net/batman-adv/debugfs.c b/net/batman-adv/debugfs.c index 6ae86516db4d..f186a55b23c3 100644 --- a/net/batman-adv/debugfs.c +++ b/net/batman-adv/debugfs.c | |||
| @@ -32,6 +32,7 @@ | |||
| 32 | #include "icmp_socket.h" | 32 | #include "icmp_socket.h" |
| 33 | #include "bridge_loop_avoidance.h" | 33 | #include "bridge_loop_avoidance.h" |
| 34 | #include "distributed-arp-table.h" | 34 | #include "distributed-arp-table.h" |
| 35 | #include "network-coding.h" | ||
| 35 | 36 | ||
| 36 | static struct dentry *batadv_debugfs; | 37 | static struct dentry *batadv_debugfs; |
| 37 | 38 | ||
| @@ -310,6 +311,14 @@ struct batadv_debuginfo { | |||
| 310 | const struct file_operations fops; | 311 | const struct file_operations fops; |
| 311 | }; | 312 | }; |
| 312 | 313 | ||
| 314 | #ifdef CONFIG_BATMAN_ADV_NC | ||
| 315 | static int batadv_nc_nodes_open(struct inode *inode, struct file *file) | ||
| 316 | { | ||
| 317 | struct net_device *net_dev = (struct net_device *)inode->i_private; | ||
| 318 | return single_open(file, batadv_nc_nodes_seq_print_text, net_dev); | ||
| 319 | } | ||
| 320 | #endif | ||
| 321 | |||
| 313 | #define BATADV_DEBUGINFO(_name, _mode, _open) \ | 322 | #define BATADV_DEBUGINFO(_name, _mode, _open) \ |
| 314 | struct batadv_debuginfo batadv_debuginfo_##_name = { \ | 323 | struct batadv_debuginfo batadv_debuginfo_##_name = { \ |
| 315 | .attr = { .name = __stringify(_name), \ | 324 | .attr = { .name = __stringify(_name), \ |
| @@ -348,6 +357,9 @@ static BATADV_DEBUGINFO(dat_cache, S_IRUGO, batadv_dat_cache_open); | |||
| 348 | static BATADV_DEBUGINFO(transtable_local, S_IRUGO, | 357 | static BATADV_DEBUGINFO(transtable_local, S_IRUGO, |
| 349 | batadv_transtable_local_open); | 358 | batadv_transtable_local_open); |
| 350 | static BATADV_DEBUGINFO(vis_data, S_IRUGO, batadv_vis_data_open); | 359 | static BATADV_DEBUGINFO(vis_data, S_IRUGO, batadv_vis_data_open); |
| 360 | #ifdef CONFIG_BATMAN_ADV_NC | ||
| 361 | static BATADV_DEBUGINFO(nc_nodes, S_IRUGO, batadv_nc_nodes_open); | ||
| 362 | #endif | ||
| 351 | 363 | ||
| 352 | static struct batadv_debuginfo *batadv_mesh_debuginfos[] = { | 364 | static struct batadv_debuginfo *batadv_mesh_debuginfos[] = { |
| 353 | &batadv_debuginfo_originators, | 365 | &batadv_debuginfo_originators, |
| @@ -362,6 +374,9 @@ static struct batadv_debuginfo *batadv_mesh_debuginfos[] = { | |||
| 362 | #endif | 374 | #endif |
| 363 | &batadv_debuginfo_transtable_local, | 375 | &batadv_debuginfo_transtable_local, |
| 364 | &batadv_debuginfo_vis_data, | 376 | &batadv_debuginfo_vis_data, |
| 377 | #ifdef CONFIG_BATMAN_ADV_NC | ||
| 378 | &batadv_debuginfo_nc_nodes, | ||
| 379 | #endif | ||
| 365 | NULL, | 380 | NULL, |
| 366 | }; | 381 | }; |
| 367 | 382 | ||
| @@ -431,6 +446,9 @@ int batadv_debugfs_add_meshif(struct net_device *dev) | |||
| 431 | } | 446 | } |
| 432 | } | 447 | } |
| 433 | 448 | ||
| 449 | if (batadv_nc_init_debugfs(bat_priv) < 0) | ||
| 450 | goto rem_attr; | ||
| 451 | |||
| 434 | return 0; | 452 | return 0; |
| 435 | rem_attr: | 453 | rem_attr: |
| 436 | debugfs_remove_recursive(bat_priv->debug_dir); | 454 | debugfs_remove_recursive(bat_priv->debug_dir); |
diff --git a/net/batman-adv/distributed-arp-table.c b/net/batman-adv/distributed-arp-table.c index d54188a112ea..8e15d966d9b0 100644 --- a/net/batman-adv/distributed-arp-table.c +++ b/net/batman-adv/distributed-arp-table.c | |||
| @@ -816,7 +816,6 @@ bool batadv_dat_snoop_outgoing_arp_request(struct batadv_priv *bat_priv, | |||
| 816 | bool ret = false; | 816 | bool ret = false; |
| 817 | struct batadv_dat_entry *dat_entry = NULL; | 817 | struct batadv_dat_entry *dat_entry = NULL; |
| 818 | struct sk_buff *skb_new; | 818 | struct sk_buff *skb_new; |
| 819 | struct batadv_hard_iface *primary_if = NULL; | ||
| 820 | 819 | ||
| 821 | if (!atomic_read(&bat_priv->distributed_arp_table)) | 820 | if (!atomic_read(&bat_priv->distributed_arp_table)) |
| 822 | goto out; | 821 | goto out; |
| @@ -838,22 +837,18 @@ bool batadv_dat_snoop_outgoing_arp_request(struct batadv_priv *bat_priv, | |||
| 838 | 837 | ||
| 839 | dat_entry = batadv_dat_entry_hash_find(bat_priv, ip_dst); | 838 | dat_entry = batadv_dat_entry_hash_find(bat_priv, ip_dst); |
| 840 | if (dat_entry) { | 839 | if (dat_entry) { |
| 841 | primary_if = batadv_primary_if_get_selected(bat_priv); | ||
| 842 | if (!primary_if) | ||
| 843 | goto out; | ||
| 844 | |||
| 845 | skb_new = arp_create(ARPOP_REPLY, ETH_P_ARP, ip_src, | 840 | skb_new = arp_create(ARPOP_REPLY, ETH_P_ARP, ip_src, |
| 846 | primary_if->soft_iface, ip_dst, hw_src, | 841 | bat_priv->soft_iface, ip_dst, hw_src, |
| 847 | dat_entry->mac_addr, hw_src); | 842 | dat_entry->mac_addr, hw_src); |
| 848 | if (!skb_new) | 843 | if (!skb_new) |
| 849 | goto out; | 844 | goto out; |
