OpenWrt Forum Archive

Topic: WR1043ND - AP and STA problem (linked to eduroam)

The content of this topic has been archived on 5 Apr 2018. There are no obvious gaps in this topic, but there may still be some posts missing at the end.

Hello,

I currently have a TL-WR1043ND, flashed with backfire 10.03.1 rc4. What I'm attempting to do is create a sustained connection to my universities eduroam wireless network (as connection to the internet), and also transmit an AP for my wireless clients to connect to - fairly straightforward. However, I'm having difficulties.

Previously, I did this with a WRT54GL using wpa_supplicant; unfortunately, I could only use the 2.6 kernel and thus could not have a connection to eduroam and have the router transmit as an AP because of wireless driver issues, but I was able to connect using near-enough the instructions here: http://blog.jozjan.net/2008/12/wrt54gl- … t-aka.html

From what I gather, I can do what I had to do seperately with wpa_supplicant within /etc/config/wireless; I attempted to do this, and according to iwconfig I have established a connection, but ifconfig reports that I don't have an IP address, and I can't seem to use "udhcpc -i wlan1" (wlan1 being the sta connection) to gain one from the universities dhcp. All it says is 'Sending discover...' three times.

I don't quite know what I'm doing wrong here, any suggestions?

Thanks for your help!

(Last edited by sovvy on 10 Dec 2010, 19:41)

Follow "OpenWrt/ tplink 841 nd routed client help" to create a routed client. Then add an additional ap to the wireless configuration.

For WRT54GL, you should install brcm-2.4 firmware.

fyi wrote:

Follow "OpenWrt/ tplink 841 nd routed client help" to create a routed client. Then add an additional ap to the wireless configuration.

For WRT54GL, you should install brcm-2.4 firmware.

Hey - cheers for that. That worked pretty much fine up until creating a new ap; without it, I was assigned an IP straight away after using 'wifi up' on wlan0 for my sta connection. however, once I add the ap to the config, the sta is assigned to wlan1 and all i get is 'udhcpc: bind: no such device' (not sure what that is referring to) and 'sending discover'. I can see in iwconfig that the connection is stable, but I just can't get an assigned IP.

On that note - I think I've recognised the problem (possibly). To access my universities wifi, I have to have my mac address registered. I registered the mac address of the wireless device for my router, but for wlan1, its changed slightly - unfortunately, trying to edit it to match the new mac results in failure as it 'isn't recognised'. Any ideas? :S

This is a strange problem - and I do think it may have something to do with mac address assignments, but I can't seem to adequately change it. Macchanger will do it, but I still have the problem with udhcpc basically timing out. For now, I may just have to use my 54GL as the AP.

(Last edited by sovvy on 12 Dec 2010, 12:50)

Please provide the /etc/config/wireless and /etc/config/network.

Sure thing.

/etc/config/wireless:


config 'wifi-device' 'radio0'
    option 'type' 'mac80211'
    option 'macaddr' '94:0c:6d:##:##:##'
    list 'ht_capab' 'SHORT-GI-40'
    list 'ht_capab' 'DSSS_CCK-40'
    option 'disabled' '0'
    option 'channel' '6'
    option 'txpower' '27'
    option 'hwmode' '11ng'
    option 'htmode' 'HT20'

config 'wifi-iface'
    option 'device' 'radio0'
    option 'network' 'wan'
    option 'mode' 'sta'
    option 'ssid' 'eduroam'
    option 'encryption' 'wpa+tkip+ccmp'
    option 'eap_type' 'peap'
    option 'auth' 'MSCHAPV2'
    option 'identity' '**@**.**'
    option 'password' '*******'

config 'wifi-iface'
    option 'device' 'radio0'
    option 'network' 'lan'
    option 'mode' 'ap'
    option 'ssid' 'OpenWrt'
    option 'encryption' 'mixed-psk+tkip+ccmp'
    option 'key' '*****'

---

/etc/config/network:


config 'interface' 'loopback'
    option 'ifname' 'lo'
    option 'proto' 'static'
    option 'ipaddr' '127.0.0.1'
    option 'netmask' '255.0.0.0'

config 'interface' 'lan'
    option 'ifname' 'eth0.1'
    option 'type' 'bridge'
    option 'proto' 'static'
    option 'ipaddr' '192.168.1.1'
    option 'netmask' '255.255.255.0'

config 'interface' 'wan'
    option 'proto' 'dhcp'
    option 'defaultroute' '0'
    option 'peerdns' '0'

