[p4, controller] hack NDP reply

This commit is contained in:
Nico Schottelius 2019-02-28 10:56:22 +01:00
parent 2081d30136
commit b29cf1a296
5 changed files with 229 additions and 12 deletions

View File

@ -9,9 +9,9 @@
| | | | | | | |
| 2019-02-23 | python2 / ipaddress is buggy | x | | 2019-02-23 | python2 / ipaddress is buggy | x |
| | p4utils is python2 only support | | | | p4utils is python2 only support | |
| | bmpy_utils is not installable with pip | | | | bmpy_utils is not installable with pip | |
| | python2 / latest ipaddress==1.0.22 still has the bug | | | | python2 / latest ipaddress==1.0.22 still has the bug | |
| | ipaddress.ip_network("2001:db8:61::/64") | | | | ipaddress.ip_network("2001:db8:61::/64") | |
| | IPv6Network(u'3230:3031:3a64:6238:3a36:313a:3a2f:3634/128') | | | | IPv6Network(u'3230:3031:3a64:6238:3a36:313a:3a2f:3634/128') | |
| | | | | | | |
| | egress routing | x | | | egress routing | x |
@ -20,7 +20,21 @@
| | | | | | | |
| | | | | | | |
| 2019-02-28 | Meet Laurent #2 | | | 2019-02-28 | Meet Laurent #2 | |
| | - Setup base code | |
| | - Parser for all protocols (udp,tcp,icmp,icmp6) | | | | - Parser for all protocols (udp,tcp,icmp,icmp6) | |
| | - Started with icmp translation | |
| | - Investigating into IPv6 based checksums | |
| | - Some issues with python2 (ipaddr) - slowing down | |
| | - Reading into various RFCs, NDP, MLD | |
| | - Reading about multicast / trying to figure out dynamic membership | |
| | | |
| | - Questions | |
| | * Re-using code (lee howard) | |
| | * Multicast | |
| | * A lot of redundant code / different tables / repeating | |
| | | |
| | - Next steps: | |
| | * Supporting MLD | |
| | | | | | | |
| | | | | | | |
| 2019-02-22 | Have rough definition of tasks | | | 2019-02-22 | Have rough definition of tasks | |
@ -63,7 +77,7 @@
*** DONE Get feature list of tayga *** DONE Get feature list of tayga
*** DONE Setup P4 base / structure *** DONE Setup P4 base / structure
*** DONE Create minimal controller for populating tables *** DONE Create minimal controller for populating tables
*** TODO Checkout / review egress settings *** DONE Checkout / review egress settings
*** TODO Implement ICMP <-> ICMP6 translation *** TODO Implement ICMP <-> ICMP6 translation
**** DONE Parse icmp **** DONE Parse icmp
**** DONE Parse icmpv6 **** DONE Parse icmpv6
@ -71,6 +85,9 @@
**** DONE Calculate ICMP6 checksums **** DONE Calculate ICMP6 checksums
**** TODO Implement minimal neighbor discovery **** TODO Implement minimal neighbor discovery
***** TODO For the switch ***** TODO For the switch
****** DONE Register IPv6 address in table
****** TODO Parse ICMPv6 up to neighbor solicitation
****** TODO Use NDP (Neighbor Solicitation (NDP) , Neighbor Advertisement (NDP))
***** TODO For other nodes -> multicast ***** TODO For other nodes -> multicast
***** TODO Maybe implement link local addresses (missing at the moment) ***** TODO Maybe implement link local addresses (missing at the moment)
****** ff02::/?? ****** ff02::/??
@ -231,6 +248,106 @@ root@ubuntu:~/master-thesis/p4app# ls -1 /proc/sys/net/ipv6/conf/*/disable_ipv6
/proc/sys/net/ipv6/conf/lo/disable_ipv6 /proc/sys/net/ipv6/conf/lo/disable_ipv6
root@ubuntu:~/master-thesis/p4app# root@ubuntu:~/master-thesis/p4app#
Works on mininet
mininet> h2 bash
root@line:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: h2-eth0@if93: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 32:0e:1e:bf:3c:4b brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 10.0.0.2/8 brd 10.255.255.255 scope global h2-eth0
valid_lft forever preferred_lft forever
inet6 fe80::300e:1eff:febf:3c4b/64 scope link
valid_lft forever preferred_lft forever
root@line:~# ip addr add 2001:db8:61::42/64 dev h2-eth0
root@line:~# ^Dexit
mininet> h1 bash
root@line:~# ip addr add 2001:db8:61::42/64^[[D^[[D^?^?^?^?^?^?^?^?^?^?^?^C^C
root@line:~# ^Dexit
mininet> h1 ip addr add 2001:db8:61::2/64 dev h1-eth0
mininet> h2 ping6 -c2 2001:db8:61::2
PING 2001:db8:61::2(2001:db8:61::2) 56 data bytes
64 bytes from 2001:db8:61::2: icmp_seq=1 ttl=64 time=0.230 ms
64 bytes from 2001:db8:61::2: icmp_seq=2 ttl=64 time=0.138 ms
--- 2001:db8:61::2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1018ms
rtt min/avg/max/mdev = 0.138/0.184/0.230/0.046 ms
mininet>
mininet on VM also works
mininet> h1 ip addr add 2001:db8:61::1/64 dev h1-eth0
mininet> h2 ip addr add 2001:db8:61::2/64 dev h2-eth0
mininet> h2 ping6 -c2 2001:db8:61::2
PING 2001:db8:61::2(2001:db8:61::2) 56 data bytes
64 bytes from 2001:db8:61::2: icmp_seq=1 ttl=64 time=0.053 ms
64 bytes from 2001:db8:61::2: icmp_seq=2 ttl=64 time=0.082 ms
--- 2001:db8:61::2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.053/0.067/0.082/0.016 ms
mininet>
WORKING trace on mininet on the VM
19:38:49.852088 IP6 2001:db8:61::2 > ff02::1:ff00:1: ICMP6, neighbor solicitation, who has 2001:db8:61::1, length 32
19:38:49.852144 IP6 2001:db8:61::1 > 2001:db8:61::2: ICMP6, neighbor advertisement, tgt is 2001:db8:61::1, length 32
19:38:49.852163 IP6 2001:db8:61::2 > 2001:db8:61::1: ICMP6, echo request, seq 1, length 64
19:38:49.852176 IP6 2001:db8:61::1 > 2001:db8:61::2: ICMP6, echo reply, seq 1, length 64
checking ipv6 in p4-utils
p4@ubuntu:~/p4-utils$ grep -ri ipv6 .
./p4utils/mininetlib/p4_mininet.py: # disable IPv6
./p4utils/mininetlib/p4_mininet.py: self.cmd("sysctl -w net.ipv6.conf.all.disable_ipv6=1")
./p4utils/mininetlib/p4_mininet.py: self.cmd("sysctl -w net.ipv6.conf.default.disable_ipv6=1")
./p4utils/mininetlib/p4_mininet.py: self.cmd("sysctl -w net.ipv6.conf.lo.disable_ipv6=1")
./p4utils/mininetlib/p4net.py: #remove Ipv6 for all the interfaces
./p4utils/mininetlib/p4net.py: cmd2 = "sysctl net.ipv6.conf.{0}.disable_ipv6=1"
./p4utils/mininetlib/p4net.py: #remove ipv6
Binary file ./p4utils/mininetlib/p4_mininet.pyc matches
Binary file ./p4utils/mininetlib/p4net.pyc matches
Binary file ./p4utils/utils/runtime_API.pyc matches
./p4utils/utils/runtime_API.py:class UIn_BadIPv6Error(UIn_Error):
./p4utils/utils/runtime_API.py:def ipv6Addr_to_bytes(addr):
./p4utils/utils/runtime_API.py: from ipaddr import IPv6Address
./p4utils/utils/runtime_API.py: ip = IPv6Address(addr)
./p4utils/utils/runtime_API.py: raise UIn_BadIPv6Error()
./p4utils/utils/runtime_API.py: raise UIn_BadIPv6Error()
./p4utils/utils/runtime_API.py: return ipv6Addr_to_bytes(input_str)
./p4utils/utils/runtime_API.py: except UIn_BadIPv6Error:
./p4utils/utils/runtime_API.py: raise UIn_BadParamError("Invalid IPv6 address")
p4@ubuntu:~/p4-utils$
Messages we see in the controller on startup
DEBUG:main:INCOMING: <Ether dst=33:33:00:00:00:16 src=00:00:0a:00:00:02 type=0x86dd |<IPv6 version=6 tc=0 fl=0 plen=56 nh=Hop-by-Hop Option Header hlim=1 src=:: dst=ff02::16 |<IPv6ExtHdrHopByHop nh=ICMPv6 len=0 autopad=On options=[<RouterAlert otype=Router Alert [00: skip, 0: Don't change en-route] optlen=2 value=Datagram contains a MLD message |>, <PadN otype=PadN [00: skip, 0: Don't change en-route] optlen=0 |>] |<ICMPv6MLReport2 type=MLD Report Version 2 res=0 cksum=0x6d6d reserved=0 records_number=2 records=[<ICMPv6MLDMultAddrRec rtype=4 auxdata_len=0 sources_number=0 dst=ff02::1:ff00:1 sources=[ ] auxdata='' |<ICMPv6MLDMultAddrRec rtype=4 auxdata_len=0 sources_number=0 dst=ff02::1:ff00:2 |>>] |>>>>
DEBUG:main:INCOMING: <Ether dst=33:33:00:00:00:16 src=00:01:0a:00:00:02 type=0x86dd |<IPv6 version=6 tc=0 fl=0 plen=36 nh=Hop-by-Hop Option Header hlim=1 src=fe80::201:aff:fe00:2 dst=ff02::16 |<IPv6ExtHdrHopByHop nh=ICMPv6 len=0 autopad=On options=[<RouterAlert otype=Router Alert [00: skip, 0: Don't change en-route] optlen=2 value=Datagram contains a MLD message |>, <PadN otype=PadN [00: skip, 0: Don't change en-route] optlen=0 |>] |<ICMPv6MLReport2 type=MLD Report Version 2 res=0 cksum=0x6604 reserved=0 records_number=1 records=[<ICMPv6MLDMultAddrRec rtype=4 auxdata_len=0 sources_number=0 dst=ff02::1:ff00:2 |>] |>>>>
DEBUG:main:INCOMING: <Ether dst=33:33:00:00:00:16 src=00:00:0a:00:00:01 type=0x86dd |<IPv6 version=6 tc=0 fl=0 plen=36 nh=Hop-by-Hop Option Header hlim=1 src=fe80::200:aff:fe00:1 dst=ff02::16 |<IPv6ExtHdrHopByHop nh=ICMPv6 len=0 autopad=On options=[<RouterAlert otype=Router Alert [00: skip, 0: Don't change en-route] optlen=2 value=Datagram contains a MLD message |>, <PadN otype=PadN [00: skip, 0: Don't change en-route] optlen=0 |>] |<ICMPv6MLReport2 type=MLD Report Version 2 res=0 cksum=0x6607 reserved=0 records_number=1 records=[<ICMPv6MLDMultAddrRec rtype=4 auxdata_len=0 sources_number=0 dst=ff02::1:ff00:1 |>] |>>>>
DEBUG:main:INCOMING: <Ether dst=33:33:00:00:00:02 src=00:00:0a:00:00:01 type=0x86dd |<IPv6 version=6 tc=0 fl=0 plen=16 nh=ICMPv6 hlim=255 src=fe80::200:aff:fe00:1 dst=ff02::2 |<ICMPv6ND_RS type=Router Solicitation code=0 cksum=0xf72e res=0 |<ICMPv6NDOptSrcLLAddr type=1 len=1 lladdr=00:00:0a:00:00:01 |>>>>
DEBUG:main:INCOMING: <Ether dst=33:33:00:00:00:16 src=00:00:0a:00:00:02 type=0x86dd |<IPv6 version=6 tc=0 fl=0 plen=56 nh=Hop-by-Hop Option Header hlim=1 src=:: dst=ff02::16 |<IPv6ExtHdrHopByHop nh=ICMPv6 len=0 autopad=On options=[<RouterAlert otype=Router Alert [00: skip, 0: Don't change en-route] optlen=2 value=Datagram contains a MLD message |>, <PadN otype=PadN [00: skip, 0: Don't change en-route] optlen=0 |>] |<ICMPv6MLReport2 type=MLD Report Version 2 res=0 cksum=0x6d6d reserved=0 records_number=2 records=[<ICMPv6MLDMultAddrRec rtype=4 auxdata_len=0 sources_number=0 dst=ff02::1:ff00:1 sources=[ ] auxdata='' |<ICMPv6MLDMultAddrRec rtype=4 auxdata_len=0 sources_number=0 dst=ff02::1:ff00:2 |>>] |>>>>
DEBUG:main:INCOMING: <Ether dst=33:33:00:00:00:16 src=00:00:0a:00:00:01 type=0x86dd |<IPv6 version=6 tc=0 fl=0 plen=36 nh=Hop-by-Hop Option Header hlim=1 src=fe80::200:aff:fe00:1 dst=ff02::16 |<IPv6ExtHdrHopByHop nh=ICMPv6 len=0 autopad=On options=[<RouterAlert otype=Router Alert [00: skip, 0: Don't change en-route] optlen=2 value=Datagram contains a MLD message |>, <PadN otype=PadN [00: skip, 0: Don't change en-route] optlen=0 |>] |<ICMPv6MLReport2 type=MLD Report Version 2 res=0 cksum=0x6607 reserved=0 records_number=1 records=[<ICMPv6MLDMultAddrRec rtype=4 auxdata_len=0 sources_number=0 dst=ff02::1:ff00:1 |>] |>>>>
DEBUG:main:INCOMING: <Ether dst=33:33:00:00:00:16 src=00:00:0a:00:00:02 type=0x86dd |<IPv6 version=6 tc=0 fl=0 plen=56 nh=Hop-by-Hop Option Header hlim=1 src=fe80::200:aff:fe00:2 dst=ff02::16 |<IPv6ExtHdrHopByHop nh=ICMPv6 len=0 autopad=On options=[<RouterAlert otype=Router Alert [00: skip, 0: Don't change en-route] optlen=2 value=Datagram contains a MLD message |>, <PadN otype=PadN [00: skip, 0: Don't change en-route] optlen=0 |>] |<ICMPv6MLReport2 type=MLD Report Version 2 res=0 cksum=0x63ea reserved=0 records_number=2 records=[<ICMPv6MLDMultAddrRec rtype=4 auxdata_len=0 sources_number=0 dst=ff02::1:ff00:1 sources=[ ] auxdata='' |<ICMPv6MLDMultAddrRec rtype=4 auxdata_len=0 sources_number=0 dst=ff02::1:ff00:2 |>>] |>>>>
DEBUG:main:INCOMING: <Ether dst=33:33:00:00:00:02 src=00:00:0a:00:00:02 type=0x86dd |<IPv6 version=6 tc=0 fl=0 plen=16 nh=ICMPv6 hlim=255 src=fe80::200:aff:fe00:2 dst=ff02::2 |<ICMPv6ND_RS type=Router Solicitation code=0 cksum=0xf72d res=0 |<ICMPv6NDOptSrcLLAddr type=1 len=1 lladdr=00:00:0a:00:00:02 |>>>>
DEBUG:main:INCOMING: <Ether dst=33:33:00:00:00:16 src=00:00:0a:00:00:02 type=0x86dd |<IPv6 version=6 tc=0 fl=0 plen=56 nh=Hop-by-Hop Option Header hlim=1 src=fe80::200:aff:fe00:2 dst=ff02::16 |<IPv6ExtHdrHopByHop nh=ICMPv6 len=0 autopad=On options=[<RouterAlert otype=Router Alert [00: skip, 0: Don't change en-route] optlen=2 value=Datagram contains a MLD message |>, <PadN otype=PadN [00: skip, 0: Don't change en-route] optlen=0 |>] |<ICMPv6MLReport2 type=MLD Report Version 2 res=0 cksum=0x63ea reserved=0 records_number=2 records=[<ICMPv6MLDMultAddrRec rtype=4 auxdata_len=0 sources_number=0 dst=ff02::1:ff00:1 sources=[ ] auxdata='' |<ICMPv6MLDMultAddrRec rtype=4 auxdata_len=0 sources_number=0 dst=ff02::1:ff00:2 |>>] |>>>>
DEBUG:main:INCOMING: <Ether dst=33:33:00:00:00:02 src=00:00:0a:00:00:01 type=0x86dd |<IPv6 version=6 tc=0 fl=0 plen=16 nh=ICMPv6 hlim=255 src=fe80::200:aff:fe00:1 dst=ff02::2 |<ICMPv6ND_RS type=Router Solicitation code=0 cksum=0xf72e res=0 |<ICMPv6NDOptSrcLLAddr type=1 len=1 lladdr=00:00:0a:00:00:01 |>>>>
DEBUG:main:INCOMING: <Ether dst=33:33:00:00:00:02 src=00:00:0a:00:00:02 type=0x86dd |<IPv6 version=6 tc=0 fl=0 plen=16 nh=ICMPv6 hlim=255 src=fe80::200:aff:fe00:2 dst=ff02::2 |<ICMPv6ND_RS type=Router Solicitation code=0 cksum=0xf72d res=0 |<ICMPv6NDOptSrcLLAddr type=1 len=1 lladdr=00:00:0a:00:00:02 |>>>>
DEBUG:main:INCOMING: <Ether dst=33:33:00:00:00:02 src=00:00:0a:00:00:01 type=0x86dd |<IPv6 version=6 tc=0 fl=0 plen=16 nh=ICMPv6 hlim=255 src=fe80::200:aff:fe00:1 dst=ff02::2 |<ICMPv6ND_RS type=Router Solicitation code=0 cksum=0xf72e res=0 |<ICMPv6NDOptSrcLLAddr type=1 len=1 lladdr=00:00:0a:00:00:01 |>>>>
DEBUG:main:INCOMING: <Ether dst=33:33:00:00:00:02 src=00:00:0a:00:00:02 type=0x86dd |<IPv6 version=6 tc=0 fl=0 plen=16 nh=ICMPv6 hlim=255 src=fe80::200:aff:fe00:2 dst=ff02::2 |<ICMPv6ND_RS type=Router Solicitation code=0 cksum=0xf72d res=0 |<ICMPv6NDOptSrcLLAddr type=1 len=1 lladdr=00:00:0a:00:00:02 |>>>>
***** Ignored ICMPv6 packets
We are not using router advertisements, so we ignore RS packets
DEBUG:main:INCOMING: <Ether dst=33:33:00:00:00:02 src=00:00:0a:00:00:01 type=0x86dd |<IPv6 version=6 tc=0 fl=0 plen=16 nh=ICMPv6 hlim=255 src=fe80::200:aff:fe00:1 dst=ff02::2 |<ICMPv6ND_RS type=Router Solicitation code=0 cksum=0xf72e res=0 |<ICMPv6NDOptSrcLLAddr type=1 len=1 lladdr=00:00:0a:00:00:01 |>>>>
**** Static mappings **** Static mappings
- likely need table(s) - likely need table(s)
@ -276,6 +393,10 @@ listening on h1-eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
4 packets received by filter 4 packets received by filter
0 packets dropped by kernel 0 packets dropped by kernel
root@ubuntu:~/master-thesis# root@ubuntu:~/master-thesis#
***** When pinging we see ***** When pinging we see
DEBUG:main:INCOMING: <Ether dst=33:33:ff:00:00:42 src=00:00:0a:00:00:01 type=0x86dd |<IPv6 version=6 tc=0 fl=0 plen=32 nh=ICMPv6 hlim=255 src=2001:db8:61::1 dst=ff02::1:ff00:42 |<ICMPv6ND_NS type=Neighbor Solicitation code=0 cksum=0xd343 res=0 tgt=2001:db8:61::42 |<ICMPv6NDOptSrcLLAddr type=1 len=1 lladdr=00:00:0a:00:00:01 |>>>> DEBUG:main:INCOMING: <Ether dst=33:33:ff:00:00:42 src=00:00:0a:00:00:01 type=0x86dd |<IPv6 version=6 tc=0 fl=0 plen=32 nh=ICMPv6 hlim=255 src=2001:db8:61::1 dst=ff02::1:ff00:42 |<ICMPv6ND_NS type=Neighbor Solicitation code=0 cksum=0xd343 res=0 tgt=2001:db8:61::42 |<ICMPv6NDOptSrcLLAddr type=1 len=1 lladdr=00:00:0a:00:00:01 |>>>>
DEBUG:main:INCOMING: <Ether dst=33:33:ff:00:00:42 src=00:00:0a:00:00:01 type=0x86dd |<IPv6 version=6 tc=0 fl=0 plen=32 nh=ICMPv6 hlim=255 src=2001:db8:61::1 dst=ff02::1:ff00:42 |<ICMPv6ND_NS type=Neighbor Solicitation code=0 cksum=0xd343 res=0 tgt=2001:db8:61::42 |<ICMPv6NDOptSrcLLAddr type=1 len=1 lladdr=00:00:0a:00:00:01 |>>>> DEBUG:main:INCOMING: <Ether dst=33:33:ff:00:00:42 src=00:00:0a:00:00:01 type=0x86dd |<IPv6 version=6 tc=0 fl=0 plen=32 nh=ICMPv6 hlim=255 src=2001:db8:61::1 dst=ff02::1:ff00:42 |<ICMPv6ND_NS type=Neighbor Solicitation code=0 cksum=0xd343 res=0 tgt=2001:db8:61::42 |<ICMPv6NDOptSrcLLAddr type=1 len=1 lladdr=00:00:0a:00:00:01 |>>>>
@ -292,12 +413,13 @@ DEBUG:main:INCOMING: <Ether dst=33:33:ff:00:00:42 src=00:00:0a:00:00:01 type=0x
**** Not included **** Not included
- DNS64 - has already been solved in a different domain - DNS64 - has already been solved in a different domain
*** References / Follow up *** References / Follow up
**** RFC 2460 IPv6 (Checksum https://tools.ietf.org/html/rfc2460#section-8.1)
**** RFC 3810 MLD2 https://tools.ietf.org/html/rfc3810
**** RFC 4443 ICMPv6 https://tools.ietf.org/html/rfc4443
**** RFC 4861: https://tools.ietf.org/html/rfc4861 Neighbor discovery
**** RFC 6052: https://tools.ietf.org/html/rfc6052 IPv6 Addressing of IPv4/IPv6 Translators **** RFC 6052: https://tools.ietf.org/html/rfc6052 IPv6 Addressing of IPv4/IPv6 Translators
**** RFC 6586 for deployment experiences using Stateful NAT64. **** RFC 6586 for deployment experiences using Stateful NAT64.
**** RFC 7757 Explicit Address Mappings for Stateless IP/ICMP Translation **** RFC 7757 Explicit Address Mappings for Stateless IP/ICMP Translation
**** RFC 4443 ICMPv6 https://tools.ietf.org/html/rfc4443
**** RFC 4861: https://tools.ietf.org/html/rfc4861 Neighbor discovery
**** RFC 2460 IPv6 (Checksum https://tools.ietf.org/html/rfc2460#section-8.1)
**** EAMT/Jool: https://www.jool.mx/en/eamt.html **** EAMT/Jool: https://www.jool.mx/en/eamt.html
**** Solicited node multicast address https://en.wikipedia.org/wiki/Solicited-node_multicast_address **** Solicited node multicast address https://en.wikipedia.org/wiki/Solicited-node_multicast_address
* Proposal / task description * Proposal / task description
@ -366,3 +488,24 @@ to challenge this notion with three different methods:
As the IPv4 header does not allow embedding IPv6 addresses due to size As the IPv4 header does not allow embedding IPv6 addresses due to size
limitations, embedding the destination address in a secondary header limitations, embedding the destination address in a secondary header
might be necessary (possibly encapsulated in UDP). might be necessary (possibly encapsulated in UDP).
* Detail LOG
** 2019-02-28
*** pinging in router mode: nothing shown in the controller, multicast forwarded -> "ok"
root@ubuntu:~/master-thesis/p4app# ping6 -c1 2001:db8:61::42
PING 2001:db8:61::42(2001:db8:61::42) 56 data bytes
From 2001:db8:61::1 icmp_seq=1 Destination unreachable: Address unreachable
--- 2001:db8:61::42 ping statistics ---
1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms
root@ubuntu:~/master-thesis/p4app#
sudo: unable to resolve host ubuntu
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on h1-eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
09:47:07.191569 IP6 2001:db8:61::1 > ff02::1:ff00:42: ICMP6, neighbor solicitation, who has 2001:db8:61::42, length 32
09:47:08.190331 IP6 2001:db8:61::1 > ff02::1:ff00:42: ICMP6, neighbor solicitation, who has 2001:db8:61::42, length 32
09:47:09.190279 IP6 2001:db8:61::1 > ff02::1:ff00:42: ICMP6, neighbor solicitation, who has 2001:db8:61::42, length 32
*** TODO special rule for ff02::1:ff00:42

View File

@ -110,6 +110,9 @@ class L2Controller(object):
self.controller.table_add("ndp", "multicast_pkg", [ndp_prefix, str(port)], [str(port)]) self.controller.table_add("ndp", "multicast_pkg", [ndp_prefix, str(port)], [str(port)])
# Special rule for switch entries
self.controller.table_add("ndp_answer", "icmp6_neighbor_solicitation", ["ff02::1:ff00:42", "135"], ["2001:db8:61::42"])
def init_boilerplate(self, sw_name): def init_boilerplate(self, sw_name):
self.topo = Topology(db="topology.db") self.topo = Topology(db="topology.db")
self.sw_name = sw_name self.sw_name = sw_name

View File

@ -26,12 +26,13 @@ control MyComputeChecksum(inout headers hdr, inout metadata meta) {
{ {
hdr.ipv6.src_addr, /* 128 */ hdr.ipv6.src_addr, /* 128 */
hdr.ipv6.dst_addr, /* 128 */ hdr.ipv6.dst_addr, /* 128 */
hdr.ipv6.payload_length, /* 16 -> should be 32 according to RFC2460 - also static number? */ hdr.ipv6.payload_length, /* 16 bit -> should be 32 according to RFC2460 - also static number? */
24w0, /* 24 0's */ 24w0, /* 24 0's */
PROTO_ICMP6 /* 8 */ PROTO_ICMP6 /* 8 */
}, },
hdr.icmp6.checksum, hdr.icmp6.checksum,
HashAlgorithm.csum16); HashAlgorithm.csum16
);
} }
} }

