Yesterday I received a Zodiac FX four 100Base-TX port OpenFlow switch as a result of Northbound Networks' KickStarter. Today I put the Zodiac FX through its paces.
Plug the supplied USB cable into the Zodiac FX and into a PC. The Zodiac FX will appear in Debian as the serial device /dev/ttyACM0. The kernel log says:
debian:~ $ dmesg usb 1-1.1.1: new full-speed USB device number 1 using dwc_otg usb 1-1.1.1: New USB device found, idVendor=03eb, idProduct=2404 usb 1-1.1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=0 usb 1-1.1.1: Product: Zodiac usb 1-1.1.1: Manufacturer: Northbound Networks cdc_acm 1-1.1.1:1.0: ttyACM0: USB ACM device
You can use Minicom (obtained with sudo apt-get install minicom) to speak to that serial port by starting it with minicom --device /dev/ttyACM0. You'll want to be in the "dialout" group, you can add youself with sudo usermod --append --groups dialout $USER but you'll need to log in again for that to take effect. The serial parameters are speed = 115,200bps, data bits = 8, parity = none, stop bits = 1, CTS/RTS = off, XON/XOFF = off.
The entry text is:
_____ ___ _______ __
/__ / ____ ____/ (_)___ ______ / ____/ |/ /
/ / / __ \/ __ / / __ `/ ___/ / /_ | /
/ /__/ /_/ / /_/ / / /_/ / /__ / __/ / |
/____/\____/\__,_/_/\__,_/\___/ /_/ /_/|_|
by Northbound Networks
Type 'help' for a list of available commands
Zodiac_FX#
Typing "help" gives:
The following commands are currently available: Base: config openflow debug show ports show status show version Config: save show config show vlans set name <name> set mac-address <mac address> set ip-address <ip address> set netmask <netmasks> set gateway <gateway ip address> set of-controller <openflow controller ip address> set of-port <openflow controller tcp port> set failstate <secure|safe> add vlan <vlan id> <vlan name> delete vlan <vlan id> set vlan-type <openflow|native> add vlan-port <vlan id> <port> delete vlan-port <port> factory reset set of-version <version(0|1|4)> exit OpenFlow: show status show flows enable disable clear flows exit Debug: read <register> write <register> <value> exit
Some baseline messing about:
Zodiac_FX# show ports Port 1 Status: DOWN VLAN type: OpenFlow VLAN ID: 100 Port 2 Status: DOWN VLAN type: OpenFlow VLAN ID: 100 Port 3 Status: DOWN VLAN type: OpenFlow VLAN ID: 100 Port 4 Status: DOWN VLAN type: Native VLAN ID: 200 Zodiac_FX# show status Device Status Firmware Version: 0.57 CPU Temp: 37 C Uptime: 00:00:01 Zodiac_FX# show version Firmware version: 0.57 Zodiac_FX# config Zodiac_FX(config)# show config Configuration Name: Zodiac_FX MAC Address: 70:B3:D5:00:00:00 IP Address: 10.0.1.99 Netmask: 255.255.255.0 Gateway: 10.0.1.1 OpenFlow Controller: 10.0.1.8 OpenFlow Port: 6633 Openflow Status: Enabled Failstate: Secure Force OpenFlow version: Disabled Stacking Select: MASTER Stacking Status: Unavailable Zodiac_FX(config)# show vlans VLAN ID Name Type 100 'Openflow' OpenFlow 200 'Controller' Native Zodiac_FX(config)# exit Zodiac_FX# openflow Zodiac_FX(openflow)# show status OpenFlow Status Status: Disconnected No tables: 1 No flows: 0 Table Lookups: 0 Table Matches: 0 Zodiac_FX(openflow)# show flows No Flows installed! Zodiac_FX(openflow)# exit
We want to use the controller address on our PC and connect eth0 on the PC to Port 4 of the switch (probably by plugging them both into the same local area network).
Zodiac_FX# show ports … Port 4 Status: UP VLAN type: Native VLAN ID: 200
debian:~ $ sudo ip addr add 10.0.1.8/24 label eth0:zodiacfx dev eth0
debian:~ $ ip addr show label eth0:zodiacfx
inet 10.0.1.8/24 scope global eth0:zodiacfx
valid_lft forever preferred_lft forever
debian:~ $ ping 10.0.1.99
PING 10.0.1.99 (10.0.1.99) 56(84) bytes of data.
64 bytes from 10.0.1.99: icmp_seq=1 ttl=255 time=0.287 ms
64 bytes from 10.0.1.99: icmp_seq=2 ttl=255 time=0.296 ms
64 bytes from 10.0.1.99: icmp_seq=3 ttl=255 time=0.271 ms
^C
--- 10.0.1.99 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1998ms
rtt min/avg/max/mdev = 0.271/0.284/0.296/0.022 ms
Now to check the OpenFlow basics. We'll use the POX controller, which is a simple controller written in Python 2.7.
debian:~ $ git clone https://github.com/noxrepo/pox.git debian:~ $ cd pox debian:~ $ ./pox.py openflow.of_01 --address=10.0.1.8 --port=6633 --verbose POX 0.2.0 (carp) / Copyright 2011-2013 James McCauley, et al. DEBUG:core:POX 0.2.0 (carp) going up... DEBUG:core:Running on CPython (2.7.9/Mar 8 2015 00:52:26) DEBUG:core:Platform is Linux-4.1.19-v7+-armv7l-with-debian-8.0 INFO:core:POX 0.2.0 (carp) is up. DEBUG:openflow.of_01:Listening on 10.0.1.8:6633 INFO:openflow.of_01:[70-b3-d5-00-00-00 1] connected
Zodiac_FX(openflow)# show status Status: Connected Version: 1.0 (0x01) No tables: 1 No flows: 0 Table Lookups: 0 Table Matches: 0
You can then load POX programs to manuipulate the network. A popular first choice might be to turn the Zodiac FX into a flooding hub.
debian:~ $ ./pox.py --verbose openflow.of_01 --address=10.0.1.8 --port=6633 forwarding.hub POX 0.2.0 (carp) / Copyright 2011-2013 James McCauley, et al. INFO:forwarding.hub:Hub running. DEBUG:core:POX 0.2.0 (carp) going up... DEBUG:core:Running on CPython (2.7.9/Mar 8 2015 00:52:26) DEBUG:core:Platform is Linux-4.1.19-v7+-armv7l-with-debian-8.0 INFO:core:POX 0.2.0 (carp) is up. DEBUG:openflow.of_01:Listening on 10.0.1.8:6633 INFO:openflow.of_01:[70-b3-d5-00-00-00 1] connected INFO:forwarding.hub:Hubifying 70-b3-d5-00-00-00
Zodiac_FX(openflow)# show flows Flow 1 Match: Incoming Port: 0 Ethernet Type: 0x0000 Source MAC: 00:00:00:00:00:00 Destination MAC: 00:00:00:00:00:00 VLAN ID: 0 VLAN Priority: 0x0 IP Protocol: 0 IP ToS Bits: 0x00 TCP Source Address: 0.0.0.0 TCP Destination Address: 0.0.0.0 TCP/UDP Source Port: 0 TCP/UDP Destination Port: 0 Wildcards: 0x0010001f Cookie: 0x0 Attributes: Priority: 32768 Duration: 9 secs Hard Timeout: 0 secs Idle Timeout: 0 secs Byte Count: 0 Packet Count: 0 Actions: Action 1: Output: FLOOD
If we now send a packet into Port 1 we see it flooded to Port 2 and Port 3.
We also see it flooded to Port 4 (which is in 'native' mode). Flooding the packet up the same port as the OpenFlow controller isn't a great design choice. It would be better if the switch had four possible modes for ports with traffic kept distinct between them: native switch forwarding, OpenFlow forwarding, OpenFlow control, and switch management. The strict separation of forwarding, control and management is one of the benefits of software defined networks (that does lead to questions around how to bootstrap a remote switch, but the Zodiac FX isn't the class of equipment where that is a realistic issue).
VLANs between ports only seem to matter for native mode. A OpenFlow program can — and will — happily ignore the port's VLAN assignment.
The Zodiac FX is currently a OpenFlow 1.0 switch. So it can currently manipulate MAC addresses but not other packet headers. That still gives a suprising number of applications. Northbound Networks say OpenFlow 1.3 -- with it's manipulation of IP addresses -- is imminent.
The Zodiac FX is an interesting bit of kit. It is well worth buying one even at this early stage of development because it is much better at getting your hands dirty (and thus learn) than is the case with software-only simulated OpenFlow networks.
The source code is open source. It is on Github in some Atmel programming workbench format [Errata: these were some Microsoft Visual Studio 'solution' files]. I suppose it's time to unpack that, see if there's a free software Atmel toolchain, and set about fixing this port mode bug. I do hope simple modification of the switch's software is possible: a switch to teach people OpenFlow is great; a switch to teach people embedded network programming would be magnificent.