At Thu, 11 Jun 2015 13:13:49 +0800,
Yi Tseng wrote:
> 
> [1  <multipart/alternative (7bit)>]
> [1.1  <text/plain; UTF-8 (7bit)>]
> Hi
> 
> I think the mac address are unique in computer networks.
> 
> So I only compare mac address between hosts.

Sorry for late reply.
Computers can move over ports, or can use some form of link
aggregation.  These can give two Host objects which differ only in
self.port.

Also, are you planning to use the _eq_ operator or the hash operator?
If not, you don't need to implement them.

> 2015-06-11 12:33 GMT+08:00 IWAMOTO Toshihiro <[email protected]>:
> 
> > At Thu, 11 Jun 2015 02:30:40 +0800,
> > Yi Tseng wrote:
> > >
> > > Signed-off-by: Takeshi <[email protected]>
> > > ---
> > >  ryu/topology/api.py      |  7 +++++
> > >  ryu/topology/event.py    | 23 +++++++++++++++++
> > >  ryu/topology/switches.py | 66
> > > +++++++++++++++++++++++++++++++++++++++++++++++-
> > >  3 files changed, 95 insertions(+), 1 deletion(-)
> >
> > > diff --git a/ryu/topology/switches.py b/ryu/topology/switches.py
> > > index 63335f2..ab7f9f6 100644
> > > --- a/ryu/topology/switches.py
> > > +++ b/ryu/topology/switches.py
> > > @@ -157,6 +157,35 @@ class Link(object):
> > >      def __str__(self):
> > >          return 'Link: %s to %s' % (self.src, self.dst)
> > >
> > > +class Host(object):
> > > +    # This is data class passed by EventHostXXXX
> > > +    def __init__(self, dpid, port, mac):
> > > +        super(Host, self).__init__()
> > > +        self.dpid = dpid
> > > +        self.port = port
> > > +        self.mac = mac
> > > +
> > > +    def to_dict(self):
> > > +        d = {
> > > +            'dpid': self.dpid,
> > > +            'port': self.port,
> > > +            'mac': self.mac
> > > +            }
> > > +        return d
> > > +
> > > +    # this type is used for key value of LinkState
> >
> > Really? And why are you ignoring dpid and port in comparison
> > operators?
> >
> > > +    def __eq__(self, other):
> > > +        return self.mac == other.mac
> > > +
> > > +    def __ne__(self, other):
> > > +        return not self.__eq__(other)
> > > +
> > > +    def __hash__(self):
> > > +        return hash(self.mac)
> > > +
> > > +    def __str__(self):
> > > +        return 'Host<Mac address=%s>' % (self.mac, )
> > > +
> > >
> > >  class PortState(dict):
> > >      # dict: int port_no -> OFPPort port
> > > @@ -451,6 +480,7 @@ class Switches(app_manager.RyuApp):
> > >          self.port_state = {}          # datapath_id => ports
> > >          self.ports = PortDataState()  # Port class -> PortData class
> > >          self.links = LinkState()      # Link class -> timestamp
> > > +        self.hosts = {}
> > >          self.is_active = True
> > >
> > >          self.link_discovery = self.CONF.observe_links
> > > @@ -689,7 +719,25 @@ class Switches(app_manager.RyuApp):
> > >              src_dpid, src_port_no = LLDPPacket.lldp_parse(msg.data)
> > >          except LLDPPacket.LLDPUnknownFormat as e:
> > >              # This handler can receive all the packtes which can be
> > > -            # not-LLDP packet. Ignore it silently
> > > +            # not-LLDP packet.
> > > +            # Check if it's new host
> > > +
> > > +            dpid = msg.datapath.id
> > > +            port = -1
> > > +
> > > +            if msg.datapath.ofproto.OFP_VERSION ==
> > > ofproto_v1_0.OFP_VERSION:
> > > +                port = msg.in_port
> > > +            elif msg.datapath.ofproto.OFP_VERSION >=
> > > ofproto_v1_2.OFP_VERSION:
> > > +                port = msg.match['in_port']
> > > +
> > > +            pkt = packet.Packet(msg.data)
> > > +            eth = pkt.get_protocols(ethernet.ethernet)[0]
> > > +            mac = eth.src
> > > +
> > > +            if mac not in self.hosts and port != -1:
> > > +                LOG.debug('Found host(mac=%s) from dpid=%d, port=%d',
> > mac,
> > > dpid, port)
> > > +                self.hosts[mac] = Host(dpid, port, mac)
> > > +
> > >              return
> > >
> > >          dst_dpid = msg.datapath.id

--
IWAMOTO Toshihiro

------------------------------------------------------------------------------
_______________________________________________
Ryu-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ryu-devel

Reply via email to