View File

@ -24,6 +24,9 @@ const bit<8> TCP_SEQ_LEN = 4;
const bit<8> ICMP6_ECHO_REQUEST = 128; const bit<8> ICMP6_ECHO_REQUEST = 128;
const bit<8> ICMP6_ECHO_REPLY = 129; const bit<8> ICMP6_ECHO_REPLY = 129;
const bit<8> ICMP6_NS = 135;
const bit<8> ICMP6_NA = 136;
header ethernet_t { header ethernet_t {

View File

@ -16,18 +16,81 @@ control MyIngress(inout headers hdr,
inout metadata meta, inout metadata meta,
inout standard_metadata_t standard_metadata) { inout standard_metadata_t standard_metadata) {
/* use for debugging and controlling flows */ /********************** ACTIONS ***********************************/
/* As the name says */
action drop() {
mark_to_drop();
}
/* As the name says */
action send_to_controller() { action send_to_controller() {
clone3(CloneType.I2E, 100, meta); clone3(CloneType.I2E, 100, meta);
} }
/********************** NDP support ***********************************/ /* Output PKG on correct ports (plural) */
/* map port to group */
action multicast_pkg(mcast_t mcast_grp) { action multicast_pkg(mcast_t mcast_grp) {
standard_metadata.mcast_grp = mcast_grp; standard_metadata.mcast_grp = mcast_grp;
} }
action icmp6_neighbor_solicitation(ipv6_addr_t addr) {
/* egress = ingress */
standard_metadata.egress_spec = standard_metadata.ingress_port;
hdr.ipv6.dst_addr = hdr.ipv6.src_addr;
hdr.ipv6.src_addr = addr;
hdr.icmp6.type = ICMP6_NA;
}
/********************** Reply to NDP for US ***********************************/
table ndp_answer {
key = {
hdr.ipv6.dst_addr: exact; /* our multicast embedded mac address */
hdr.icmp6.type: exact;
}
actions = {
send_to_controller;
reply_icmp6_neighbor_solicitation;
NoAction;
}
size = NDP_TABLE_SIZE;
default_action = NoAction;
}
/********************** debugging / general support ***********************************/
table port2mcast {
key = {
standard_metadata.ingress_port : exact;
}
actions = {
multicast_pkg;
send_to_controller;
NoAction;
}
size = NDP_TABLE_SIZE;
default_action = NoAction;
// default_action = send_to_controller;
}
/* Handle multicast registration of NDP */
table addr2mcast {
key = {
hdr.ipv6.dst_addr: exact;
}
actions = {
multicast_pkg;
send_to_controller;
NoAction;
}
size = NDP_TABLE_SIZE;
default_action = NoAction;
// default_action = send_to_controller;
}
/********************** NDP support ***********************************/
table ndp { table ndp {
key = { key = {
hdr.ipv6.dst_addr: lpm; hdr.ipv6.dst_addr: lpm;
@ -106,9 +169,13 @@ control MyIngress(inout headers hdr,
default_action = NoAction; default_action = NoAction;
} }
/********************** APPLYING TABLES ***********************************/
apply { apply {
if(hdr.ipv6.isValid()) { if(hdr.ipv6.isValid()) {
/* FIXME: structure / use .hit to do logic */
ndp_answer.apply();
ndp.apply(); /* flood or if it is us - answer */ ndp.apply(); /* flood or if it is us - answer */
v6_addresses.apply(); v6_addresses.apply();
v6_routing.apply(); v6_routing.apply();