config 'switch'
    option 'name' 'rtl8366rb'
    option 'reset' '1'
    option 'enable_vlan' '1'

config 'switch_vlan'
    option 'device' 'rtl8366rb'
    option 'vlan' '1'
    option 'ports' '1 2 3 4 5t'

config 'switch_vlan'
    option 'device' 'rtl8366rb'
    option 'vlan' '2'
    option 'ports' '0 5t'


---

Hope it helps!

sovvy wrote:

On that note - I think I've recognised the problem (possibly). To access my universities wifi, I have to have my mac address registered.

What do you mean and which mac address did you register? If the sta is assigned to wlan1, you should have it registered, not wlan0.

fyi wrote:
sovvy wrote:

On that note - I think I've recognised the problem (possibly). To access my universities wifi, I have to have my mac address registered.

What do you mean and which mac address did you register? If the sta is assigned to wlan1, you should have it registered, not wlan0.

To gain access to my university internet, you have to register all mac addresses used; I originally registered wlan0 when I was just using the router as a station, but I can't register wlan1 with my university as the stupid online form my university provides to register mac's says that the mac address 'isnt recognised' - I'm assuming because the first part identifies the manufacturer, and that is the section that changes - 9A:0C:6D:xx:xx:xx instead of the original 94:0C:6D:xx:xx:xx. I can't seem to change it properly, either - macchanger will change it but it doesn't have any effect. I can authenticate with the eduroam AP regardless, but I just don't get assigned an IP because of the mac issue I think.

sovvy wrote:

I originally registered wlan0 when I was just using the router as a station

From the above statement, it sounds like things were working when you only had one wlan interface? Is the MAC still correct on wlan0? and is wlan1 the only interface with an "improper" address?
I don't run multiple wlan interfaces at the moment, but if the above is true, I'm guessing that your AP is coming up before your STA interface and therefore assigning wlan0 to your AP. I'm not sure of any way to force an wlan0 to your STA config, but maybe someone else here has an answer.

Please keep in mind that the MAC listed under radio0 cannot be changed from what is found by the "wifi detect" script. It is required for communication to the switch.

Hi Sovvy,
    I have the same model that I use as my sandbox.  If you troll further down the forum you'll see that I have a similar post.  The problem that I had was due to the fact that the 'auto' channel feature has not yet been implemented for this radio's kernel module.  In my post, I also linked to a developer's confirmation of this.  The option is there, but it doesn't work.  In order for this to work, you'll need to configure the main radio setup and specify the same channel as the access point to which you are trying to connect.  Then, create a virtual interface on that radio in master "AP" mode and set it up to your specifications.  Both interfaces will have to run on that same channel, FYI.  Not he most efficient way, but it will get the job done.  Hope this helps.  Here's a link to the post:

https://forum.openwrt.org/viewtopic.php?id=27019

KillaB wrote:
sovvy wrote:

I originally registered wlan0 when I was just using the router as a station

From the above statement, it sounds like things were working when you only had one wlan interface? Is the MAC still correct on wlan0? and is wlan1 the only interface with an "improper" address?
I don't run multiple wlan interfaces at the moment, but if the above is true, I'm guessing that your AP is coming up before your STA interface and therefore assigning wlan0 to your AP. I'm not sure of any way to force an wlan0 to your STA config, but maybe someone else here has an answer.

Please keep in mind that the MAC listed under radio0 cannot be changed from what is found by the "wifi detect" script. It is required for communication to the switch.

The MAC is still correct on wlan0, its just wlan1 that is the issue. Forcing the AP to come up after STA would be the answer, like you said, but I don't have a clue how to do it (or if its possible!). I did try to set the wan macaddr in /etc/config/network, which did work to change it in ifconfig, but did not solve my problem.

coreyo wrote:

Hi Sovvy,
    I have the same model that I use as my sandbox.  If you troll further down the forum you'll see that I have a similar post.  The problem that I had was due to the fact that the 'auto' channel feature has not yet been implemented for this radio's kernel module.  In my post, I also linked to a developer's confirmation of this.  The option is there, but it doesn't work.  In order for this to work, you'll need to configure the main radio setup and specify the same channel as the access point to which you are trying to connect.  Then, create a virtual interface on that radio in master "AP" mode and set it up to your specifications.  Both interfaces will have to run on that same channel, FYI.  Not he most efficient way, but it will get the job done.  Hope this helps.  Here's a link to the post:

https://forum.openwrt.org/viewtopic.php?id=27019

