Changeset 2952


Ignore:
Timestamp:
2006-01-13T17:19:23+01:00 (12 years ago)
Author:
nbd
Message:

patch nvram library for new nas version (thx to Vincent Bernat)

Location:
trunk/openwrt
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/openwrt/package/nvram/src/wl.c

    r1540 r2952  
    8585} 
    8686 
     87/************************************************************************** 
     88 *  The following code is from Broadcom (wl.c)                            * 
     89 **************************************************************************/ 
     90 
     91int  
     92wl_iovar_getbuf(char *ifname, char *iovar, void *param, 
     93                int paramlen, void *bufptr, int buflen) 
     94{ 
     95        int err; 
     96        uint namelen; 
     97        uint iolen; 
     98 
     99        namelen = strlen(iovar) + 1;     /* length of iovar name plus null */ 
     100        iolen = namelen + paramlen; 
     101 
     102        /* check for overflow */ 
     103        if (iolen > buflen)  
     104                return (-1); 
     105 
     106        memcpy(bufptr, iovar, namelen); /* copy iovar name including null */ 
     107        memcpy((int8*)bufptr + namelen, param, paramlen); 
     108 
     109        err = wl_ioctl(ifname, WLC_GET_VAR, bufptr, buflen); 
     110         
     111        return (err); 
     112} 
     113 
     114int  
     115wl_iovar_setbuf(char *ifname, char *iovar, void *param, 
     116                int paramlen, void *bufptr, int buflen) 
     117{ 
     118        uint namelen; 
     119        uint iolen; 
     120 
     121        namelen = strlen(iovar) + 1;     /* length of iovar name plus null */ 
     122        iolen = namelen + paramlen; 
     123 
     124        /* check for overflow */ 
     125        if (iolen > buflen)  
     126                return (-1); 
     127 
     128        memcpy(bufptr, iovar, namelen); /* copy iovar name including null */ 
     129        memcpy((int8*)bufptr + namelen, param, paramlen); 
     130 
     131        return wl_ioctl(ifname, WLC_SET_VAR, bufptr, iolen); 
     132} 
     133 
     134int 
     135wl_iovar_set(char *ifname, char *iovar, void *param, int paramlen) 
     136{ 
     137        char smbuf[WLC_IOCTL_SMLEN]; 
     138 
     139        return wl_iovar_setbuf(ifname, iovar, param, paramlen, smbuf, sizeof(smbuf)); 
     140} 
     141 
     142int 
     143wl_iovar_get(char *ifname, char *iovar, void *bufptr, int buflen) 
     144{ 
     145        char smbuf[WLC_IOCTL_SMLEN]; 
     146        int ret; 
     147 
     148        /* use the return buffer if it is bigger than what we have on the stack */ 
     149        if (buflen > sizeof(smbuf)) { 
     150                ret = wl_iovar_getbuf(ifname, iovar, NULL, 0, bufptr, buflen); 
     151        } else { 
     152                ret = wl_iovar_getbuf(ifname, iovar, NULL, 0, smbuf, sizeof(smbuf)); 
     153                if (ret == 0) 
     154                        memcpy(bufptr, smbuf, buflen); 
     155        } 
     156 
     157        return ret; 
     158} 
     159 
     160/*  
     161 * set named driver variable to int value 
     162 * calling example: wl_iovar_setint(ifname, "arate", rate)  
     163*/ 
     164int 
     165wl_iovar_setint(char *ifname, char *iovar, int val) 
     166{ 
     167        return wl_iovar_set(ifname, iovar, &val, sizeof(val)); 
     168} 
     169 
     170/*  
     171 * get named driver variable to int value and return error indication  
     172 * calling example: wl_iovar_getint(ifname, "arate", &rate)  
     173 */ 
     174int 
     175wl_iovar_getint(char *ifname, char *iovar, int *val) 
     176{ 
     177        return wl_iovar_get(ifname, iovar, val, sizeof(int)); 
     178} 
     179 
     180/*  
     181 * format a bsscfg indexed iovar buffer 
     182 */ 
     183static int 
     184wl_bssiovar_mkbuf(char *iovar, int bssidx, void *param, 
     185                  int paramlen, void *bufptr, int buflen, int *plen) 
     186{ 
     187        char *prefix = "bsscfg:"; 
     188        int8* p; 
     189        uint prefixlen; 
     190        uint namelen; 
     191        uint iolen; 
     192 
     193        prefixlen = strlen(prefix);     /* length of bsscfg prefix */ 
     194        namelen = strlen(iovar) + 1;    /* length of iovar name + null */ 
     195        iolen = prefixlen + namelen + sizeof(int) + paramlen; 
     196 
     197        /* check for overflow */ 
     198        if (buflen < 0 || iolen > (uint)buflen) { 
     199                *plen = 0; 
     200                return -1; 
     201        } 
     202 
     203        p = (int8*)bufptr; 
     204 
     205        /* copy prefix, no null */ 
     206        memcpy(p, prefix, prefixlen);    
     207        p += prefixlen; 
     208 
     209        /* copy iovar name including null */ 
     210        memcpy(p, iovar, namelen);       
     211        p += namelen; 
     212 
     213        /* bss config index as first param */ 
     214        memcpy(p, &bssidx, sizeof(int32)); 
     215        p += sizeof(int32); 
     216         
     217        /* parameter buffer follows */ 
     218        if (paramlen) 
     219                memcpy(p, param, paramlen); 
     220 
     221        *plen = iolen; 
     222        return 0; 
     223} 
     224 
     225/*  
     226 * set named & bss indexed driver variable to buffer value 
     227 */ 
     228int 
     229wl_bssiovar_setbuf(char *ifname, char *iovar, int bssidx, void *param,  
     230                   int paramlen, void *bufptr, int buflen) 
     231{ 
     232        int err; 
     233        uint iolen; 
     234 
     235        err = wl_bssiovar_mkbuf(iovar, bssidx, param, paramlen, bufptr, buflen, &iolen); 
     236        if (err) 
     237                return err; 
     238         
     239        return wl_ioctl(ifname, WLC_SET_VAR, bufptr, iolen); 
     240} 
     241 
     242/*  
     243 * get named & bss indexed driver variable buffer value 
     244 */ 
     245int 
     246wl_bssiovar_getbuf(char *ifname, char *iovar, int bssidx, void *param,  
     247                   int paramlen, void *bufptr, int buflen) 
     248{ 
     249        int err; 
     250        uint iolen; 
     251 
     252        err = wl_bssiovar_mkbuf(iovar, bssidx, param, paramlen, bufptr, buflen, &iolen); 
     253        if (err) 
     254                return err; 
     255         
     256        return wl_ioctl(ifname, WLC_GET_VAR, bufptr, buflen); 
     257} 
     258 
     259/*  
     260 * set named & bss indexed driver variable to buffer value 
     261 */ 
     262int 
     263wl_bssiovar_set(char *ifname, char *iovar, int bssidx, void *param, int paramlen) 
     264{ 
     265        char smbuf[WLC_IOCTL_SMLEN]; 
     266 
     267        return wl_bssiovar_setbuf(ifname, iovar, bssidx, param, paramlen, smbuf, sizeof(smbuf)); 
     268} 
     269 
     270/*  
     271 * get named & bss indexed driver variable buffer value 
     272 */ 
     273int 
     274wl_bssiovar_get(char *ifname, char *iovar, int bssidx, void *outbuf, int len) 
     275{ 
     276        char smbuf[WLC_IOCTL_SMLEN]; 
     277        int err; 
     278 
     279        /* use the return buffer if it is bigger than what we have on the stack */ 
     280        if (len > (int)sizeof(smbuf)) { 
     281                err = wl_bssiovar_getbuf(ifname, iovar, bssidx, NULL, 0, outbuf, len); 
     282        } else { 
     283                memset(smbuf, 0, sizeof(smbuf)); 
     284                err = wl_bssiovar_getbuf(ifname, iovar, bssidx, NULL, 0, smbuf, sizeof(smbuf)); 
     285                if (err == 0) 
     286                        memcpy(outbuf, smbuf, len); 
     287        } 
     288 
     289        return err; 
     290} 
     291 
     292/*  
     293 * set named & bss indexed driver variable to int value 
     294 */ 
     295int 
     296wl_bssiovar_setint(char *ifname, char *iovar, int bssidx, int val) 
     297{ 
     298        return wl_bssiovar_set(ifname, iovar, bssidx, &val, sizeof(int)); 
     299} 
  • trunk/openwrt/target/linux/package/base-files/include/wlioctl.h

    r1517 r2952  
    649649/* maximum length buffer required */ 
    650650#define WLC_IOCTL_MAXLEN        8192 
     651 
     652/* maximum length buffer required */ 
     653#define WLC_IOCTL_SMLEN         256 
    651654 
    652655/* common ioctl definitions */ 
Note: See TracChangeset for help on using the changeset viewer.