sábado, 9 de abril de 2016

Installing a 3.9 inches mcufriend.com LCD module in a Raspberry PI B with Raspbian Jessie

I've found a  cheap 3.9 inches LCD module for the Raspberry Pi model B in Aliexpress (about US$ 8). It has the ili9488 controller and have a resolution of 320x480. There is no native support for it in the default Raspbian distribution.
After some digging in Internet, I installed the last Raspbian Jessie image available at the official download site and did the following procedure.

1. Extend the file system to open a room to install the new kernel:

 raspi-config --expand-rootfs

2. Install the rpi-update

 sudo apt-get install rpi-update
 sudo rpi-update

3. Install Xserver (if not already installed)

sudo apt-get install xserver-xorg-video-fbdev

4. Create  the file /etc/modules-load.d/fbtft.conf

sudo nano /etc/modules-load.d/fbtft.conf

spi-bcm2835
flexfb
fbtft_device


5. Create the file  /etc/modprobe.d/fbtft.conf  (only two lines beggining with "options", don't split the commands)
sudo nano  /etc/modprobe.d/fbtft.conf

options fbtft_device name=flexpfb rotate=180 fps=60 gpios=dc:18,reset:7,wr:17,cs:4,db00:22,db01:23,db02:24,db03:10,db04:25,db05:9,db06:11,db07:8 speed=48000000

options flexfb width=480 height=320 buswidth=8 init=-1,0xb0,0x0,-1,0x11,-2,120,-1,0x3A,0x55,-1,0xC2,0x33,-1,0xC5,0x00,0x1E,0x80,-1,0x36,0x28,-1,0xB1,0xB0,-1,0xE0,0x00,0x04,0x0E,0x08,0x17,0x0A,0x40,0x79,0x4D,0x07,0x0E,0x0A,0x1A,0x1D,0x0F,-1,0xE1,0x00,0x1B,0x1F,0x02,0x10,0x05,0x32,0x34,0x43,0x02,0x0A,0x09,0x33,0x37,0x0F,-1,0x11,-1,0x29,-3



6. Create the file /usr/share/X11/xorg.conf.d/99-fbdev.conf

sudo nano  /usr/share/X11/xorg.conf.d/99-fbdev.conf

Section "Device"
  Identifier "myfb"
  Driver "fbdev"
  Option "fbdev" "/dev/fb1"
EndSection


7. Overwrite the file  /boot/cmdline.txt to insert the statements "fbcon=map:10 fbcon=font:VGA8x8 FRAMEBUFFER=/dev/fb1" before the statement "rootwait"

sudo nano /boot/cmdline.txt

dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes fbcon=map:10 fbcon=font:VGA8x8 FRAMEBUFFER=/dev/fb1 rootwait


8. Reboot the Rasberry

sudo reboot

I noticed the LCD response is very lagging, but for some uses is enough.

domingo, 22 de março de 2015

Registro de temperaturas via Web com a utilização do módulo ESP8266

No final de 2014 diversos módulos com o chip ESP8266 apareceram no mercado como uma alternativa de baixo custo (menos de US$ 3) para projetos de "Internet das Coisas" ou IoT.
O módulo é realmente fantástico, com um microcontrolador rápido, 512 KB de flash, 256 KB de eeprom (uma 25Q4-1BT) várias GPIOs, timers, UART e o mais impressionante: Wi-FI !
Neste pouco tempo de vida, vários projetos apareceram e um igualmente incrível é o NodeMCU . Ele substitui o firmware original, onde a programação é feita por comandos AT, (que muito útil quando o módulo é usado em conjunto com um outro processador como o Arduino), por um firmware com um interpretador da linguagem LUA.
Este firmware permite a programação direta nele ou que o programa seja gravado na eeprom, evitando assim a necessidade de gravação da Flash para cada novo programa.
Eu adquiri os módulos ESP8266-7, com antena cerâmica,  no Aliexpress, por US$2,80, apesar de existirem outros modelos já com pinos para conectores.

Para o funcionamento correto do módulo, os pinos GPIO2, Reset e CH_PD  devem ser ligados ao VCC de 3,3 V por meio de resistores de 4,7K e o GPIO15 para Ground. Para que o modo "sono profundo" ou deepsleep também funcione dentro dos programas, um jumper adicional entre o GPIO16 e o Reset (que já tem o resistor)  tem de ser instalado.

A programação do novo firmware NodeMCU é feita via serial, por um adaptador USB->TTL do tipo FT-232 ou SILABS CP-2102, também facilmente encontrável no Aliexpress.com ou no DX.com.
Para se entrar no modo de upgrade de flash o pino GPIO0 deve ser ligado ao Ground. Para uso normal, o GPIO0 deve ser deixado em aberto.

Para se gravar o novo Firmware, há um aplicativo NodeMCU-Flasher. Após a gravação (e o jumper do GPIO0 retirado) se conectando um programa terminal como o Putty na interface COM onde está o conversor USB-Serial, deve se ter acesso ao modo de programação Lua.

Para a programação em Lua, uma boa opção é o LuaUploader, que utiliza a interface serial para upload dos programas escritos na própria IDE, mas antes desconecte o Putty da serial. Se um programa for gravado no módulo com o nome "init.lua" ele sempre será executado automaticamente quando o módulo for ligado.

Nos exemplo abaixo, composto de dois programas que foram gravados no ESP8266, a temperatura é lida de um chip DS18B20 pelo módulo (via protocolo Onewire). O DS18B20 foi ligado diretamente ao módulo com os dois pinos das extremidades no Ground e o do centro na GPIO5.
A tempratura é lida a cada 5 minutos e enviada para o site Thingspeak.com, que recebe o dado e o apresenta em forma de gráfico. Após a transmissão, o módulo entra em "sono profundo"com um consumo de apenas 0,4 mA, o que possibilita uma longa duração da bateria de lítio.

Programa init.lua

print("Setting up WIFI...")
wifi.setmode(wifi.STATION)
--modify according your wireless router settings
wifi.sta.config("SSID","PASSWORD")
wifi.sta.connect()
tmr.alarm(2, 1000, 1, function()
  if wifi.sta.getip()== nil then
    print("IP unavaiable, Waiting...")
  else
    tmr.stop(2)
  print("Config done, IP is "..wifi.sta.getip())
  end
end)
print("*** You've got 3 sec to stop timer 0 ***")
tmr.alarm(0, 3000, 0, function()
  dofile("onewire-things-ds18b20.lua")
end)
tmr.alarm(1, 10000, 0, function()
  print("timer1 trigger dsleep")
  node.dsleep(300*1000*1000)
end)

Programa onewire-things-ds18b20.lua

--'
-- 18b20 one wire example for NODEMCU
-- NODEMCU TEAM
-- LICENCE: http://opensource.org/licenses/MIT
-- Vowstar <vowstar@nodemcu.com>
--'
pin = 2
ow.setup(pin)
count = 0
repeat
  count = count + 1
  addr = ow.reset_search(pin)
  addr = ow.search(pin)
  tmr.wdclr()
until((addr ~= nil) or (count > 100))
if (addr == nil) then
  print("No more addresses.")
else
  print(addr:byte(1,8))
  crc = ow.crc8(string.sub(addr,1,7))
  if (crc == addr:byte(8)) then
    if ((addr:byte(1) == 0x10) or (addr:byte(1) == 0x28)) then
--        repeat
          ow.reset(pin)
          ow.select(pin, addr)
          ow.write(pin, 0x44, 1)
          tmr.delay(1000000)
          present = ow.reset(pin)
          ow.select(pin, addr)
          ow.write(pin,0xBE,1)
          data = nil
          data = string.char(ow.read(pin))
          for i = 1, 8 do
            data = data .. string.char(ow.read(pin))
          end
          crc = ow.crc8(string.sub(data,1,8))
          if (crc == data:byte(9)) then
             t = (data:byte(1) + data:byte(2) * 256) * 625
             t1 = t / 10000
             t2 = t % 10000
             if wifi.sta.getip()~= nil then
                print("Temperature= "..t1.." Centigrade")
                conn=net.createConnection(net.TCP, 0)
                conn:on("receive", function(conn, payload) print(payload) end )
                conn:connect(80,"184.106.153.149")
                conn:send("GET /update?key=newkeyfromthingspeak&field1="..t1.." HTTP/1.1\r\n")
                conn:send("Host: api.thingspeak.com\r\n")
                conn:send("Accept: */*\r\n")
                conn:send("User-Agent: Mozilla/4.0 (compatible; esp8266 Lua; Windows NT 5.1)\r\n")
                conn:send("\r\n")
             end
          end                   
          tmr.wdclr()
--        until false
    else
      print("Device family is not recognized.")
    end
  else
    print("CRC is not valid!")
  end

end

Um exemplo de registro de temperatura pode ser visto aqui.















sexta-feira, 7 de novembro de 2014

Sniffer de pacotes Zigbee ou IEEE 802.15.4 com o Wireshark

Para análise da troca de mensagens de redes de sensores sem fio, especialmente 6LowPAN, a melhor forma é através de um sniffer wireless, que capturasse pacotes IEEE 802.15.4 . Para isso adquiri no dx.com um dongle USB com o chip CC2531 da Texas Instruments. Primeiro tentei utilizar o software disponível pela Texas, mas percebi que era muito ruim, muito inferior ao que normalmente utilizamos, o Wireshark.
Encontrei um projeto muito interessante, para Linux (embora pusesse ser usado no Windows, com muito trabalho), chamado ccsniffpiper. É um programa em Python, que cria um "pipe" entre o dongle USB e o Wireshark. Inicialmente não funcionou com o dongle do dx.com (provavelmente um problema de versão de firmware), mas o Andrew, autor do ccsniffpiper, rapidamente me deu uma dica valiosa e ele funcionou muito bem.
O uso do dongle no Linux me criou um certo transtorno, por ter de rodar o ccsniffpiper e o Wireshark em uma máquina separada (um Raspberry Pi). Ontem encontrei, por acaso uma solução. A Texas Instruments incluiu no pacote  TIMAC 1.5.1 o software TiWsPc, TI Wireshark Packet Converter. Ele faz o mesma função do ccsniffpiper, para Windows. Testei no meu Windows 7 64 Bits e funcionou perfeitamente.
Para configurar, basta rodar o programa TiWsPc com o dongle instalado, e configurar o device com o número do canal:


Em seguida configure o Wireshark para inserir o pipe como uma nova interface em Capture -> Options:


Em seguida, configure em Edit -> Preferences -> Protocols -> IEEE 802.15.4 o FCS para o chip TI CC2531:


E está pronto, basta iniciar a captura.


quarta-feira, 18 de junho de 2014

DDOS com o Pyresonance

Alterei o exemplo IDS do Pyresonance para receber eventos JSON para bloquear um fluxo ou liberá-lo. O comportamento inicial da FSM é liberar todos os fluxos.O programa e o globals estão no Gist.

Os eventos JSON para bloquear o host e liberá-lo são:
python ~/pyretic/pyretic/pyresonance/json_sender.py --flow='{srcip=10.0.0.1}' -e ids -s attack -a 127.0.0.1 -p 50003
python ~/pyretic/pyretic/pyresonance/json_sender.py --flow='{srcip=10.0.0.1}' -e ids -s clean -a 127.0.0.1 -p 50003

Agora, para verificar os fluxos instalados no mininet:
sudo mn --topo=single,3 --controller=remote
cd ~mininet/pyretic
./pyretic.py pyretic.pyresonance.main --config=./pyretic/pyresonance/global.config.dos_external --mode=manual

mininet: h1 ping h2

[mininet@mininet-vm:~]$sudo ovs-appctl bridge/dump-flows s1
duration=56s, priority=0, n_packets=1, n_bytes=42, priority=0,arp,in_port=3,dl_src=aa:d0:ed:f7:e4:83,dl_dst=8a:3a:15:ce:f1:17,nw_src=10.0.0.2,nw_dst=10.0.0.1,arp_op=1,actions=output:2,output:1
duration=61s, priority=0, n_packets=0, n_bytes=0, priority=0,arp,in_port=3,dl_src=aa:d0:ed:f7:e4:83,dl_dst=8a:3a:15:ce:f1:17,nw_src=10.0.0.2,nw_dst=10.0.0.1,arp_op=2,actions=output:2,output:1
duration=56s, priority=0, n_packets=1, n_bytes=42, priority=0,arp,in_port=1,dl_src=8a:3a:15:ce:f1:17,dl_dst=aa:d0:ed:f7:e4:83,nw_src=10.0.0.1,nw_dst=10.0.0.2,arp_op=2,actions=output:3,output:2
duration=61s, priority=0, n_packets=0, n_bytes=0, priority=0,arp,in_port=1,dl_src=8a:3a:15:ce:f1:17,dl_dst=ff:ff:ff:ff:ff:ff,nw_src=10.0.0.1,nw_dst=10.0.0.2,arp_op=1,actions=output:2,output:3
duration=61s, priority=0, n_packets=60, n_bytes=5880, priority=0,icmp,in_port=1,dl_src=8a:3a:15:ce:f1:17,dl_dst=aa:d0:ed:f7:e4:83,nw_src=10.0.0.1,nw_dst=10.0.0.2,nw_tos=0,icmp_type=8,icmp_code=0,actions=output:2,output:3
duration=61s, priority=0, n_packets=60, n_bytes=5880, priority=0,icmp,in_port=3,dl_src=aa:d0:ed:f7:e4:83,dl_dst=8a:3a:15:ce:f1:17,nw_src=10.0.0.2,nw_dst=10.0.0.1,nw_tos=0,icmp_type=0,icmp_code=0,actions=output:1,output:2
duration=62s, priority=0, n_packets=15, n_bytes=1054, priority=0,actions=CONTROLLER:65535

[mininet@mininet-vm:~]$python ~/pyretic/pyretic/pyresonance/json_sender.py --flow='{srcip=10.0.0.1}' -e ids -s attack -a 127.0.0.1 -p 50003

Flow = {srcip=10.0.0.1}
Data Payload = {'dstip': None, 'protocol': None, 'srcmac': None, 'tos': None, 'vlan_pcp': None, 'dstmac': None, 'inport': None, 'ethtype': None, 'srcip': '10.0.0.1', 'dstport': None, 'srcport': None, 'vlan_id': None}
ok

[mininet@mininet-vm:~]$sudo ovs-appctl bridge/dump-flows s1

duration=13s, priority=0, n_packets=12, n_bytes=1176, priority=0,icmp,in_port=1,dl_src=8a:3a:15:ce:f1:17,dl_dst=aa:d0:ed:f7:e4:83,nw_src=10.0.0.1,nw_dst=10.0.0.2,nw_tos=0,icmp_type=8,icmp_code=0,drop
duration=14s, priority=0, n_packets=1, n_bytes=98, priority=0,actions=CONTROLLER:65535

h2 ping h3

[mininet@mininet-vm:~]$sudo ovs-appctl bridge/dump-flows s1
duration=10s, priority=0, n_packets=0, n_bytes=0, priority=0,arp,in_port=3,dl_src=aa:d0:ed:f7:e4:83,dl_dst=ff:ff:ff:ff:ff:ff,nw_src=10.0.0.2,nw_dst=10.0.0.3,arp_op=1,actions=output:1,output:2
duration=5s, priority=0, n_packets=0, n_bytes=0, priority=0,arp,in_port=3,dl_src=aa:d0:ed:f7:e4:83,dl_dst=aa:b5:d9:88:c5:ba,nw_src=10.0.0.2,nw_dst=10.0.0.3,arp_op=2,actions=output:2,output:1
duration=10s, priority=0, n_packets=0, n_bytes=0, priority=0,arp,in_port=2,dl_src=aa:b5:d9:88:c5:ba,dl_dst=aa:d0:ed:f7:e4:83,nw_src=10.0.0.3,nw_dst=10.0.0.2,arp_op=2,actions=output:3,output:1
duration=5s, priority=0, n_packets=0, n_bytes=0, priority=0,arp,in_port=2,dl_src=aa:b5:d9:88:c5:ba,dl_dst=aa:d0:ed:f7:e4:83,nw_src=10.0.0.3,nw_dst=10.0.0.2,arp_op=1,actions=output:3,output:1
duration=46s, priority=0, n_packets=25, n_bytes=2450, priority=0,icmp,in_port=1,dl_src=8a:3a:15:ce:f1:17,dl_dst=aa:d0:ed:f7:e4:83,nw_src=10.0.0.1,nw_dst=10.0.0.2,nw_tos=0,icmp_type=8,icmp_code=0,drop
duration=10s, priority=0, n_packets=10, n_bytes=980, priority=0,icmp,in_port=3,dl_src=aa:d0:ed:f7:e4:83,dl_dst=aa:b5:d9:88:c5:ba,nw_src=10.0.0.2,nw_dst=10.0.0.3,nw_tos=0,icmp_type=8,icmp_code=0,actions=output:1,output:2
duration=10s, priority=0, n_packets=10, n_bytes=980, priority=0,icmp,in_port=2,dl_src=aa:b5:d9:88:c5:ba,dl_dst=aa:d0:ed:f7:e4:83,nw_src=10.0.0.3,nw_dst=10.0.0.2,nw_tos=0,icmp_type=0,icmp_code=0,actions=output:3,output:1
duration=47s, priority=0, n_packets=7, n_bytes=462, priority=0,actions=CONTROLLER:65535

[mininet@mininet-vm:~]$python ~/pyretic/pyretic/pyresonance/json_sender.py --flow='{srcip=10.0.0.1}' -e ids -s clean -a 127.0.0.1 -p 50003

[mininet@mininet-vm:~]$sudo ovs-appctl bridge/dump-flows s1                                                              duration=925s, priority=0, n_packets=28, n_bytes=1176, priority=0,arp,in_port=3,dl_src=aa:d0:ed:f7:e4:83,dl_dst=8a:3a:15:ce:f1:17,nw_src=10.0.0.2,nw_dst=10.0.0.1,arp_op=1,actions=output:2,output:1
duration=930s, priority=0, n_packets=0, n_bytes=0, priority=0,arp,in_port=3,dl_src=aa:d0:ed:f7:e4:83,dl_dst=8a:3a:15:ce:f1:17,nw_src=10.0.0.2,nw_dst=10.0.0.1,arp_op=2,actions=output:2,output:1
duration=925s, priority=0, n_packets=28, n_bytes=1176, priority=0,arp,in_port=1,dl_src=8a:3a:15:ce:f1:17,dl_dst=aa:d0:ed:f7:e4:83,nw_src=10.0.0.1,nw_dst=10.0.0.2,arp_op=2,actions=output:3,output:2
duration=930s, priority=0, n_packets=0, n_bytes=0, priority=0,arp,in_port=1,dl_src=8a:3a:15:ce:f1:17,dl_dst=ff:ff:ff:ff:ff:ff,nw_src=10.0.0.1,nw_dst=10.0.0.2,arp_op=1,actions=output:2,output:3
duration=930s, priority=0, n_packets=930, n_bytes=91140, priority=0,icmp,in_port=1,dl_src=8a:3a:15:ce:f1:17,dl_dst=aa:d0:ed:f7:e4:83,nw_src=10.0.0.1,nw_dst=10.0.0.2,nw_tos=0,icmp_type=8,icmp_code=0,actions=output:3,output:2
duration=930s, priority=0, n_packets=930, n_bytes=91140, priority=0,icmp,in_port=3,dl_src=aa:d0:ed:f7:e4:83,dl_dst=8a:3a:15:ce:f1:17,nw_src=10.0.0.2,nw_dst=10.0.0.1,nw_tos=0,icmp_type=0,icmp_code=0,actions=output:2,output:1
duration=931s, priority=0, n_packets=10, n_bytes=756, priority=0,actions=CONTROLLER:65535

segunda-feira, 2 de junho de 2014

Sobre o LXC

Copiado do Blog do Danny

# Install LXC
sudo apt-get install lxc

# Create a Linux Container named base ( -t: template, -n: namespace )
sudo lxc-create -t ubuntu -n base

# Start the Linux Container ( -d: daemon )
sudo lxc-start -n base -d

# Stop the Linux Container
sudo lxc-stop -n base

# List Linux Containers
lxc-ls --fancy

# Clone the Linux Container
lxc-clone -o base -n newvm1

# Access the container
lxc-console -n newvm1

# Shudown
lxc-shutdown -n test-container

# Destroy
lxc-destroy -n test-container


LXC can be controlled via Libvirt:
http://blog.scottlowe.org/2013/11/27/linux-containers-via-lxc-and-libvirt/

Exploring LXC Networking:

Autostart
By default, containers will not be started after a reboot, even if they were running prior to the shutdown.
To make a container autostart, you simply need to symlink its config file into the /etc/lxc/auto directory:
ln -s /var/lib/lxc/test-container/config /etc/lxc/auto/test-container.conf

sexta-feira, 2 de maio de 2014

Kernel-based Openflow OpenVSwitch on TP-Link WR-1043nd with OpenWRT

I spent a couple days compiling the OpenVswitch 2.0 (and 2.1.2) for my TP-Link WR-1043ND V1.8. I tried at first the Open WRT "trunk" version, but due some errors regarding the "PKG_USE_MIPS16:=0" parameters, I gave up and I decided to use the stable 12.10 Attitude Adjustment, r40431. Later, I found the solution for this MIPS16 issue in the menuconfig "Target Options", but I still with the 12.10 stable version.

The result was amazing, much better than the results with Pantou or CPQD's user-mode switches. I obtained 92 Mbps of throughput instead of the 29 Mbps in user-mode switches. Probably I can get more, but my computer interfaces negociated only at 100 Mbps for the Iperf test.
There is also a user-mode option on OpenVSwitch, but is very slow, with 4 Mbps of throughput.
I'll try to figure out the differences in features between the two modes later.

The steps to compile the OVS are the following, using a Linux machine (either virtual or real) with Ubuntu 12.19, 7 GB free space, 1,5 Gb RAM.

apt-get install git quilt build-essential binutils flex bison autoconf gettext texinfo sharutils subversion libncurses5-dev ncurses-term zlib1g-dev gawk

git clone git://git.openwrt.org/12.09/openwrt.git cd openwrt
./scripts/feeds update -a
./scripts/feeds install -a
The next step is choosing the feed location. For the 2.0 OVS version:
echo 'src-git openvswitch git://github.com/alexanderplatz1999/openvswitch.git' >> feeds.conf
or 2.1.2 OVS version:
echo 'src-git openvswitch git://github.com/pichuang/openvwrt.git' >> feeds.conf

./scripts/feeds update openvswitch
./scripts/feeds install -a -p openvswitch
make menuconfig
Select Target Profile (TP-LINK TL-WR1043N/ND)
<*> iperf
-*- openvswitch-common
<*> openvswitch-controller
<*> openvswitch-ipsec
<*> openvswitch-switch
<*> tcpdump
Kernel modules ---> Network Support ---> <*> kmod-tun
Save and Exit
make kernel_menuconfig
> Networking support > Networking options > <*> Open vSwitch
> Networking support > Networking options > <*> Hierarchical Token Bucket (HTB)
Save and Exit
echo '# CONFIG_KERNEL_BRIDGE is not set' >> .config

     You can do the "make" command right now, but the image will be generated without the configuration files. The image will be in the openwrt/bin/ar71xx/openwrt-ar71xx-generic-tl-wr1043nd-v1-squashfs-factory.bin file.The IP address for telnet access using a LAN port is 192.168.1.1, no login and password.
Transfer the image to the router using the Web GUI if you are using the original TP-Link firmware or WINSCP
BusyBox v1.19.4 (2014-04-08 13:48:14 PDT) built-in shell (ash)
Enter 'help' for a list of built-in commands.

  _______                     ________        __
 |       |.-----.-----.-----.|  |  |  |.----.|  |_
 |   -   ||  _  |  -__|     ||  |  |  ||   _||   _|
 |_______||   __|_____|__|__||________||__|  |____|
          |__| W I R E L E S S   F R E E D O M
 -----------------------------------------------------
 ATTITUDE ADJUSTMENT (Attitude Adjustment, r40431)
 -----------------------------------------------------
  * 1/4 oz Vodka      Pour all ingredients into mixing
  * 1/4 oz Gin        tin with ice, strain into glass.
  * 1/4 oz Amaretto
  * 1/4 oz Triple sec
  * 1/4 oz Peach schnapps
  * 1/4 oz Sour mix
  * 1 splash Cranberry juice
 -----------------------------------------------------
root@OpenWrt:~#

    If you want to include the configuration files before the "make", follow this steps in the Linux machine (not the router):
mkdir files
mkdir files/etc
mkdir files/etc/config
mkdir files/etc/rc.d
   Copy the files from this Gist location. The S99ovsboot (adapted from a  script used  in NZNOG SDN workshop) must be saved in the files/etc/rc.d, and the "network", "firewall" and "wireless" in the files/etc/config directory.
With these configuration files, the IP address to access the router is 192.168.1.112 on the WAN port and the openflow controller address is 192.168.1.130.
   You can try the compiled image (tested on a TP-Link WR-1043 V1.8). The IP address of WAN interface is 192.168.1.112 and the controller is 192.168.1.130, but you can change them editing the files /etc/config/network and /etc/rc.d/S99bootovs.

Update:
During the tests I obtained more than 500 Mbps. Is much more than the user space switch (29 Mbps). The results of IPERF test for upload and WGET download of a 400 MB file are the following. Without the DUT (the TP-Link), the performance was about 1 Gbps.

IPERF:
------------------------------------------------------------
Client connecting to 200.x.x.x, TCP port 5001
TCP window size: 85.3 KByte (default)
------------------------------------------------------------
[  3] local 100.64.0.1 port 54581 connected with 200.x.x.x port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec   611 MBytes   513 Mbits/sec

------------------------------------------------------------
Client connecting to 200.x.x.x, TCP port 5001
TCP window size: 85.3 KByte (default)
------------------------------------------------------------
[  3] local 100.64.0.1 port 54584 connected with 200.x.x.x port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec   594 MBytes   498 Mbits/sec

------------------------------------------------------------
Client connecting to 200.x.x.x, TCP port 5001
TCP window size: 85.3 KByte (default)
------------------------------------------------------------
[  3] local 100.64.0.1 port 54587 connected with 200.x.x.x port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec   590 MBytes   495 Mbits/sec

WGET (HTTP)
...
410250K .......... .......... .......... .......... ....      100% 89,1M=6,7s
2014-05-19 13:22:36 (60,2 MB/s) - /dev/null

60,2 MB/s = 481,6 Mbps

sábado, 15 de março de 2014

Webservices no POX

Para o suporte de Webservices no POX, o módulo openflow.webservice deve ser carregado junto do controlador:
./pox.py log.level --DEBUG  web.webcore openflow.webservice samples.pretty_log
Note que neste exemplo o módulo forwarding.l2_learning não foi carregado, ou seja, o POX não instalará fluxos no switches OF automaticamente para eles se comportarem como "switches"
Se você rodar o mininet em uma outra janela, os hosts não irão se pingar, pois não existem fluxos instalados no controlador:
sudo mn --controller remote  (um switch e dois hosts)
Para instalar um fluxo no switch, envie via curl (em outra janela) o seguinte comando para o controlador, que transformará o switch OF  em um HUB, permitindo a comunicação entre os hosts:
curl -i -X POST -d '{"method":"set_table","params":{"dpid":"00-00-00-00-00-01","flows":[{"actions":[{"type":"OFPAT_OUTPUT","port":"OFPP_ALL"}],"match":{}}]},"id":0}' http://127.0.0.1:8000/OF/
Agora o pingall do mininet deverá funcionar.
Para verificar os fluxos instalados no switch 1:
curl -i -X POST -d '{"method":"get_flow_stats","params":{"dpid":"00-00-00-00-00-01"},"id":0}' http://127.0.0.1:8000/OF/

Um outro exemplo é

./pox.py log.level --DEBUG forwarding.l2_learning web.webcore openflow.webservice
Note que o módulo forwarding.l2_learning também foi carregado, ou seja, não será necessário instalar fluxos via curl.

Rode o mininet em outra janela:
sudo mn --topo linear,4 --controller remote (quatro switches em linha, 1 host por switch)

Por exemplo, para ver os fluxos instalados no switch 4 após um pingall no mn, o comando é:
curl -i -X POST -d '{"method":"get_flow_stats","params":{"dpid":"00-00-00-00-00-04"},"id":0}' http://127.0.0.1:8000/OF/

Para listar os switches instalados no controlador:
curl -i -X POST -d '{"method":"get_switches", "id":0}' http://127.0.0.1:8000/OF/

Este post abaixo, do site http://www.noxrepo.org/2012/09/pox-web-interfaces/  diz que o melhor modo de se utilizar webservices é com o módulo ajax_transport, pois a comunicação do POX com a aplicação é bidirecional, avisando a aplicação quando há a entrada de um pacote no switch :
"The other major way to work with OpenFlow over the web is via the OpenFlow messenger service (openflow.of_service) coupled with one of the messenger’s web transports (e.g., ajax_transport). This is what POXDesk does — you can use it as an example if you want to check it out. As far as I recall, the only real reason to do this now is that it supports notifications like packet_ins."