Cheers for this, but I'm not sure if its too applicable to my situation; I've statically set my wifi radio channel to match the channel of the eduroam network i'm trying to connect to; the connection does authenticate, I just can't get a dhcp lease. Thanks though!

In /etc/config/wireless, you currently have STA defined before AP.
Try reversing the order similar to coreyo's example.

I'm not saying it's going to work, but it's worth a shot.

KillaB wrote:

In /etc/config/wireless, you currently have STA defined before AP.
Try reversing the order similar to coreyo's example.

I'm not saying it's going to work, but it's worth a shot.

Sadly, I moved them around before and it didn't chang eanything. We're on the same wavelength though, tongue

Read "enable_mac80211()" in "/lib/wifi/mac80211.sh". Maybe you'll find out how to let sta come up before ap.

In my Fonera+ running Kamikaze, sta always comes up before ap.

/lib/wifi/madwifi.sh:

enable_atheros() {
    local device="$1"

    config_get regdomain "$device" regdomain
    [ -n "$regdomain" ] && echo "$regdomain" > /proc/sys/dev/$device/regdomain

    config_get country "$device" country
    [ -z "$country" ] && country="0"
    echo "$country" > /proc/sys/dev/$device/countrycode

    config_get_bool outdoor "$device" outdoor "0"
    echo "$outdoor" > /proc/sys/dev/$device/outdoor

    config_get channel "$device" channel
    config_get vifs "$device" vifs
    config_get txpower "$device" txpower

    [ auto = "$channel" ] && channel=0

    config_get_bool antdiv "$device" diversity
    config_get antrx "$device" rxantenna
    config_get anttx "$device" txantenna
    config_get_bool softled "$device" softled 1

    devname="$(cat /proc/sys/dev/$device/dev_name)"
    local antgpio=
    local invert=
    case "$devname" in
        NanoStation2) antgpio=7; invert=1;;
        NanoStation5) antgpio=1; invert=1;;
        "NanoStation Loco2") antgpio=2;;
    esac
    if [ -n "$invert" ]; then
        _set="clear"
        _clear="set"
    else
        _set="set"
        _clear="clear"
    fi
    if [ -n "$antgpio" ]; then
        softled=0
        config_get antenna "$device" antenna
        case "$antenna" in
            external) antdiv=0; antrx=1; anttx=1 ;;
            horizontal) antdiv=0; antrx=1; anttx=1 ;;
            vertical) antdiv=0; antrx=2; anttx=2 ;;
            auto) antdiv=1; antrx=0; anttx=0 ;;
        esac
            
        [ -x "$(which gpioctl 2>/dev/null)" ] || antenna=
        gpioctl "dirout" "$antgpio" >/dev/null 2>&1
        case "$antenna" in
            horizontal|vertical|auto)
                gpioctl "$_clear" "$antgpio" >/dev/null 2>&1
            ;;
            external)
                gpioctl "$_set" "$antgpio" >/dev/null 2>&1
            ;;
        esac
    fi

    [ -n "$antdiv" ] && sysctl -w dev."$device".diversity="$antdiv" >&-
    [ -n "$antrx" ] && sysctl -w dev."$device".rxantenna="$antrx" >&-
    [ -n "$anttx" ] && sysctl -w dev."$device".txantenna="$anttx" >&-
    [ -n "$softled" ] && sysctl -w dev."$device".softled="$softled" >&-

    config_get distance "$device" distance
    [ -n "$distance" ] && sysctl -w dev."$device".distance="$distance" >&-

    for vif in $vifs; do
        local start_hostapd= vif_txpower= nosbeacon=
        config_get ifname "$vif" ifname
        config_get enc "$vif" encryption
        config_get eap_type "$vif" eap_type
        config_get mode "$vif" mode
        
        case "$mode" in
            sta) config_get_bool nosbeacon "$device" nosbeacon;;
            adhoc) config_get_bool nosbeacon "$vif" sw_merge 1;;
        esac
        
        [ "$nosbeacon" = 1 ] || nosbeacon=""
        ifname=$(wlanconfig "$ifname" create wlandev "$device" wlanmode "$mode" ${nosbeacon:+nosbeacon})
        [ $? -ne 0 ] && {
            echo "enable_atheros($device): Failed to set up $mode vif $ifname" >&2
            continue
        }
        config_set "$vif" ifname "$ifname"

        config_get hwmode "$device" hwmode
        [ -z "$hwmode" ] && config_get hwmode "$device" mode

        pureg=0
        case "$hwmode" in
            *b) hwmode=11b;;
            *bg) hwmode=11g;;
            *g) hwmode=11g; pureg=1;;
            *gdt) hwmode=11gdt;;
            *a) hwmode=11a;;
            *adt) hwmode=11adt;;
            *ast) hwmode=11ast;;
            *fh) hwmode=fh;;
            *) hwmode=auto;;
        esac
        iwpriv "$ifname" mode "$hwmode"
        iwpriv "$ifname" pureg "$pureg"

        iwconfig "$ifname" channel "$channel" >/dev/null 2>/dev/null 

        config_get_bool hidden "$vif" hidden 0
        iwpriv "$ifname" hide_ssid "$hidden"

        config_get ff "$vif" ff
        if [ -n "$ff" ]; then
            iwpriv "$ifname" ff "$ff"
        fi

        config_get wds "$vif" wds
        case "$wds" in
            1|on|enabled) wds=1;;
            *) wds=0;;
        esac
        iwpriv "$ifname" wds "$wds" >/dev/null 2>&1

        [ "$mode" = ap -a "$wds" = 1 ] && {
            config_get_bool wdssep "$vif" wdssep 1
            [ -n "$wdssep" ] && iwpriv "$ifname" wdssep "$wdssep"
        }

        case "$enc" in
            WEP|wep)
                for idx in 1 2 3 4; do
                    config_get key "$vif" "key${idx}"
                    iwconfig "$ifname" enc "[$idx]" "${key:-off}"
                done
                config_get key "$vif" key
                key="${key:-1}"
                case "$key" in
                    [1234]) iwconfig "$ifname" enc "[$key]";;
                    *) iwconfig "$ifname" enc "$key";;
                esac
            ;;
            psk*|wpa*)
                start_hostapd=1
                config_get key "$vif" key
            ;;
        esac

        case "$mode" in
            sta|adhoc|ahdemo)
                config_get addr "$vif" bssid
                [ -z "$addr" ] || { 
                    iwconfig "$ifname" ap "$addr"
                }
            ;;
        esac

        config_get_bool uapsd "$vif" uapsd 0
        iwpriv "$ifname" uapsd "$uapsd"

        config_get_bool bgscan "$vif" bgscan
        [ -n "$bgscan" ] && iwpriv "$ifname" bgscan "$bgscan"

        config_get rate "$vif" rate
        [ -n "$rate" ] && iwconfig "$ifname" rate "${rate%%.*}"

        config_get mcast_rate "$vif" mcast_rate
        [ -n "$mcast_rate" ] && iwpriv "$ifname" mcast_rate "${mcast_rate%%.*}"

        config_get frag "$vif" frag
        [ -n "$frag" ] && iwconfig "$ifname" frag "${frag%%.*}"

        config_get rts "$vif" rts
        [ -n "$rts" ] && iwconfig "$ifname" rts "${rts%%.*}"

        config_get_bool comp "$vif" compression 0
        iwpriv "$ifname" compression "$comp" >/dev/null 2>&1

        config_get_bool minrate "$vif" minrate
        [ -n "$minrate" ] && iwpriv "$ifname" minrate "$minrate"

        config_get_bool maxrate "$vif" maxrate
        [ -n "$maxrate" ] && iwpriv "$ifname" maxrate "$maxrate"

        config_get_bool burst "$vif" bursting
        [ -n "$burst" ] && iwpriv "$ifname" burst "$burst"

        config_get_bool wmm "$vif" wmm
        [ -n "$wmm" ] && iwpriv "$ifname" wmm "$wmm"

        config_get_bool xr "$vif" xr
        [ -n "$xr" ] && iwpriv "$ifname" xr "$xr"

        config_get_bool ar "$vif" ar
        [ -n "$ar" ] && iwpriv "$ifname" ar "$ar"

        config_get_bool beacon_power "$vif" beacon_power
        [ -n "$beacon_power" ] && iwpriv "$ifname" beacon_pwr "$beacon_power"

        config_get_bool doth "$vif" doth 0
        [ -n "$doth" ] && iwpriv "$ifname" doth "$doth"

        config_get_bool probereq "$vif" probereq
        [ -n "$probereq" ] && iwpriv "$ifname" probereq "$probereq"

        config_get maclist "$vif" maclist
        [ -n "$maclist" ] && {
            # flush MAC list
            iwpriv "$ifname" maccmd 3
            for mac in $maclist; do
                iwpriv "$ifname" addmac "$mac"
            done
        }

        config_get macpolicy "$vif" macpolicy
        case "$macpolicy" in
            allow)
                iwpriv "$ifname" maccmd 1
            ;;
            deny)
                iwpriv "$ifname" maccmd 2
            ;;
            *)
                # default deny policy if mac list exists
                [ -n "$maclist" ] && iwpriv "$ifname" maccmd 2
            ;;
        esac

        ifconfig "$ifname" up

        local net_cfg bridge
        net_cfg="$(find_net_config "$vif")"
        [ -z "$net_cfg" ] || {
            bridge="$(bridge_interface "$net_cfg")"
            config_set "$vif" bridge "$bridge"
            start_net "$ifname" "$net_cfg"
        }

        config_get ssid "$vif" ssid
        [ -n "$ssid" ] && {
            iwconfig "$ifname" essid on
            iwconfig "$ifname" essid "$ssid"
        }

        set_wifi_up "$vif" "$ifname"

        # TXPower settings only work if device is up already
        # while atheros hardware theoretically is capable of per-vif (even per-packet) txpower
        # adjustment it does not work with the current atheros hal/madwifi driver

        config_get vif_txpower "$vif" txpower
        # use vif_txpower (from wifi-iface) instead of txpower (from wifi-device) if
        # the latter doesn't exist
        txpower="${txpower:-$vif_txpower}"
        [ -z "$txpower" ] || iwconfig "$ifname" txpower "${txpower%%.*}"

        case "$mode" in
            ap)
                config_get_bool isolate "$vif" isolate 0
                iwpriv "$ifname" ap_bridge "$((isolate^1))"

                if [ -n "$start_hostapd" ] && eval "type hostapd_setup_vif" 2>/dev/null >/dev/null; then
                    hostapd_setup_vif "$vif" madwifi || {
                        echo "enable_atheros($device): Failed to set up hostapd for interface $ifname" >&2
                        # make sure this wifi interface won't accidentally stay open without encryption
                        ifconfig "$ifname" down
                        wlanconfig "$ifname" destroy
                        continue
                    }
                fi
            ;;
            wds|sta)
                if eval "type wpa_supplicant_setup_vif" 2>/dev/null >/dev/null; then
                    wpa_supplicant_setup_vif "$vif" madwifi || {
                        echo "enable_atheros($device): Failed to set up wpa_supplicant for interface $ifname" >&2
                        ifconfig "$ifname" down
                        wlanconfig "$ifname" destroy
                        continue
                    }
                fi
            ;;
        esac
    done
}

