Ticket #91: true_wds.diff

File true_wds.diff, 9.8 kB (added by rudger@hopling.com, 7 years ago)

Diff for the WDS implementation enhancement (diffed against revision nr 1234).

  • net80211/ieee80211_ioctl.h

    old new  
    517517#define IEEE80211_IOCTL_CHANSWITCH      (SIOCIWFIRSTPRIV+16) 
    518518#define IEEE80211_IOCTL_SETMODE         (SIOCIWFIRSTPRIV+17) 
    519519#define IEEE80211_IOCTL_GETMODE         (SIOCIWFIRSTPRIV+18) 
     520#define IEEE80211_IOCTL_WDSADDMAC       (SIOCIWFIRSTPRIV+19) 
     521#define IEEE80211_IOCTL_WDSDELMAC       (SIOCIWFIRSTPRIV+20) 
    520522enum { 
    521523        IEEE80211_WMMPARAMS_CWMIN       = 1, 
    522524        IEEE80211_WMMPARAMS_CWMAX       = 2, 
  • net80211/ieee80211.c

    old new  
    7070 
    7171MALLOC_DEFINE(M_80211_VAP, "80211vap", "802.11 vap state"); 
    7272 
    73  
    7473/* 
    7574 * Country Code Table for code-to-string conversion. 
    7675 */ 
     
    519518        ieee80211_node_latevattach(vap);        /* XXX move into vattach */ 
    520519        ieee80211_power_latevattach(vap);       /* XXX move into vattach */ 
    521520 
     521        memset(vap->wds_mac, 0x00, IEEE80211_ADDR_LEN); 
     522 
    522523        (void) ieee80211_media_setup(ic, &vap->iv_media, 
    523524                vap->iv_caps, media_change, media_status); 
    524525        ieee80211_media_status(dev, &imr); 
  • net80211/ieee80211_node.c

    old new  
    850850/* Add wds address to the node table */ 
    851851int 
    852852ieee80211_add_wds_addr(struct ieee80211_node_table *nt, 
    853                        struct ieee80211_node *ni, const u_int8_t *macaddr
     853                       struct ieee80211_node *ni, const u_int8_t *macaddr, u_int8_t wds_static
    854854{ 
    855855        int hash; 
    856856        struct ieee80211_wds_addr *wds; 
     
    861861                /* XXX msg */ 
    862862                return 1; 
    863863        } 
    864         wds->wds_agingcount = WDS_AGING_COUNT; 
     864        if (wds_static) 
     865                wds->wds_agingcount = WDS_AGING_STATIC; 
     866        else 
     867                wds->wds_agingcount = WDS_AGING_COUNT; 
    865868        hash = IEEE80211_NODE_HASH(macaddr); 
    866869        IEEE80211_ADDR_COPY(wds->wds_macaddr, macaddr); 
    867870        ieee80211_ref_node(ni);         /* Reference node */ 
     
    875878 
    876879/* remove wds address from the wds hash table */ 
    877880void 
    878 ieee80211_remove_wds_addr(struct ieee80211_node_table *nt,  
     881ieee80211_remove_wds_addr(struct ieee80211_node_table *nt, 
    879882                                           const u_int8_t *macaddr) 
    880883{ 
    881884        int hash; 
     
    928931        IEEE80211_NODE_LOCK_BH(nt); 
    929932        for (hash=0; hash<IEEE80211_NODE_HASHSIZE; hash++) { 
    930933                LIST_FOREACH(wds, &nt->nt_wds_hash[hash], wds_hash) { 
    931                         if (!wds->wds_agingcount) { 
    932                                 ieee80211_free_node(wds->wds_ni);  /* Decrement ref count */ 
    933                                 LIST_REMOVE(wds, wds_hash); 
    934                                 FREE(wds, M_80211_WDS); 
    935                         } else { 
    936                                 wds->wds_agingcount--; 
    937                         } 
     934                        if (wds->wds_agingcount != WDS_AGING_STATIC) { 
     935                                if (!wds->wds_agingcount) { 
     936                                        ieee80211_free_node(wds->wds_ni);  /* Decrement ref count */ 
     937                                        LIST_REMOVE(wds, wds_hash); 
     938                                        FREE(wds, M_80211_WDS); 
     939                                } else { 
     940                                        wds->wds_agingcount--; 
     941                                } 
     942                    } 
    938943                } 
    939944        } 
    940945        IEEE80211_NODE_UNLOCK_BH(nt); 
     
    10171022        LIST_FOREACH(wds, &nt->nt_wds_hash[hash], wds_hash) { 
    10181023                if (IEEE80211_ADDR_EQ(wds->wds_macaddr, macaddr)) { 
    10191024                        ni = wds->wds_ni; 
    1020                         wds->wds_agingcount = WDS_AGING_COUNT; /* reset the aging count */ 
     1025                        if (wds->wds_agingcount != WDS_AGING_STATIC) 
     1026                                wds->wds_agingcount = WDS_AGING_COUNT; /* reset the aging count */ 
    10211027                        ieee80211_ref_node(ni); 
    10221028                        return ni; 
    10231029                } 
  • net80211/ieee80211_node.h

    old new  
    224224 
    225225#define WDS_AGING_TIME  600   /* 10 minutes */  
    226226#define WDS_AGING_COUNT 2  
     227#define WDS_AGING_STATIC 0xffff 
    227228#define WDS_AGING_TIMER_VAL (WDS_AGING_TIME/2) 
    228229 
    229230struct ieee80211_wds_addr { 
     
    291292                struct ieee80211vap *, const u_int8_t *); 
    292293#endif 
    293294int     ieee80211_add_wds_addr(struct ieee80211_node_table *, 
    294                                struct ieee80211_node *, const u_int8_t *); 
     295                               struct ieee80211_node *, const u_int8_t *, u_int8_t); 
    295296void    ieee80211_remove_wds_addr(struct ieee80211_node_table *, 
    296297                                                          const u_int8_t *); 
    297298void    ieee80211_del_wds_node(struct ieee80211_node_table *, 
  • net80211/ieee80211_wireless.c

    old new  
    27962796} 
    27972797 
    27982798static int 
     2799ieee80211_ioctl_wdsmac(struct net_device *dev, struct iw_request_info *info, 
     2800                         void *w, char *extra) 
     2801{ 
     2802        struct ieee80211vap *vap = dev->priv; 
     2803        struct sockaddr *sa = (struct sockaddr *)extra; 
     2804        struct ieee80211com *ic = vap->iv_ic; 
     2805        struct ieee80211_node *ni; 
     2806 
     2807        if (!IEEE80211_ADDR_NULL(vap->wds_mac)) { 
     2808                printk("%s: Device already has WDS mac address attached, remove first\n", dev->name); 
     2809                goto wdsmac_fail; 
     2810        } 
     2811 
     2812        memcpy(vap->wds_mac, sa->sa_data, IEEE80211_ADDR_LEN); 
     2813 
     2814        ni = ieee80211_alloc_node(&ic->ic_sta, vap, vap->wds_mac); 
     2815        if (ni != NULL) { 
     2816                if (ieee80211_add_wds_addr(&ic->ic_sta, ni, vap->wds_mac, 1) == 0) 
     2817                        ieee80211_node_authorize(ni); 
     2818                else 
     2819                        goto wdsmac_fail; 
     2820        } 
     2821        else 
     2822                goto wdsmac_fail; 
     2823 
     2824        printk("%s: Added WDS MAC: %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x\n", dev->name, 
     2825                vap->wds_mac[0], vap->wds_mac[1], vap->wds_mac[2], 
     2826                vap->wds_mac[3], vap->wds_mac[4], vap->wds_mac[5]); 
     2827 
     2828        return 0; 
     2829 
     2830wdsmac_fail: 
     2831 
     2832        printk("%s: Failed to add WDS MAC: %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x\n", dev->name, 
     2833                sa->sa_data[0], sa->sa_data[1], sa->sa_data[2], 
     2834                sa->sa_data[3], sa->sa_data[4], sa->sa_data[5]); 
     2835 
     2836        return -1; 
     2837} 
     2838 
     2839static int 
     2840ieee80211_ioctl_wdsdelmac(struct net_device *dev, struct iw_request_info *info, 
     2841                         void *w, char *extra) 
     2842{ 
     2843        struct ieee80211vap *vap = dev->priv; 
     2844        struct sockaddr *sa = (struct sockaddr *)extra; 
     2845        struct ieee80211com *ic = vap->iv_ic; 
     2846        struct ieee80211_node *ni; 
     2847 
     2848        /* WDS Mac address filed already? */ 
     2849        if (IEEE80211_ADDR_NULL(vap->wds_mac)) { 
     2850                return 0; 
     2851        } 
     2852 
     2853        /* Compare suplied MAC address with WDS MAC of this interface  
     2854         * remove when mac address is known 
     2855         */ 
     2856        if (memcmp(vap->wds_mac, sa->sa_data, IEEE80211_ADDR_LEN) == 0) 
     2857        { 
     2858                ni = ieee80211_find_wds_node(&ic->ic_sta,vap->wds_mac); 
     2859                if(ni) { 
     2860                 ieee80211_free_node(ni); /* Decr ref count */ 
     2861                } 
     2862                memset(vap->wds_mac, 0x00, IEEE80211_ADDR_LEN); 
     2863                return 0;                         
     2864        } 
     2865 
     2866        printk("%s: WDS MAC address (%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x) not known by this interface\n", dev->name, 
     2867                sa->sa_data[0], sa->sa_data[1], sa->sa_data[2], 
     2868                sa->sa_data[3], sa->sa_data[4], sa->sa_data[5]); 
     2869 
     2870        return -1; 
     2871} 
     2872 
     2873static int 
    27992874ieee80211_ioctl_addmac(struct net_device *dev, struct iw_request_info *info, 
    28002875                         void *w, char *extra) 
    28012876{ 
     
    34233498          IW_PRIV_TYPE_ADDR | IW_PRIV_SIZE_FIXED | 1, 0,"addmac" }, 
    34243499        { IEEE80211_IOCTL_DELMAC, 
    34253500          IW_PRIV_TYPE_ADDR | IW_PRIV_SIZE_FIXED | 1, 0,"delmac" }, 
     3501        { IEEE80211_IOCTL_WDSADDMAC, 
     3502          IW_PRIV_TYPE_ADDR | IW_PRIV_SIZE_FIXED | 1, 0,"wds_add" }, 
     3503        { IEEE80211_IOCTL_WDSDELMAC, 
     3504          IW_PRIV_TYPE_ADDR | IW_PRIV_SIZE_FIXED | 1, 0,"wds_del" }, 
    34263505        { IEEE80211_IOCTL_SETCHANLIST, 
    34273506          IW_PRIV_TYPE_CHANLIST | IW_PRIV_SIZE_FIXED, 0,"setchanlist" }, 
    34283507        { IEEE80211_IOCTL_GETCHANLIST, 
     
    37993878        (iw_handler) ieee80211_ioctl_chanswitch,        /* SIOCWFIRSTPRIV+16 */ 
    38003879        (iw_handler) ieee80211_ioctl_setmode,           /* SIOCWFIRSTPRIV+17 */ 
    38013880        (iw_handler) ieee80211_ioctl_getmode,           /* SIOCWFIRSTPRIV+18 */ 
     3881        (iw_handler) ieee80211_ioctl_wdsmac,            /* SIOCWFIRSTPRIV+19 */ 
     3882        (iw_handler) ieee80211_ioctl_wdsdelmac,         /* SIOCWFIRSTPRIV+20 */ 
    38023883}; 
    38033884static struct iw_handler_def ieee80211_iw_handler_def = { 
    38043885#define N(a)    (sizeof (a) / sizeof (a[0])) 
  • net80211/ieee80211_input.c

    old new  
    463463                                                station. remove the reference to  the previous statation add  
    464464                                                reference to the new one */ 
    465465                                         (void) ieee80211_remove_wds_addr(nt,wh4->i_addr4); 
    466                                          ieee80211_add_wds_addr(nt, ni, wh4->i_addr4); 
     466                                         ieee80211_add_wds_addr(nt, ni, wh4->i_addr4, 0); 
    467467                                 } 
    468468                                 if (ni_wds == NULL) { 
    469                                          ieee80211_add_wds_addr(nt, ni, wh4->i_addr4); 
     469                                         ieee80211_add_wds_addr(nt, ni, wh4->i_addr4, 0); 
    470470                                 } else 
    471471                                         ieee80211_free_node(ni_wds); /* Decr ref count */ 
    472472                         } 
  • net80211/ieee80211_output.c

    old new  
    236236         * things like power save. 
    237237         */ 
    238238        eh = (struct ether_header *)skb->data; 
    239         ni = ieee80211_find_txnode(vap, eh->ether_dhost); 
     239        if (vap->iv_opmode == IEEE80211_M_WDS) 
     240                ni = ieee80211_find_txnode(vap, vap->wds_mac); 
     241        else 
     242                ni = ieee80211_find_txnode(vap, eh->ether_dhost); 
     243 
    240244        if (ni == NULL) { 
    241245                /* NB: ieee80211_find_txnode does stat+msg */ 
    242246                goto bad; 
     
    831835                                 if(ni_wds) { 
    832836                                         ieee80211_free_node(ni_wds); /* Decr ref count */ 
    833837                                 } else { 
    834                                          ieee80211_add_wds_addr(nt, ni, eh.ether_shost); 
     838                                         ieee80211_add_wds_addr(nt, ni, eh.ether_shost, 0); 
    835839                                 } 
    836840                        } 
    837841                } 
  • net80211/ieee80211_var.h

    old new  
    364364        struct ieee80211_nsparams iv_nsparams;  /* new state parameters for tasklet for stajoin1 */ 
    365365        struct IEEE80211_TQ_STRUCT iv_stajoin1tq; /* tasklet for newstate action called from stajoin1tq */ 
    366366        unsigned int            iv_nsdone;      /* Done with scheduled newstate tasklet */ 
     367        uint8_t wds_mac[IEEE80211_ADDR_LEN]; 
    367368}; 
    368369MALLOC_DECLARE(M_80211_VAP); 
    369370 
     371#define IEEE80211_ADDR_NULL(a1) (memcmp(a1, "\x00\x00\x00\x00\x00\x00", \ 
     372        IEEE80211_ADDR_LEN) == 0) 
    370373#define IEEE80211_ADDR_EQ(a1,a2)        (memcmp(a1,a2,IEEE80211_ADDR_LEN) == 0) 
    371374#define IEEE80211_ADDR_COPY(dst,src)    memcpy(dst,src,IEEE80211_ADDR_LEN) 
    372375