Re: [Ryu-devel] IP packet handler
Brought to you by:
nz_gizmoguy
|
From: Gabriele G. <gab...@gm...> - 2013-10-16 08:26:33
|
I tested your code but, even if I generate a RA using scapy, ryu doesn't go
into the "if isinstance(data, icmpv6.nd_option_pi)"
It seems like there is no instance for the nd_option_pi subclass...while I
need to print the prefix value. Any hints?
Thanks again!
Scapy code:
a = IPv6()
a.dst = "ff02::1"
b = ICMPv6ND_RA()
c = ICMPv6NDOptSrcLLAddr()
c.lladdr = "00:00:00:00:00:01"
d = ICMPv6NDOptMTU()
e = ICMPv6NDOptPrefixInfo()
e.prefixlen = 64
e.prefix = "cc5f::"
send(a/b/c/d/e)
#1 Ryu code:
icidata = icmpv6.icmpv6.data
self.logger.info("[DATA] %s TYPE: %s", icidata,
type(icidata))
if isinstance(icidata, icmpv6.nd_option_pi):
self.logger.info("[ALERT] I'm IN!")
else:
self.logger.info("[ALERT] I'm OUT! :(")
#1 LOG:
[DATA]
nd_router_advert(ch_l=0,data=[nd_option_la(data=None,hw_src='00:00:00:00:00:01'),
'\x00\x00\x00\x00\x05\x00\x03\x04@\xc0\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x124\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'],length=[1,
1],rea_t=0,res=0,ret_t=0,rou_l=1800,type_=[1, 5]) TYPE: <class
'ryu.lib.packet.icmpv6.nd_router_advert'>
[ALERT] I'm OUT! :(
-------------------------------
2# Ryu code:
icidata = icmpv6.icmpv6.data
self.logger.info("[DATA] %s TYPE: %s", icidata,
type(icidata))
if isinstance(icidata, icmpv6.nd_router_advert):
self.logger.info("[ALERT] I'm IN!")
else:
self.logger.info("[ALERT] I'm OUT! :(")
#2 LOG:
[DATA]
nd_router_advert(ch_l=0,data=[nd_option_la(data=None,hw_src='00:00:00:00:00:01'),
'\x00\x00\x00\x00\x05\x00\x03\x04@\xc0\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x124\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'],length=[1,
1],rea_t=0,res=0,ret_t=0,rou_l=1800,type_=[1, 5]) TYPE: <class
'ryu.lib.packet.icmpv6.nd_router_advert'>
[ALERT] I'm IN!
2013/10/16 YAMAMOTO Takashi <yam...@va...>
> > Many thanks for your reply, now I've tried some tests and they work.
> > Unfortunately, I'm experiencing another issue: I want my switch to
> extract
> > IPv6 ND informations, but the console reply back to me with this error
> when
> > I execute the following code (the omitted portion of code is the same of
> > simple_switch.py example)
> >
> > [ERROR]
> > hub: uncaught exception: Traceback (most recent call last):
> > File "/home/user/ryu/ryu/lib/hub.py", line 48, in _launch
> > func(*args, **kwargs)
> > File "/home/user/ryu/ryu/base/app_manager.py", line 110, in _event_loop
> > handler(ev)
> > File "/home/user/ryu/ryu/app/simple_switch03BACKUP.py", line 68, in
> > _packet_in
> > icimpv6 = pkt.get_protocol(icmpv6.nd_neighbor)
> > File "/home/user/ryu/ryu/lib/packet/packet.py", line 104, in
> get_protocol
> > result = self.get_protocols(protocol)
> > File "/home/user/ryu/ryu/lib/packet/packet.py", line 97, in
> get_protocols
> > assert issubclass(protocol, packet_base.PacketBase)
> > AssertionError
> >
> >
> > [CODE]
> >
> >
> > @set_ev_cls(ofp_event.EventOFPPacketIn, MAIN_DISPATCHER)
> >
> > def _packet_in_handler(self, ev):
> >
> > msg = ev.msg
> >
> > datapath = msg.datapath
> >
> > ofproto = datapath.ofproto
> >
> >
> > pkt = packet.Packet(msg.data)
> >
> > eth = pkt.get_protocol(ethernet.ethernet)
> >
> >
> > dst = eth.dst
> >
> > src = eth.src
> >
> >
> > try:
> >
> > ippiv6 = pkt.get_protocol(ipv6.ipv6)
> >
> > ipv6s = ippiv6.src
> >
> > except:
> >
> > ipv6s = "not assigned yet"
> >
> >
> > icimpv6 = pkt.get_protocol(icmpv6.icmpv6)
> >
> > #icmpv6type = icimpv6.type_
> >
> >
> >
> > options = pkt.get_protocol(icmpv6.nd_option_pi)
>
> i think you need something like this.
>
> i = pkt.get_protocol(icmpv6.icmpv6)
> if i:
> data = i.data
> if isinstance(data, icmpv6.nd_option_pi):
> :
> :
>
> YAMAMOTO Takashi
>
> >
> > if (icmpv6type == 134):
> > prefixes = option.prefix
> >
> > self.logger.info("[ALERT] packet contains a Router
> Advertisement!")
> >
> > self.logger.info("Prefix announced: %s", prefixes)
> >
> >
> >
> > dpid = datapath.id
> >
> > self.mac_to_port.setdefault(dpid, {})
> >
> >
> > self.logger.info("packet in %s ipv6:%s %s %s %s", dpid, ipv6s, src,
> > dst, msg.in_port)
> >
> >
> > # learn a mac address to avoid FLOOD next time.
> >
> > self.mac_to_port[dpid][src] = msg.in_port
> >
> >
> > ...
> >
> > How can I fix this?
> >
> > Many thanks for your time
> > Gabriele
> >
> >
> > 2013/10/15 FUJITA Tomonori <fuj...@la...>
> >
> >> Hi,
> >>
> >> On Sun, 13 Oct 2013 15:58:14 +0200
> >> Gabriele Gerbino <gab...@gm...> wrote:
> >>
> >> > Hi there, I'm new to this ML and to OF in general. I was trying to
> gain
> >> > confidence with ryu but I found myself stucked so soon. I wanted to
> >> modify
> >> > the "simple_switch.py" example in order to make it able to learn IP
> >> > addresses too and handle packets based on them. In particular, my
> idea is
> >> > to use ryu to avoid some ipv6 security issues (rogue RA). Is there
> anyone
> >> > who can give me some instructions and/or examples of ip packet
> handlers?
> >>
> >> I updated simple_switch.py. Packet library enables you to access an IP
> >> header in a packet easily. Also check out:
> >>
> >> http://ryu.readthedocs.org/en/latest/library_packet_ref.html
> >>
> >>
>
|