Damn! It actually works!

I had a poke around /lib/wifi/mac80211.sh, changed 'local mac_2' and while it didnt have quite the right effect (I simply typed in the mac it should have had; I didn't have the time or patience to try and get my head around the code properly!) it does force wlan1 to have the 'proper' mac and wlan0 gets a dodgily assigned mac instead. While a bit of a dodgy hack, it works!

I can now finally put my WRT54GL to other uses (there are PLENTY of public wifis in the neighbourhood..); although I do have a concern - 1 radio should manage both wireless ap and sta traffic fine without too much of a problem, shouldn't it?

Thanks fyi, and everyone else, you've been a real help! Hopefully this'll help other people in the future.

/lib/wifi/mac80211.sh:

scan_mac80211() {
    config_set "$device" vifs "${ap:+$ap }${adhoc:+$adhoc }${sta:+$sta }${monitor:+$monitor }${mesh:+$mesh}"
}

/lib/wifi/madwifi.sh:

scan_atheros() {
    config_set "$device" vifs "${sta:+$sta }${ap:+$ap }${adhoc:+$adhoc }${ahdemo:+$ahdemo }${wds:+$wds }${monitor:+$monitor}"
}

The option "vifs" controls the virtual interfaces being initialized. Change the sequence of "${sta:+$sta }" and "${ap:+$ap }" and you can change the mac addresses of the vifs. I think it's better to have sta initialized before ap.

OpenWrt manual

Limitations: There are certain limitations when combining modes. Only the following mode combinations are supported:

    * Broadcom:
          o 1x sta, 0-3x ap
          o 1-4x ap
          o 1x adhoc
          o 1x monitor

      WDS links can only be used in pure AP mode and cannot use WEP (except when sharing the settings with the master interface, which is done automatically).
    * Atheros:
          o 1x sta, 0-Nx ap
          o 1-Nx ap
          o 1x adhoc

      N is the maximum number of VAPs that the module allows, it defaults to 4, but can be changed by loading the module with the maxvaps=N parameter.

The discussion might have continued from here.