A programmable dataplane using the eBPF instruction set.
Tested and working with
- Ubuntu 22.04.3 LTS - kernel 5.15.0-92-generic
- clang 14.0.0
Very simple (legacy) learning switch that learn the source mac address and associated input port. If the port is unknown the packet is flooded.
Run a mininet topology and install the learningswitch.o eBPF elf to the switches.
# Run the mininet topology with three switches and 4 hosts
cd mininet
sudo ./3sw_topo.py
# Run the interactive controller
cd controller
./cli.py
--------------------------------------------------------------------------------
eBPF Switch Controller Command Line Interface - Netlab 2016
Simon Jouet <[email protected]> - University of Glasgow
--------------------------------------------------------------------------------
Documented commands (type help <topic>):
========================================
help
Undocumented commands:
======================
EOF connections
(Cmd) Connection from switch 00000001, version 1
Connection from switch 00000002, version 1
Connection from switch 00000003, version 1
(Cmd) connections
dpid version connected at
========== ========= ===============
00000001 1 1467377575.33
00000002 1 1467377575.37
00000003 1 1467377575.4
========== ========= ===============
(Cmd) 1 install ../examples/learningswitch.o
(Cmd) 2 install ../examples/learningswitch.o
(Cmd) 3 install ../examples/learningswitch.o
Try the connectivity in Mininet between the hosts
mininet> pingall
*** Ping: testing ping reachability
h1 -> h2 h3 h4
h2 -> h1 h3 h4
h3 -> h1 h2 h4
h4 -> h1 h2 h3
*** Results: 0% dropped (12/12 received)
Analyze the tables of the switches to see the ethernet addres to port mapping
# List the BPF tables available on switch 1
(Cmd) 1 tables
(Cmd)
name type key size value size max entries
========= ====== ========== ============ =============
inports HASH 6 4 256
========= ====== ========== ============ =============
# List the entries in the inports table
(Cmd) 1 table inports list
(Cmd)
Key Value
============== ==========
000400000000 00000000
000400000003 01000000
000400000002 01000000
000400000001 00000000
============== ==========
A simple centralized switch that will delegate the mac address to port mapping to the controller if the destination is unknown.
Run a mininet topology and run the controller responsible to reply to the PacketIn events from the switches.
# Start the mininet topology
cd mininet
sudo ./3sw_topo.py
# Start the controller
cd controller
./simpleswitch.py
Connection from switch 00000001, version 1
Installing the eBPF ELF
Connection from switch 00000003, version 1
Installing the eBPF ELF
Connection from switch 00000002, version 1
Installing the eBPF ELF
2 333300000002 ba776cdc9a6b 0x86dd
1 333300000002 ba776cdc9a6b 0x86dd
0 333300000002 ba776cdc9a6b 0x86dd
1 333300000002 000400000000 0x86dd
Inserting entry in switch 2 000400000000 1
[...]
More on the wiki at https://github.com/UofG-netlab/BPFabric/wiki/OpenWRT
- Error while compiling the examples
/usr/include/linux/types.h:4:10: fatal error: 'asm/types.h' file not found
sudo ln -s /usr/include/x86_64-linux-gnu/asm/ /usr/include/asm
sudo apt-get install g++-multilib
objcopy -I elf64-little -O binary --only-section=.text program.o program.bin
ubpf/bin/ubpf-disassembler program.bin program.asm
cat program.asm
- String relocation is not working properly. The symbol in the ELF file is not containing the offset to the string table preventing the relocation of the string.
- Simon Jouet ([email protected])
- Dimitrios Pezaros ([email protected])
- EPSRC EP/L026015/1: A Situtation-Aware Information Infrastructure