Changeset 47719


Ignore:
Timestamp:
2015-12-03T17:25:19+01:00 (2 years ago)
Author:
jow
Message:

base-files: uci-defaults-new, config_generate: refactor code and drop old vlans

Remove support for now unused ucidef_add_switch_vlan(), move port->vlan and
vlan->interfaces conversion to uci-defaults-new.sh and massively simplify
config_generate.

This change prepares the following upcoming steps:

  • Eliminate use of ucidef_set_interface_lan_wan() for switch only devices
  • Merge ucidef_add_switch() with ucidef_add_switch_ports()

Signed-off-by: Jo-Philipp Wich <jow@…>

Location:
trunk/package/base-files/files
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/package/base-files/files/bin/config_generate

    r47718 r47719  
    2121} 
    2222 
    23 next_vlan=3 
    2423generate_network() { 
    25         local vlan 
     24        local ifname macaddr type 
    2625 
    2726        json_select network 
    28         json_select "$1" 
    29         json_get_vars ifname create_vlan macaddr 
    30         json_select .. 
     27                json_select "$1" 
     28                        json_get_vars ifname macaddr 
     29                json_select .. 
    3130        json_select .. 
    3231 
    3332        [ -n "$ifname" ] || return 
    3433 
    35         if [ "${create_vlan:-0}" -eq 1 ]; then 
    36                 case "$1" in 
    37                         lan) vlan=1;; 
    38                         wan) vlan=2;; 
    39                         *) 
    40                                 vlan=$next_vlan 
    41                                 next_vlan=$((next_vlan + 1)) 
    42                         ;; 
    43                 esac 
    44         fi 
    45  
    46         [ -n "$vlan" ] && ifname=${ifname}.${vlan} 
     34        # force bridge for multi-interface devices (and lan) 
     35        case "$1:$ifname" in 
     36                *\ * | lan:*) type="bridge" ;; 
     37        esac 
    4738 
    4839        uci -q batch <<-EOF 
    4940                delete network.$1 
    5041                set network.$1='interface' 
     42                set network.$1.type='$type' 
    5143                set network.$1.ifname='$ifname' 
    5244                set network.$1.proto='none' 
     
    5749                lan) 
    5850                        uci -q batch <<-EOF 
    59                                 set network.$1.type='bridge' 
    6051                                set network.$1.proto='static' 
    6152                                set network.$1.ipaddr='192.168.1.1' 
     
    6455                        EOF 
    6556                ;; 
    66  
    6757                wan) 
    6858                        uci -q batch <<-EOF 
     
    7060                                delete network.wan6 
    7161                                set network.wan6='interface' 
     62                                set network.wan6.type='$type' 
    7263                                set network.wan6.ifname='$ifname' 
    7364                                set network.wan6.proto='dhcpv6' 
    7465                        EOF 
    7566                ;; 
    76  
    77                 *) 
    78                         uci -q batch <<-EOF 
    79                                 set network.$1.force_link=1 
    80                         EOF 
    81                 ;; 
    8267        esac 
    8368} 
    8469 
    85 generate_switch_vlan() { 
    86         local device="$1" 
    87         local vlan="$2" 
    88         local cpu_port="$3" 
    89  
    90         case "$vlan" in 
    91                 lan) vlan=1;; 
    92                 wan) vlan=2;; 
    93                 *) vlan="${vlan##vlan}";; 
    94         esac 
    95  
    96         json_select vlans 
    97         json_select "$2" 
    98         json_get_values ports 
    99         json_select .. 
    100         json_select .. 
    101  
    102         uci -q batch <<-EOF 
    103                 add network switch_vlan 
    104                 set network.@switch_vlan[-1].device='$device' 
    105                 set network.@switch_vlan[-1].vlan='$vlan' 
    106                 set network.@switch_vlan[-1].ports='$ports ${cpu_port}t' 
    107         EOF 
    108 } 
    109  
    110 calculate_switch_vlans() { 
     70generate_switch_vlans_ports() { 
    11171        local switch="$1" 
    112         local ports port attr val prev_role 
    113         local num device role index need_tag 
    114         local cpu0 cpu1 cpu2 cpu3 
    115         local dev0 dev1 dev2 dev3 
    116         local tag0 tag1 tag2 tag3 
    117         local role0 role1 role2 role3 
    118         local n_cpu=0  n_vlan=0 vlan_off=-1 
    119         local vlan_ports cpu_port 
     72        local port ports role roles num attr val 
     73 
     74        # 
     75        # autogenerate vlans 
     76        # 
     77 
     78        json_get_keys roles roles 
     79        json_select roles 
     80 
     81        for role in $roles; do 
     82                json_select "$role" 
     83                        json_get_vars ports 
     84                json_select .. 
     85 
     86                uci -q batch <<-EOF 
     87                        add network switch_vlan 
     88                        set network.@switch_vlan[-1].device='$switch' 
     89                        set network.@switch_vlan[-1].vlan='$role' 
     90                        set network.@switch_vlan[-1].ports='$ports' 
     91                EOF 
     92        done 
     93 
     94        json_select .. 
     95 
     96 
     97        # 
     98        # write port specific settings 
     99        # 
    120100 
    121101        json_get_keys ports ports 
    122  
    123102        json_select ports 
    124103 
    125         # gather all cpu ports and count vlans 
    126104        for port in $ports; do 
    127105                json_select "$port" 
    128                 json_get_vars num device role need_tag 
    129  
    130                 if json_is_a attr object; then 
    131                         json_get_keys attr attr 
    132                         json_select attr 
    133  
    134                         uci -q batch <<-EOF 
    135                                 add network switch_port 
    136                                 set network.@switch_port[-1].device='$switch' 
    137                                 set network.@switch_port[-1].port=$num 
    138                         EOF 
    139  
    140                         for attr in $attr; do 
    141                                 json_get_var val "$attr" 
    142                                 uci -q set network.@switch_port[-1].$attr="$val" 
    143                         done 
    144  
    145                         json_select .. 
    146                 fi 
    147  
     106                        json_get_vars num 
     107 
     108                        if json_is_a attr object; then 
     109                                json_get_keys attr attr 
     110                                json_select attr 
     111                                        uci -q batch <<-EOF 
     112                                                add network switch_port 
     113                                                set network.@switch_port[-1].device='$switch' 
     114                                                set network.@switch_port[-1].port=$num 
     115                                        EOF 
     116 
     117                                        for attr in $attr; do 
     118                                                json_get_var val "$attr" 
     119                                                uci -q set network.@switch_port[-1].$attr="$val" 
     120                                        done 
     121                                json_select .. 
     122                        fi 
    148123                json_select .. 
    149  
    150                 if [ -n "$num" ] && [ -n "$device" ]; then 
    151                         export "cpu$n_cpu=$num" 
    152                         export "dev$n_cpu=$device" 
    153                         export "tag$n_cpu=${need_tag:-0}" 
    154                         n_cpu=$((n_cpu + 1)) 
    155                 elif [ -n "$num" ] && [ -n "$role" ] && [ "$role" != "$prev_role" ]; then 
    156                         export "role$n_vlan=$role" 
    157                         n_vlan=$((n_vlan + 1)) 
    158                         prev_role="$role" 
    159                 fi 
    160124        done 
    161125 
    162         unset prev_role 
    163  
    164         # autogenerate vlans 
    165         for port in $ports ""; do 
    166                 if [ -n "$port" ]; then 
    167                         json_select "$port" 
    168                         json_get_vars num device role 
    169                         json_select .. 
    170                 else 
    171                         num="-"; role="-" 
    172                 fi 
    173  
    174                 if [ -n "$num" ] && [ -n "$role" ]; then 
    175                         if [ "$role" != "$prev_role" ]; then 
    176                                 if [ -n "$vlan_ports" ]; then 
    177                                         let cpu_port="cpu$((vlan_off % n_cpu))" 
    178                                         let need_tag="tag$((vlan_off % n_cpu))" 
    179                                         [ $n_vlan -gt $n_cpu -o $need_tag -eq 1 ] && cpu_port="${cpu_port}t" 
    180  
    181                                         uci -q batch <<-EOF 
    182                                                 add network switch_vlan 
    183                                                 set network.@switch_vlan[-1].device='$switch' 
    184                                                 set network.@switch_vlan[-1].vlan='$((vlan_off + 1))' 
    185                                                 set network.@switch_vlan[-1].ports='$vlan_ports $cpu_port' 
    186                                         EOF 
    187                                 fi 
    188  
    189                                 vlan_off=$((vlan_off + 1)) 
    190                                 vlan_ports="$num" 
    191                                 prev_role="$role" 
    192                         else 
    193                                 vlan_ports="$vlan_ports $num" 
    194                         fi 
    195  
    196                 fi 
    197         done 
    198  
    199         json_select .. 
    200  
    201         # autogenerate interfaces 
    202         vlan_off=0; while [ $vlan_off -lt $n_vlan ]; do 
    203                 eval role="\$role$((vlan_off))" 
    204                 eval device="\$dev$((vlan_off % n_cpu))" 
    205                 let need_tag="tag$((vlan_off++ % n_cpu))" 
    206                 [ $n_vlan -gt $n_cpu -o $need_tag -eq 1 ] && device="$device.$vlan_off" 
    207  
    208                 # quirk: append ifnames for subsequent switches 
    209                 case "$switch" in switch[1-9]) 
    210                         local prev_devs="$(uci -q get "network.$role.ifname")" 
    211                         if echo "$prev_devs" | grep -wq "$device"; then 
    212                                 device="$prev_devs" 
    213                         else 
    214                                 device="$prev_devs $device" 
    215                         fi 
    216                 ;; esac 
    217  
    218                 uci -q batch <<-EOF 
    219                         set network.$role='interface' 
    220                         set network.$role.ifname='$device' 
    221                 EOF 
    222  
    223                 case $role in 
    224                         lan) 
    225                                 uci -q batch <<-EOF 
    226                                         set network.lan.type='bridge' 
    227                                         set network.lan.proto='static' 
    228                                         set network.lan.ipaddr='192.168.1.1' 
    229                                         set network.lan.netmask='255.255.255.0' 
    230                                         set network.lan.ip6assign='60' 
    231                                 EOF 
    232                         ;; 
    233  
    234                         wan) 
    235                                 uci -q batch <<-EOF 
    236                                         set network.wan.proto='dhcp' 
    237                                         set network.wan6='interface' 
    238                                         set network.wan6.ifname='$device' 
    239                                         set network.wan6.proto='dhcpv6' 
    240                                 EOF 
    241                         ;; 
    242  
    243                         *) 
    244                                 uci -q batch <<-EOF 
    245                                         set network.$role.force_link='1' 
    246                                         set network.$role.proto='none' 
    247                                 EOF 
    248                         ;; 
    249                 esac 
    250         done 
     126        json_select .. 
    251127} 
    252128 
     
    267143        EOF 
    268144 
    269         if [ -n "$cpu_port" ]; then 
    270                 json_get_keys vlans vlans 
    271                 for vlan in $vlans; do generate_switch_vlan $1 $vlan $cpu_port; done 
    272         elif json_is_a ports array; then 
    273                 calculate_switch_vlans $1 
    274         fi 
     145        generate_switch_vlans_ports "$1" 
    275146 
    276147        json_select .. 
  • trunk/package/base-files/files/lib/functions/uci-defaults-new.sh

    r47679 r47719  
    33CFG=/etc/board.json 
    44 
     5. /lib/functions.sh 
    56. /usr/share/libubox/jshn.sh 
    67 
     
    3435 
    3536        json_select_object "$name" 
    36         json_add_string ifname "${iface%%.*}" 
    37         [ "$iface" = "${iface%%.*}" ] || json_add_boolean create_vlan 1 
     37        json_add_string ifname "$iface" 
    3838        json_select .. 
    3939} 
     
    115115} 
    116116 
     117_ucidef_add_switch_port() { 
     118        # inherited: $num $device $need_tag $role $index $prev_role 
     119        # inherited: $n_cpu $n_ports $n_vlan $cpu0 $cpu1 $cpu2 $cpu3 $cpu4 $cpu5 
     120 
     121        n_ports=$((n_ports + 1)) 
     122 
     123        json_select_array ports 
     124                json_add_object 
     125                        json_add_int num "$num" 
     126                        [ -n "$device"   ] && json_add_string  device   "$device" 
     127                        [ -n "$need_tag" ] && json_add_boolean need_tag "$need_tag" 
     128                        [ -n "$role"     ] && json_add_string  role     "$role" 
     129                        [ -n "$index"    ] && json_add_int     index    "$index" 
     130                json_close_object 
     131        json_select .. 
     132 
     133        # record pointer to cpu entry for lookup in _ucidef_finish_switch_roles() 
     134        [ -n "$device" ] && { 
     135                export "cpu$n_cpu=$n_ports" 
     136                n_cpu=$((n_cpu + 1)) 
     137        } 
     138 
     139        # create/append object to role list 
     140        [ -n "$role" ] && { 
     141                json_select_array roles 
     142 
     143                if [ "$role" != "$prev_role" ]; then 
     144                        json_add_object 
     145                                json_add_string role "$role" 
     146                                json_add_string ports "$num" 
     147                        json_close_object 
     148 
     149                        prev_role="$role" 
     150                        n_vlan=$((n_vlan + 1)) 
     151                else 
     152                        json_select_object "$n_vlan" 
     153                                json_get_var port ports 
     154                                json_add_string ports "$port $num" 
     155                        json_select .. 
     156                fi 
     157 
     158                json_select .. 
     159        } 
     160} 
     161 
     162_ucidef_finish_switch_roles() { 
     163        # inherited: $name $n_cpu $n_vlan $cpu0 $cpu1 $cpu2 $cpu3 $cpu4 $cpu5 
     164        local index role roles num device need_tag port ports 
     165 
     166        json_select switch 
     167                json_select "$name" 
     168                        json_get_keys roles roles 
     169                json_select .. 
     170        json_select .. 
     171 
     172        for index in $roles; do 
     173                eval "port=\$cpu$(((index - 1) % n_cpu))" 
     174 
     175                json_select switch 
     176                        json_select "$name" 
     177                                json_select ports 
     178                                        json_select "$port" 
     179                                                json_get_vars num device need_tag 
     180                                        json_select .. 
     181                                json_select .. 
     182 
     183                                if [ $n_vlan -gt $n_cpu -o ${need_tag:-0} -eq 1 ]; then 
     184                                        num="${num}t" 
     185                                        device="${device}.${index}" 
     186                                fi 
     187 
     188                                json_select roles 
     189                                        json_select "$index" 
     190                                                json_get_vars role ports 
     191                                                json_add_string ports "$ports $num" 
     192                                                json_add_string device "$device" 
     193                                        json_select .. 
     194                                json_select .. 
     195                        json_select .. 
     196                json_select .. 
     197 
     198                json_select_object network 
     199                        json_select_object "$role" 
     200                                # attach previous interfaces (for multi-switch devices) 
     201                                local prev_device; json_get_var prev_device ifname 
     202                                if ! list_contains prev_device "$device"; then 
     203                                        device="${prev_device:+$prev_device }$device" 
     204                                fi 
     205                                json_add_string ifname "$device" 
     206                        json_select .. 
     207                json_select .. 
     208        done 
     209} 
     210 
    117211ucidef_add_switch_ports() { 
    118212        local name="$1"; shift 
    119         local port num role dev idx tag 
     213        local port num role device index need_tag prev_role 
     214        local cpu0 cpu1 cpu2 cpu3 cpu4 cpu5 
     215        local n_cpu=0 n_vlan=0 n_ports=0 
    120216 
    121217        json_select_object switch 
    122218        json_select_object "$name" 
    123         json_select_array ports 
    124219 
    125220        for port in "$@"; do 
     
    127222                        [0-9]*@*) 
    128223                                num="${port%%@*}" 
    129                                 dev="${port##*@}" 
    130                                 tag=0 
     224                                device="${port##*@}" 
     225                                need_tag=0 
    131226                                [ "${num%t}" != "$num" ] && { 
    132227                                        num="${num%t}" 
    133                                         tag=1 
     228                                        need_tag=1 
    134229                                } 
    135230                        ;; 
    136231                        [0-9]*:*:[0-9]*) 
    137232                                num="${port%%:*}" 
    138                                 idx="${port##*:}" 
     233                                index="${port##*:}" 
    139234                                role="${port#[0-9]*:}"; role="${role%:*}" 
    140235                        ;; 
     
    145240                esac 
    146241 
    147                 if [ -n "$num" ] && [ -n "$dev$role" ]; then 
    148                         json_add_object 
    149                         json_add_int num "$num" 
    150                         [ -n "$dev" ] && json_add_string device "$dev" 
    151                         [ -n "$tag" ] && json_add_boolean need_tag "$tag" 
    152                         [ -n "$role" ] && json_add_string role "$role" 
    153                         [ -n "$idx" ] && json_add_int index "$idx" 
    154                         json_close_object 
     242                if [ -n "$num" ] && [ -n "$device$role" ]; then 
     243                        _ucidef_add_switch_port 
    155244                fi 
    156245 
    157                 unset num dev role idx tag 
     246                unset num device role index need_tag 
    158247        done 
    159248 
    160249        json_select .. 
    161250        json_select .. 
    162         json_select .. 
     251 
     252        _ucidef_finish_switch_roles 
    163253} 
    164254 
     
    199289} 
    200290 
    201 ucidef_add_switch_vlan() { 
    202         local name="$1" 
    203         local vlan="$2" 
    204         local ports="$3" 
    205         local cpu_port='' 
    206  
    207         case "$vlan" in 
    208         1)      vlan=lan;; 
    209         2)      vlan=wan;; 
    210         *)      vlan=vlan$vlan;; 
    211         esac 
    212  
    213         json_select_object switch 
    214         json_select_object "$name" 
    215         json_select_object vlans 
    216  
    217         json_add_array "$vlan" 
    218         for p in $ports; do 
    219                 if [ ${p%t} != $p ]; then 
    220                         cpu_port=$p 
    221                 else 
    222                         json_add_int "" $p 
    223                 fi 
    224         done 
    225         json_close_array 
    226  
    227         json_select .. 
    228         [ -n "$cpu_port" ] && json_add_int cpu_port "$cpu_port" 
    229         json_select .. 
    230         json_select .. 
    231 } 
    232  
    233291ucidef_set_interface_macaddr() { 
    234292        local network="$1" 
Note: See TracChangeset for help on using the changeset viewer.