| 1 | {{{#!html |
| 2 | <div id="wikipage" class="trac-content"><p> |
| 3 | </p><div class="wiki-toc"> |
| 4 | <ol> |
| 5 | <li> |
| 6 | <a href="#swconfig">swconfig</a> |
| 7 | <ol> |
| 8 | <li> |
| 9 | <a href="#Usage">Usage</a> |
| 10 | </li> |
| 11 | <li> |
| 12 | <a href="#GW16083">GW16083</a> |
| 13 | </li> |
| 14 | </ol> |
| 15 | </li> |
| 16 | </ol> |
| 17 | </div><p> |
| 18 | </p> |
| 19 | <h1 id="swconfig">swconfig</h1> |
| 20 | <p> |
| 21 | <tt>swconfig</tt> is a lightweight Linux kernel driver API and a command-line tool that helps users configure ports on a managed switch to configure things like VLAN tagging. Note that you can also use <tt>uci</tt>, or write directly to <tt>/etc/config/network</tt> for a more permanent solution. This tool allows for an 'unmanaged' switch to become a 'managed' switch, allowing for things like VLAN tagging/untagging and individual port monitoring. |
| 22 | </p> |
| 23 | <p> |
| 24 | Note that <tt>swconfig</tt> is an <a class="wiki" href="/wiki/OpenWrt">OpenWrt</a> kernel feature only and is not a part of mainline Linux (see the discussion <a class="ext-link" href="http://comments.gmane.org/gmane.linux.network/288039"><span class="icon"></span>here</a> on why it has not been accepted). The switch architecture that has made it into mainline Linux is the Distributed Switch Architecture or DSA. |
| 25 | </p> |
| 26 | <p> |
| 27 | Capabilities of swconfig: |
| 28 | </p> |
| 29 | <ul><li>get/set a port VLAN id (TAG) |
| 30 | </li><li>get/set VLAN port membership |
| 31 | </li><li>get a port link status |
| 32 | </li><li>get port statistics counters |
| 33 | </li><li>reset switch |
| 34 | </li><li>apply conifg to switch |
| 35 | </li><li>based on generic Netlink infrastructure (easily extensible) |
| 36 | </li><li>much smaller API than DSA and does not interfere with network stack packet flow, but rather focuses on the control path of managed switches |
| 37 | </li></ul><p> |
| 38 | Because swconfig does not create a network interface per switch port, it can not support STP, LLDP, 802.1x, or other protocols that operate at a network device layer as the CPU can't send/receive packets to/from individual ports on the switch chip. |
| 39 | </p> |
| 40 | <p> |
| 41 | See also: |
| 42 | </p> |
| 43 | <ul><li><a class="ext-link" href="http://wiki.openwrt.org/doc/techref/swconfig"><span class="icon"></span>http://wiki.openwrt.org/doc/techref/swconfig</a> |
| 44 | </li><li><a class="wiki" href="/wiki/linux/vlan#dsa">Distributed Switch Architecture</a> |
| 45 | </li></ul><h2 id="Usage">Usage</h2> |
| 46 | <p> |
| 47 | First thing a user should do is list out the devices currently available for <tt>swconfig</tt> to configure. |
| 48 | </p> |
| 49 | <div class="code"><pre>root@OpenWrt:/# swconfig list |
| 50 | Found: switch0 - mvsw6171 |
| 51 | </pre></div><p> |
| 52 | From this point on, you can list the current configuration of the switch, or show a list of options that the switch supports: |
| 53 | </p> |
| 54 | <ul><li>enable or disable a port: |
| 55 | <pre class="wiki">swconifg dev <switch> port <portno> set disable <0|1> |
| 56 | </pre></li><li>disable VLANs: |
| 57 | <pre class="wiki">swconfig dev <switch> set enable_vlan 0 |
| 58 | swconfig dev <switch> set apply |
| 59 | </pre></li><li> |
| 60 | </li></ul><p> |
| 61 | For example, <a class="wiki" href="/wiki/OpenWrt">OpenWrt</a> running on a Ventana board with a <a class="wiki" href="/wiki/ventana/expansion#gw16083">GW16083</a> Ethernet expansion mezzanine: |
| 62 | </p> |
| 63 | <div class="code"><pre>root@OpenWrt:/# swconfig dev switch0 show |
| 64 | Global attributes: |
| 65 | enable_vlan: 0 |
| 66 | Port 0: |
| 67 | mask: 0x0000: <span class="o">(</span>0<span class="o">)</span> |
| 68 | qmode: 0 |
| 69 | pvid: 0 |
| 70 | link: port:0 link:down |
| 71 | Port 1: |
| 72 | mask: 0x0000: <span class="o">(</span>1<span class="o">)</span> |
| 73 | qmode: 0 |
| 74 | pvid: 0 |
| 75 | link: port:1 link:down |
| 76 | Port 2: |
| 77 | mask: 0x0000: <span class="o">(</span>2<span class="o">)</span> |
| 78 | qmode: 0 |
| 79 | pvid: 0 |
| 80 | link: port:2 link:up speed:1000baseT full-duplex |
| 81 | Port 3: |
| 82 | mask: 0x0000: <span class="o">(</span>3<span class="o">)</span> |
| 83 | qmode: 0 |
| 84 | pvid: 0 |
| 85 | link: port:3 link:down |
| 86 | Port 4: |
| 87 | mask: 0x0000: <span class="o">(</span>4<span class="o">)</span> |
| 88 | qmode: 0 |
| 89 | pvid: 0 |
| 90 | link: port:4 link:up speed:1000baseT full-duplex |
| 91 | Port 5: |
| 92 | mask: 0x0000: <span class="o">(</span>5<span class="o">)</span> |
| 93 | qmode: 0 |
| 94 | pvid: 0 |
| 95 | link: port:5 link:down |
| 96 | Port 6: |
| 97 | mask: 0x0000: <span class="o">(</span>6<span class="o">)</span> |
| 98 | qmode: 0 |
| 99 | pvid: 0 |
| 100 | link: port:6 link:down |
| 101 | </pre></div><div class="code"><pre>root@OpenWrt:/# swconfig dev switch0 <span class="nb">help |
| 102 | </span>switch0: mvsw6171<span class="o">(</span>MV88E6176<span class="o">)</span>, ports: 7 <span class="o">(</span>cpu @ 4<span class="o">)</span>, vlans: 64 |
| 103 | --switch |
| 104 | Attribute 1 <span class="o">(</span>int<span class="o">)</span>: enable_vlan <span class="o">(</span>Enable 802.1q VLAN support<span class="o">)</span> |
| 105 | Attribute 2 <span class="o">(</span>none<span class="o">)</span>: apply <span class="o">(</span>Activate changes in the hardware<span class="o">)</span> |
| 106 | Attribute 3 <span class="o">(</span>none<span class="o">)</span>: reset <span class="o">(</span>Reset the switch<span class="o">)</span> |
| 107 | --vlan |
| 108 | Attribute 1 <span class="o">(</span>int<span class="o">)</span>: port_based <span class="o">(</span>Use port-based <span class="o">(</span>non-802.1q<span class="o">)</span> VLAN only<span class="o">)</span> |
| 109 | Attribute 2 <span class="o">(</span>int<span class="o">)</span>: vid <span class="o">(</span>Get/set VLAN ID<span class="o">)</span> |
| 110 | Attribute 3 <span class="o">(</span>ports<span class="o">)</span>: ports <span class="o">(</span>VLAN port mapping<span class="o">)</span> |
| 111 | --port |
| 112 | Attribute 1 <span class="o">(</span>string<span class="o">)</span>: mask <span class="o">(</span>Port-based VLAN mask<span class="o">)</span> |
| 113 | Attribute 2 <span class="o">(</span>int<span class="o">)</span>: qmode <span class="o">(</span>802.1q mode: <span class="nv">0</span><span class="o">=</span>off/1<span class="o">=</span>fallback/2<span class="o">=</span>check/3<span class="o">=</span>secure<span class="o">)</span> |
| 114 | Attribute 3 <span class="o">(</span>int<span class="o">)</span>: pvid <span class="o">(</span>Primary VLAN ID<span class="o">)</span> |
| 115 | Attribute 4 <span class="o">(</span>string<span class="o">)</span>: link <span class="o">(</span>Get port link information<span class="o">)</span> |
| 116 | </pre></div><p> |
| 117 | In order to set values, you have to read the attribute, determine the information it requires and set it. For example, if you want to create a VLAN with an VID of 100, and add several ports to it, the following would be the appropriate way to accomplish this |
| 118 | </p> |
| 119 | <div class="code"><pre>root@OpenWrt:/# swconfig dev switch0 vlan 5 <span class="nb">set </span>vid 100 |
| 120 | root@OpenWrt:/# swconfig dev switch0 vlan 5 <span class="nb">set </span>ports <span class="s1">'2t 4'</span> |
| 121 | root@OpenWrt:/# swconfig dev switch0 <span class="nb">set </span>enable_vlan 1 |
| 122 | root@OpenWrt:/# swconfig dev switch0 <span class="nb">set </span>apply |
| 123 | </pre></div><p> |
| 124 | The above example: |
| 125 | </p> |
| 126 | <ol><li>Creates a VLAN (#5) |
| 127 | </li><li>Adds two ports to it (2t and 4) while adding tagging to the number '2' port (the 't' appended to the '2') |
| 128 | </li><li>Enables vlan's on this switch |
| 129 | </li><li>And finally applies the settings. |
| 130 | </li></ol><p> |
| 131 | The result will look as follows: |
| 132 | </p> |
| 133 | <div class="code"><pre>root@OpenWrt:/# swconfig dev switch0 show |
| 134 | Global attributes: |
| 135 | enable_vlan: 1 |
| 136 | Port 0: |
| 137 | mask: 0x0000: <span class="o">(</span>0<span class="o">)</span> |
| 138 | qmode: 0 |
| 139 | pvid: 0 |
| 140 | link: port:0 link:down |
| 141 | Port 1: |
| 142 | mask: 0x0000: <span class="o">(</span>1<span class="o">)</span> |
| 143 | qmode: 0 |
| 144 | pvid: 0 |
| 145 | link: port:1 link:down |
| 146 | Port 2: |
| 147 | mask: 0x0000: <span class="o">(</span>2<span class="o">)</span> |
| 148 | qmode: 3 |
| 149 | pvid: 0 |
| 150 | link: port:2 link:up speed:1000baseT full-duplex |
| 151 | Port 3: |
| 152 | mask: 0x0000: <span class="o">(</span>3<span class="o">)</span> |
| 153 | qmode: 0 |
| 154 | pvid: 0 |
| 155 | link: port:3 link:down |
| 156 | Port 4: |
| 157 | mask: 0x0000: <span class="o">(</span>4<span class="o">)</span> |
| 158 | qmode: 3 |
| 159 | pvid: 100 |
| 160 | link: port:4 link:up speed:1000baseT full-duplex |
| 161 | Port 5: |
| 162 | mask: 0x0000: <span class="o">(</span>5<span class="o">)</span> |
| 163 | qmode: 0 |
| 164 | pvid: 0 |
| 165 | link: port:5 link:down |
| 166 | Port 6: |
| 167 | mask: 0x0000: <span class="o">(</span>6<span class="o">)</span> |
| 168 | qmode: 0 |
| 169 | pvid: 0 |
| 170 | link: port:6 link:down |
| 171 | VLAN 5: |
| 172 | port_based: 0 |
| 173 | vid: 100 |
| 174 | ports: 2t 4 |
| 175 | </pre></div><p> |
| 176 | Please note that port 4 was added to the vlan due to it being the CPU port. One can determine this by running the following command |
| 177 | </p> |
| 178 | <div class="code"><pre>root@OpenWrt:/# swconfig dev switch0 <span class="nb">help</span> | grep <span class="s2">"cpu @"</span> |
| 179 | switch0: mvsw6171<span class="o">(</span>MV88E6176<span class="o">)</span>, ports: 7 <span class="o">(</span>cpu @ 4<span class="o">)</span>, vlans: 64 |
| 180 | </pre></div><p> |
| 181 | <span class="wikianchor" id="gw16083"></span> |
| 182 | </p> |
| 183 | <h2 id="GW16083">GW16083</h2> |
| 184 | <p> |
| 185 | The <a class="wiki" href="/wiki/ventana/expansion#gw16083">GW16083</a> is an Ethernet expansion mezzanine that is compatible with the Gateworks Ventana product family (if a mezzanine expansion is available on your board). |
| 186 | </p> |
| 187 | <p> |
| 188 | Note that the GW16083 support was added for <tt>swconfig</tt> in <a class="wiki" href="/wiki/OpenWrt">OpenWrt</a> very recently in our latest <a class="wiki" href="/wiki/OpenWrt">OpenWrt</a> on Github. |
| 189 | </p> |
| 190 | <p> |
| 191 | Note that the port numbers that <tt>swconfig</tt> are the physical ports on the MV88Ewith the GW16083 MV88E6176 chip. To map them to the silkscreen on the board use this table: |
| 192 | </p> |
| 193 | <p> |
| 194 | Please see <a class="wiki" href="/wiki/ventana/expansion#gw16083">GW16083</a> for a table of port mapping (matching silkscreen/connector to port numbers) |
| 195 | </p> |
| 196 | }}} |