Documentation/cImages/baseline-8.3.ndz: patch-01-ibss-fix.diff

File patch-01-ibss-fix.diff, 3.0 KB (added by mcgrof, 11 years ago)

A Solution to Ad-Hoc BSSID Partitioning Problems

  • net80211/ieee80211_node.c

    A Solution to Ad-Hoc BSSID Partitioning Problems
    
    http://orbit-lab.org/wiki/HowTo/bssidFix
    
    When wifi network cards are placed in ad-hoc mode (iwconfig ath0 mode 'ad-hoc')
    they will automatically search for networks with the same essid (iwconfig ath0
    essid 'blah'). They will adopt the bssid of the first node to turn on that has
    the specified essid.
    
    Unfortunately, this algorithm and/or implementation is not very good and even
    in relatively small networks, nodes that have the same 'essid' will end up
    with different a 'bssid'. Since the wifi card drivers filter incoming packets
    by bsssid, nodes that should be in the same ad-hoc network can't exchange
    packets.
    
    The solution to this problem can be found by modifying the madwifi drivers
    (for Atheros wifi cards only), so that the bssid a node generates is a hash
    of the essid instead of its MAC address. This ensures that nodes with identical
    essid's end up with identical bssid's.
    
    Although it has not been extensively tested with non-modified nodes, this
    modification to the madwifi drivers should be fully backwards compatible with
    non-modified nodes.
    
    Signed-Off by: Luis Rodriguez <mcgrof@winlab.rutgers.edu>
    
    diff -Naurp madwifi-3366.orig/net80211/ieee80211_node.c madwifi-3366/net80211/ieee80211_node.c
    old new  
    5353#include <net80211/ieee80211_var.h>
    5454#include <net80211/if_athproto.h>
    5555
     56static int ibss_grid = 1;
     57#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,52))
     58MODULE_PARM(ibss_grid, "i");
     59#else
     60#include <linux/moduleparam.h>
     61module_param(ibss_grid, int, 0600);
     62#endif
     63MODULE_PARM_DESC(ibss_grid, "IBSS hack based on SSID for large networks");
     64
     65
    5666/*
    5767 * Association IDs are managed with a bit vector.
    5868 */
    ieee80211_create_ibss(struct ieee80211va 
    345355                if (vap->iv_flags & IEEE80211_F_DESBSSID) {
    346356                        IEEE80211_ADDR_COPY(ni->ni_bssid, vap->iv_des_bssid);
    347357                        IEEE80211_ADDR_COPY(vap->iv_bssid, vap->iv_des_bssid);
    348                 } else {
    349                         ni->ni_bssid[0] |= 0x02;        /* local bit for IBSS */
    350                         vap->iv_bssid[0] |= 0x02;
    351                 }
     358               } else {
     359                        /* XXX: If we're on a large network then hash the SSID
     360                        * instead of the MAC address to generate the BSSID.
     361                        * This ensures that nodes with identical SSIDs end
     362                        * up with identical BSSIDs, regardless of any
     363                        * timing bugs. We might be able to fix this for good
     364                        * elsewhere */
     365                        if(ibss_grid) {
     366                                int i;
     367                                printk(KERN_INFO "net80211: IBSS BSSID "
     368                                        "generation based on hash of SSID - "
     369                                        "temporary fix for large networks\n");
     370                                for(i=0; i<IEEE80211_ADDR_LEN;i++)
     371                                        ni->ni_bssid[i] = ni->ni_essid[i %
     372                                                ni->ni_esslen];
     373                        }
     374                       else {
     375                                ni->ni_bssid[0] |= 0x02;/* local bit for IBSS */
     376                                vap->iv_bssid[0] |= 0x02;
     377                        }
     378               }
     379
    352380        } else if (vap->iv_opmode == IEEE80211_M_AHDEMO) {
    353381                if (vap->iv_flags & IEEE80211_F_DESBSSID) {
    354382                        IEEE80211_ADDR_COPY(ni->ni_bssid, vap->iv_des_bssid);