diff options
author | Antonio Quartulli <ordex@autistici.org> | 2011-07-07 09:35:37 -0400 |
---|---|---|
committer | Marek Lindner <lindner_marek@yahoo.de> | 2011-08-22 09:16:21 -0400 |
commit | 3d393e47321062dbf9078a66a7cc1c2a52bafecc (patch) | |
tree | f8e5675fd58984db15571fdc361655fbe6674241 | |
parent | 59b699cdee039d75915c354da06937102d1f9a84 (diff) |
batman-adv: implement AP-isolation on the sender side
If a node has to send a packet issued by a WIFI client to another WIFI client,
the packet is dropped.
Signed-off-by: Antonio Quartulli <ordex@autistici.org>
Signed-off-by: Marek Lindner <lindner_marek@yahoo.de>
-rw-r--r-- | net/batman-adv/routing.c | 2 | ||||
-rw-r--r-- | net/batman-adv/soft-interface.c | 3 | ||||
-rw-r--r-- | net/batman-adv/translation-table.c | 28 | ||||
-rw-r--r-- | net/batman-adv/translation-table.h | 2 | ||||
-rw-r--r-- | net/batman-adv/unicast.c | 6 |
5 files changed, 29 insertions, 12 deletions
diff --git a/net/batman-adv/routing.c b/net/batman-adv/routing.c index 13444e92bc99..91a7860ecadd 100644 --- a/net/batman-adv/routing.c +++ b/net/batman-adv/routing.c | |||
@@ -1535,7 +1535,7 @@ static int check_unicast_ttvn(struct bat_priv *bat_priv, | |||
1535 | 1535 | ||
1536 | ethhdr = (struct ethhdr *)(skb->data + | 1536 | ethhdr = (struct ethhdr *)(skb->data + |
1537 | sizeof(struct unicast_packet)); | 1537 | sizeof(struct unicast_packet)); |
1538 | orig_node = transtable_search(bat_priv, ethhdr->h_dest); | 1538 | orig_node = transtable_search(bat_priv, NULL, ethhdr->h_dest); |
1539 | 1539 | ||
1540 | if (!orig_node) { | 1540 | if (!orig_node) { |
1541 | if (!is_my_client(bat_priv, ethhdr->h_dest)) | 1541 | if (!is_my_client(bat_priv, ethhdr->h_dest)) |
diff --git a/net/batman-adv/soft-interface.c b/net/batman-adv/soft-interface.c index 9addbab52999..402fd96239d8 100644 --- a/net/batman-adv/soft-interface.c +++ b/net/batman-adv/soft-interface.c | |||
@@ -597,7 +597,8 @@ static int interface_tx(struct sk_buff *skb, struct net_device *soft_iface) | |||
597 | /* Register the client MAC in the transtable */ | 597 | /* Register the client MAC in the transtable */ |
598 | tt_local_add(soft_iface, ethhdr->h_source, skb->skb_iif); | 598 | tt_local_add(soft_iface, ethhdr->h_source, skb->skb_iif); |
599 | 599 | ||
600 | orig_node = transtable_search(bat_priv, ethhdr->h_dest); | 600 | orig_node = transtable_search(bat_priv, ethhdr->h_source, |
601 | ethhdr->h_dest); | ||
601 | if (is_multicast_ether_addr(ethhdr->h_dest) || | 602 | if (is_multicast_ether_addr(ethhdr->h_dest) || |
602 | (orig_node && orig_node->gw_flags)) { | 603 | (orig_node && orig_node->gw_flags)) { |
603 | ret = gw_is_target(bat_priv, skb, orig_node); | 604 | ret = gw_is_target(bat_priv, skb, orig_node); |
diff --git a/net/batman-adv/translation-table.c b/net/batman-adv/translation-table.c index d0ed931ad2e7..1f128e1656a7 100644 --- a/net/batman-adv/translation-table.c +++ b/net/batman-adv/translation-table.c | |||
@@ -794,29 +794,43 @@ static bool _is_ap_isolated(struct tt_local_entry *tt_local_entry, | |||
794 | } | 794 | } |
795 | 795 | ||
796 | struct orig_node *transtable_search(struct bat_priv *bat_priv, | 796 | struct orig_node *transtable_search(struct bat_priv *bat_priv, |
797 | const uint8_t *addr) | 797 | const uint8_t *src, const uint8_t *addr) |
798 | { | 798 | { |
799 | struct tt_global_entry *tt_global_entry; | 799 | struct tt_local_entry *tt_local_entry = NULL; |
800 | struct tt_global_entry *tt_global_entry = NULL; | ||
800 | struct orig_node *orig_node = NULL; | 801 | struct orig_node *orig_node = NULL; |
801 | 802 | ||
802 | tt_global_entry = tt_global_hash_find(bat_priv, addr); | 803 | if (src && atomic_read(&bat_priv->ap_isolation)) { |
804 | tt_local_entry = tt_local_hash_find(bat_priv, src); | ||
805 | if (!tt_local_entry) | ||
806 | goto out; | ||
807 | } | ||
803 | 808 | ||
809 | tt_global_entry = tt_global_hash_find(bat_priv, addr); | ||
804 | if (!tt_global_entry) | 810 | if (!tt_global_entry) |
805 | goto out; | 811 | goto out; |
806 | 812 | ||
813 | /* check whether the clients should not communicate due to AP | ||
814 | * isolation */ | ||
815 | if (tt_local_entry && _is_ap_isolated(tt_local_entry, tt_global_entry)) | ||
816 | goto out; | ||
817 | |||
807 | if (!atomic_inc_not_zero(&tt_global_entry->orig_node->refcount)) | 818 | if (!atomic_inc_not_zero(&tt_global_entry->orig_node->refcount)) |
808 | goto free_tt; | 819 | goto out; |
809 | 820 | ||
810 | /* A global client marked as PENDING has already moved from that | 821 | /* A global client marked as PENDING has already moved from that |
811 | * originator */ | 822 | * originator */ |
812 | if (tt_global_entry->flags & TT_CLIENT_PENDING) | 823 | if (tt_global_entry->flags & TT_CLIENT_PENDING) |
813 | goto free_tt; | 824 | goto out; |
814 | 825 | ||
815 | orig_node = tt_global_entry->orig_node; | 826 | orig_node = tt_global_entry->orig_node; |
816 | 827 | ||
817 | free_tt: | ||
818 | tt_global_entry_free_ref(tt_global_entry); | ||
819 | out: | 828 | out: |
829 | if (tt_global_entry) | ||
830 | tt_global_entry_free_ref(tt_global_entry); | ||
831 | if (tt_local_entry) | ||
832 | tt_local_entry_free_ref(tt_local_entry); | ||
833 | |||
820 | return orig_node; | 834 | return orig_node; |
821 | } | 835 | } |
822 | 836 | ||
diff --git a/net/batman-adv/translation-table.h b/net/batman-adv/translation-table.h index f1d148ef0e36..b47e8760b76b 100644 --- a/net/batman-adv/translation-table.h +++ b/net/batman-adv/translation-table.h | |||
@@ -43,7 +43,7 @@ void tt_global_del(struct bat_priv *bat_priv, | |||
43 | struct orig_node *orig_node, const unsigned char *addr, | 43 | struct orig_node *orig_node, const unsigned char *addr, |
44 | const char *message, bool roaming); | 44 | const char *message, bool roaming); |
45 | struct orig_node *transtable_search(struct bat_priv *bat_priv, | 45 | struct orig_node *transtable_search(struct bat_priv *bat_priv, |
46 | const uint8_t *addr); | 46 | const uint8_t *src, const uint8_t *addr); |
47 | void tt_save_orig_buffer(struct bat_priv *bat_priv, struct orig_node *orig_node, | 47 | void tt_save_orig_buffer(struct bat_priv *bat_priv, struct orig_node *orig_node, |
48 | const unsigned char *tt_buff, uint8_t tt_num_changes); | 48 | const unsigned char *tt_buff, uint8_t tt_num_changes); |
49 | uint16_t tt_local_crc(struct bat_priv *bat_priv); | 49 | uint16_t tt_local_crc(struct bat_priv *bat_priv); |
diff --git a/net/batman-adv/unicast.c b/net/batman-adv/unicast.c index 32b125fb3d3b..07d1c1da89dd 100644 --- a/net/batman-adv/unicast.c +++ b/net/batman-adv/unicast.c | |||
@@ -299,8 +299,10 @@ int unicast_send_skb(struct sk_buff *skb, struct bat_priv *bat_priv) | |||
299 | goto find_router; | 299 | goto find_router; |
300 | } | 300 | } |
301 | 301 | ||
302 | /* check for tt host - increases orig_node refcount */ | 302 | /* check for tt host - increases orig_node refcount. |
303 | orig_node = transtable_search(bat_priv, ethhdr->h_dest); | 303 | * returns NULL in case of AP isolation */ |
304 | orig_node = transtable_search(bat_priv, ethhdr->h_source, | ||
305 | ethhdr->h_dest); | ||
304 | 306 | ||
305 | find_router: | 307 | find_router: |
306 | /** | 308 | /** |