Hi Iwase,
Thanks. This could be really helpful.
I will let you know if i have any further requirements(need help) while
implementing and using this.
Thanks
Hadem
On Mon, Jan 22, 2018 at 10:00 AM, Iwase Yusuke <iwase.yusu...@gmail.com>
wrote:
> Hi Hadem,
>
> In stead of monitoring the UPDATE message arrivals, how about monitoring
> adj-RIB-in like the attached patch?
>
> With this patch, I could get new (or deleted) paths as "event" like the
> following.
>
> ====
> # my_bgp_app.py
>
> from ryu.base import app_manager
> from ryu.controller.handler import set_ev_cls
> from ryu.services.protocols.bgp import application as bgp_application
>
>
> class MyBGPApp(app_manager.RyuApp):
> _CONTEXTS = {
> 'ryubgpspeaker': bgp_application.RyuBGPSpeaker,
> }
>
> def __init__(self, *args, **kwargs):
> super(MyBGPApp, self).__init__(*args, **kwargs)
>
> # Stores "ryu.services.protocols.bgp.application.RyuBGPSpeaker"
> # instance in order to call the APIs of
> # "ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker" via
> # "self.app.speaker".
> # Please note at this time, "BGPSpeaker" is NOT instantiated yet.
> self.app = kwargs['ryubgpspeaker']
>
> @set_ev_cls(bgp_application.EventAdjRibInChanged)
> def _best_patch_changed_handler(self, ev):
> self.logger.info(
> 'adj-RIB-in path changed: is_withdraw=%s, path=%s, '
> 'peer_ip=%s, peer_as=%d',
> ev.is_withdraw, ev.path, ev.peer_ip, ev.peer_as)
> ====
>
> e.g.)
> $ ryu-manager my_bgp_app.py \
> --bgp-app-config-file ryu/services/protocols/bgp/bgp_sample_conf.py
> ...(snip)...
> adj-RIB-in path changed: is_withdraw=False, path=Path(source: Peer(ip:
> 10.0.0.2, asn: 65002), nlri: BGPNLRI(addr='10.2.1.0',length=24), source
> ver#: 1, path attrs.: {1:
> BGPPathAttributeOrigin(flags=64,length=1,type=1,value=2),
> 2: BGPPathAttributeAsPath(flags=64,length=6,type=2,value=[[65002]]), 3:
> BGPPathAttributeNextHop(flags=64,length=4,type=3,value='10.0.0.2')},
> nexthop: 10.0.0.2, is_withdraw: False), peer_ip=10.0.0.2, peer_as=65002
> ...(snip)...
>
>
> Thanks,
> Iwase
>
>
> On 2018年01月19日 17:56, Pynbiang Hadem wrote:
>
>> Hi Iwase,
>>
>> Calling "neighbor_get()" function periodically may not suffice some of
>> our requirements.
>> The first method of "Calling it every time the update message arrives" is
>> more realistic.
>> SDN being program driven, I think we need something like
>> "packet_in_handler" for arrival of BGP Update packets so that applications
>> can handle the same.
>>
>> Is the Ryu community working to enable/implement such a capability in the
>> near future?.
>>
>> Thanks
>> Hadem
>>
>>
>>
>> On Fri, Jan 19, 2018 at 6:18 AM, Iwase Yusuke <iwase.yusu...@gmail.com
>> <mailto:iwase.yusu...@gmail.com>> wrote:
>>
>> Hi Hadem,
>>
>>
>> *How can i call my "neighbor_get()"function after the update
>> messages are
>> received from the neighbor?. can we use any event to achieve this
>> or any
>> other
>> ways?.*
>>
>>
>> Originally, when do you need to call "neighbor_get()" function?
>> Every after the update message received? Periodically per N seconds?
>>
>> To achieve the former one, unfortunately, now Ryu has no event for
>> such, only
>> for notifying;
>> - best patch changed due to new UPDATE received
>> - peer up or down
>> https://github.com/osrg/ryu/blob/8287e3513a780c2dbfe3003f6b6
>> 32d819a0e792c/ryu/services/protocols/bgp/application.py#L145-L147
>> <https://github.com/osrg/ryu/blob/8287e3513a780c2dbfe3003f6b
>> 632d819a0e792c/ryu/services/protocols/bgp/application.py#L145-L147>
>>
>> For the latter one, how about spawn a new thread which calls
>> "neighbor_get()"
>> periodically?
>>
>>
>> FYI, "application.py" can be integrated with your own application
>> without
>> directly modifying "application.py".
>> http://ryu-iwase.readthedocs.io/en/doc-services_protocols_bg
>> p_application/app/bgp_application.html#integration-with-
>> other-applications
>> <http://ryu-iwase.readthedocs.io/en/doc-services_protocols_b
>> gp_application/app/bgp_application.html#integration-with-
>> other-applications>
>>
>> Please note the above link is temporary, because this document is
>> under
>> reviewing on Ryu-devel and not yet merged to upstream. When merged,
>> you can read
>> this document from the "official" Ryu Documentation page.
>>
>>
>> Thanks,
>> Iwase
>>
>>
>> On 2018年01月19日 01:55, Pynbiang Hadem wrote:
>>
>> *Hi Iwase,*
>> *
>> *
>> *Yes you are right. The update messages from neighbor (10.0.0.2)
>> was
>> received much later as can be seen in the output log
>> file(BGPTest-h1.py)
>> attached herewith.*
>> *The update message received is as below:*
>> /Received msg from ('10.0.0.2', '55930') <<
>> BGPUpdate(len=106,nlri=[],path_attributes=[BGPPathAttributeM
>> pReachNLRI(afi=2,flags=128,length=49,next_hop='::ffff:10.
>> 0.0.2',nlri=[LabelledVPNIP6AddrPrefix(addr=([101],
>> BGPTwoOctetAsRD(admin=65002,assigned=150,type=0),
>> '2001:db8:2::'),length=152)],safi=128,type=14),
>> BGPPathAttributeOrigin(flags=64,length=1,type=1,value=2),
>> BGPPathAttributeAsPath(flags=64,length=6,type=2,value=[[65002]]),
>> BGPPathAttributeMultiExitDisc(flags=128,length=4,type=4,valu
>> e=100),
>> BGPPathAttributeExtendedCommunities(communities=[BGPTwoOctet
>> AsSpecificExtendedCommunity(as_number=65002,local_
>> administrator=150,subtype=2,type=0)],flags=192,length=8,
>> type=16)],total_path_attribute_len=83,type=2,withdrawn_
>> routes=[],withdrawn_routes_len=0)/
>> /Received route with RT ['65002:150'] that is of no interest to
>> any VRFs
>> or Peers set(['65001:200', '65001:350', '65001:150', '65001:300',
>> '65001:100', '65001:250']). Ignoring paths from this UPDATE:
>> BGPUpdate(len=106,nlri=[],path_attributes=[BGPPathAttributeM
>> pReachNLRI(afi=2,flags=128,length=49,next_hop='::ffff:10.
>> 0.0.2',nlri=[LabelledVPNIP6AddrPrefix(addr=([101],
>> BGPTwoOctetAsRD(admin=65002,assigned=150,type=0),
>> '2001:db8:2::'),length=152)],safi=128,type=14),
>> BGPPathAttributeOrigin(flags=64,length=1,type=1,value=2),
>> BGPPathAttributeAsPath(flags=64,length=6,type=2,value=[[65002]]),
>> BGPPathAttributeMultiExitDisc(flags=128,length=4,type=4,valu
>> e=100),
>> BGPPathAttributeExtendedCommunities(communities=[BGPTwoOctet
>> AsSpecificExtendedCommunity(as_number=65002,local_
>> administrator=150,subtype=2,type=0)],flags=192,length=8,
>> type=16)],total_path_attribute_len=83,type=2,withdrawn_
>> routes=[],withdrawn_routes_len=0)/
>> /Received msg from ('10.0.0.2', '55930') <<
>> BGPUpdate(len=76,nlri=[],path_attributes=[BGPPathAttributeMp
>> ReachNLRI(afi=2,flags=128,length=30,next_hop='::ffff:10.
>> 0.0.2',nlri=[IP6AddrPrefix(addr='2001:db8:1::',length=64)
>> ],safi=1,type=14),
>> BGPPathAttributeOrigin(flags=64,length=1,type=1,value=0),
>> BGPPathAttributeAsPath(flags=64,length=6,type=2,value=[[65002]]),
>> BGPPathAttributeMultiExitDisc(flags=128,length=4,type=4,valu
>> e=100)],total_path_attribute_len=53,type=2,withdrawn_
>> routes=[],withdrawn_routes_len=0)
>> /
>>
>> *How can i call my "neighbor_get()"function after the update
>> messages
>> are received from the neighbor?. can we use any event to achieve
>> this or
>> any other ways?.*
>>
>> Thanks
>> Hadem
>>
>> On Wed, Jan 17, 2018 at 4:57 AM, Iwase Yusuke <
>> iwase.yusu...@gmail.com
>> <mailto:iwase.yusu...@gmail.com> <mailto:iwase.yusu...@gmail.com
>> <mailto:iwase.yusu...@gmail.com>>> wrote:
>>
>> Hi Hadem,
>>
>> In that case, you need to call "neighbor_get()" after
>> connections
>> to neighbor(s)
>> established and received some routes.
>> It seems that Ryu just returns a empty list because Ryu does
>> not
>> yet received
>> any routes from neighbors.
>>
>> Thanks,
>> Iwase
>>
>>
>> On 2018年01月15日 17:48, Pynbiang Hadem wrote:
>>
>> Hi Iwase,
>>
>> Precisely, i actually wanted to get *adj-RIB-in*
>> information.
>>
>> Is there any problem with my code while trying to
>> achieve this?.
>>
>> Thanks
>> Hadem
>>
>>
>> On Mon, Jan 15, 2018 at 5:38 AM, Iwase Yusuke
>> <iwase.yusu...@gmail.com <mailto:iwase.yusu...@gmail.com>
>> <mailto:iwase.yusu...@gmail.com
>> <mailto:iwase.yusu...@gmail.com>> <mailto:iwase.yusu...@gmail.com
>> <mailto:iwase.yusu...@gmail.com>
>> <mailto:iwase.yusu...@gmail.com
>> <mailto:iwase.yusu...@gmail.com>>>> wrote:
>>
>> Hi Hadem,
>>
>> It is depending on what you want to get though, you
>> attempt to get
>> neighbors
>> information, right?
>> In that case, you should use "neighbors_get()"
>> (plural
>> form) instead of
>> "neighbor_get()".
>> http://ryu.readthedocs.io/en/latest/library_bgp_speaker_ref.
>> html#ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.neighbors_get
>> <http://ryu.readthedocs.io/en/latest/library_bgp_speaker_ref
>> .html#ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.neighbors_get>
>> <http://ryu.readthedocs.io/en/
>> latest/library_bgp_speaker_ref.html#ryu.services.protocols.
>> bgp.bgpspeaker.BGPSpeaker.neighbors_get
>> <http://ryu.readthedocs.io/en/latest/library_bgp_speaker_ref
>> .html#ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.neighbors_get>>
>> <http://ryu.readthedocs.io/en/
>> latest/library_bgp_speaker_ref.html#ryu.services.protocols.
>> bgp.bgpspeaker.BGPSpeaker.neighbors_get
>> <http://ryu.readthedocs.io/en/latest/library_bgp_speaker_ref
>> .html#ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.neighbors_get>
>> <http://ryu.readthedocs.io/en/
>> latest/library_bgp_speaker_ref.html#ryu.services.protocols.
>> bgp.bgpspeaker.BGPSpeaker.neighbors_get
>> <http://ryu.readthedocs.io/en/latest/library_bgp_speaker_ref
>> .html#ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.neighbors_get>>>
>>
>> With "neighbor_get()" with
>> "route_type='received-routes'", Ryu
>> should return the
>> adj-RIB-in information and I guess it is always an
>> empty
>> list when
>> starting up
>> (connections are not established with neighbors).
>>
>>
>> Thanks,
>> Iwase
>>
>>
>> On 2018年01月13日 00:59, Pynbiang Hadem wrote:
>>
>> Hi Iwase,
>>
>> I've made the modifications accordingly. *Now i
>> am
>> able to see the
>> output for vrfs_get() and rib_get()*. *However
>> there
>> is still
>> no output
>> for neighbor_get() . ---output is in
>> **BGPTest-output.py*
>> *Pls advice how to get the output for
>> neighbor_get().*
>> *Enclosed herewith: (1) modified
>> bgpapplication1.py & (2)
>> BGPTest-output.py*
>>
>> Thanks
>> Hadem
>>
>>
>>
>>
>>
>> On Fri, Jan 12, 2018 at 7:36 AM, Iwase Yusuke
>> <iwase.yusu...@gmail.com <mailto:iwase.yusu...@gmail.com
>> >
>> <mailto:iwase.yusu...@gmail.com <mailto:iwase.yusu...@gmail.com>>
>> <mailto:iwase.yusu...@gmail.com
>> <mailto:iwase.yusu...@gmail.com>
>> <mailto:iwase.yusu...@gmail.com
>> <mailto:iwase.yusu...@gmail.com>>> <mailto:iwase.yusu...@gmail.co
>> m
>>
>> <mailto:iwase.yusu...@gmail.com>
>>
>> <mailto:iwase.yusu...@gmail.com <mailto:
>> iwase.yusu...@gmail.com>>
>>
>> <mailto:iwase.yusu...@gmail.com
>> <mailto:iwase.yusu...@gmail.com>
>> <mailto:iwase.yusu...@gmail.com
>> <mailto:iwase.yusu...@gmail.com>>>>> wrote:
>>
>> Hi Hadem,
>>
>> First, the return value for each
>> BGPSpeaker's API
>> (with
>> format="json") is str
>> type value.
>> Why you need to split them like;
>> vrf_result =
>> self.speaker.vrfs_get('routes',
>> None,
>> 'all', 'json')
>> nowtime = vrf_result[0] # <--- ?
>> result = vrf_result[1] # <--- ?
>>
>> And, please confirm the meaning of each
>> argument when
>> calling BGPSpeaker's
>> APIs.
>> For example, to getting all VRF
>> configurations,
>> you need
>> to specify
>> "summary"
>> instead of "routes".
>> http://ryu.readthedocs.io/en/latest/library_bgp_speaker_ref.
>> html#ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.vrfs_get
>> <http://ryu.readthedocs.io/en/latest/library_bgp_speaker_ref
>> .html#ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.vrfs_get>
>> <http://ryu.readthedocs.io/en/
>> latest/library_bgp_speaker_ref.html#ryu.services.protocols.
>> bgp.bgpspeaker.BGPSpeaker.vrfs_get
>> <http://ryu.readthedocs.io/en/latest/library_bgp_speaker_ref
>> .html#ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.vrfs_get>>
>> <http://ryu.readthedocs.io/en/
>> latest/library_bgp_speaker_ref.html#ryu.services.protocols.
>> bgp.bgpspeaker.BGPSpeaker.vrfs_get
>> <http://ryu.readthedocs.io/en/latest/library_bgp_speaker_ref
>> .html#ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.vrfs_get>
>> <http://ryu.readthedocs.io/en/
>> latest/library_bgp_speaker_ref.html#ryu.services.protocols.
>> bgp.bgpspeaker.BGPSpeaker.vrfs_get
>> <http://ryu.readthedocs.io/en/latest/library_bgp_speaker_ref
>> .html#ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.vrfs_get>>>
>> <
>> http://ryu.readthedocs.io/en/latest/library_bgp_speaker_ref
>> .html#ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.vrfs_get
>> <http://ryu.readthedocs.io/en/latest/library_bgp_speaker_ref
>> .html#ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.vrfs_get>
>> <http://ryu.readthedocs.io/en/
>> latest/library_bgp_speaker_ref.html#ryu.services.protocols.
>> bgp.bgpspeaker.BGPSpeaker.vrfs_get
>> <http://ryu.readthedocs.io/en/latest/library_bgp_speaker_ref
>> .html#ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.vrfs_get>>
>> <http://ryu.readthedocs.io/en/
>> latest/library_bgp_speaker_ref.html#ryu.services.protocols.
>> bgp.bgpspeaker.BGPSpeaker.vrfs_get
>> <http://ryu.readthedocs.io/en/latest/library_bgp_speaker_ref
>> .html#ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.vrfs_get>
>> <http://ryu.readthedocs.io/en/
>> latest/library_bgp_speaker_ref.html#ryu.services.protocols.
>> bgp.bgpspeaker.BGPSpeaker.vrfs_get
>> <http://ryu.readthedocs.io/en/latest/library_bgp_speaker_ref
>> .html#ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.vrfs_get>>>>
>>
>> Thanks,
>> Iwase
>>
>>
>> On 2018年01月11日 21:55, Pynbiang Hadem wrote:
>>
>> *Hi,*
>> *
>> *
>> *I am getting blank output
>> for BGPSpeaker
>> show_vrf,
>> show_rib,
>> show_neighbor. The partial output is
>> as below:*
>>
>> ----------------------------------
>> /Sending MED Update Message.../
>> /Send BGP UPDATE Message for changing
>> MED[100]/
>> /API method neighbor.update called
>> with args:
>> {'ip_address':
>> '10.0.0.2',
>> 'changes': {'multi_exit_disc': 100}}/
>> /on_update_med fired/
>> /MED value for neigh: Neighbor:
>> 10.0.0.2
>> updated to 100/
>> /Calling get VRFs Information .../
>> /Shows BGP VRF information in a json
>> format/
>> /API method operator.show called with
>> args:
>> {'params':
>> ['vrf',
>> 'routes',
>> 'all'], 'format': 'json'}/
>> /+++++++++++++++++++++++++++++++/
>> /{ : Show VRFs /
>> /+++++++++++++++++++++++++++++++/
>> /"/
>> /
>> /
>> /Calling SHOW RIB .../
>> /Shows BGP routing information in a
>> json format/
>> /API method operator.show called with
>> args:
>> {'params':
>> ['rib',
>> 'all'],
>> 'format': 'json'}/
>> /+++++++++++++++++++++++++++++++/
>> /{ : Show rib /
>> /+++++++++++++++++++++++++++++++/
>> /"/
>> /
>> /
>> /Calling SHOW Neighbor.../
>> /Inside Show Neighbor BGP UPDATE
>> Message/
>> /API method operator.show called with
>> args:
>> {'params':
>> ['neighbor',
>> 'received-routes', '10.0.0.2', 'all'],
>> 'format': 'json'}/
>> /[]/
>> /+++++++++++++++++++++++++++++++/
>> /[ : Show neighbor /
>> /+++++++++++++++++++++++++++++++/
>> /]/
>>
>> ------------------------------------------
>>
>> *I am attaching herewith my BGP
>> application
>> file(bgpapplication1.py). *
>> *Pls let me know what mistake i have
>> done and
>> how to
>> display
>> the above
>> details.*
>> *
>> *
>> *Thanks*
>> *Hadem*
>>
>>
>>
>>
>>
>> ------------------------------------------------------------
>> ------------------
>> Check out the vibrant tech community
>> on one
>> of the
>> world's most
>> engaging tech sites, Slashdot.org!
>> http://sdm.link/slashdot
>>
>>
>>
>> ______________________________
>> _________________
>> Ryu-devel mailing list
>> Ryu-devel@lists.sourceforge.net <mailto:Ryu-devel@lists.source
>> forge.net>
>> <mailto:Ryu-devel@lists.sourceforge.net
>> <mailto:Ryu-devel@lists.sourceforge.net>>
>> <mailto:Ryu-devel@lists.sourceforge.net
>> <mailto:Ryu-devel@lists.sourceforge.net>
>> <mailto:Ryu-devel@lists.sourceforge.net
>> <mailto:Ryu-devel@lists.sourceforge.net>>>
>> <mailto:Ryu-devel@lists.sourceforge.net
>> <mailto:Ryu-devel@lists.sourceforge.net>
>> <mailto:Ryu-devel@lists.sourceforge.net
>> <mailto:Ryu-devel@lists.sourceforge.net>>
>> <mailto:Ryu-devel@lists.sourceforge.net
>> <mailto:Ryu-devel@lists.sourceforge.net>
>> <mailto:Ryu-devel@lists.sourceforge.net
>> <mailto:Ryu-devel@lists.sourceforge.net>>>>
>> https://lists.sourceforge.net/lists/listinfo/ryu-devel
>> <https://lists.sourceforge.net/lists/listinfo/ryu-devel>
>> <https://lists.sourceforge.net/lists/listinfo/ryu-devel
>> <https://lists.sourceforge.net/lists/listinfo/ryu-devel>>
>> <https://lists.sourceforge.ne
>> t/lists/listinfo/ryu-devel
>> <https://lists.sourceforge.net/lists/listinfo/ryu-devel>
>> <https://lists.sourceforge.net/lists/listinfo/ryu-devel
>> <https://lists.sourceforge.net/lists/listinfo/ryu-devel>>>
>> <
>> https://lists.sourceforge.net/lists/listinfo/ryu-devel
>> <https://lists.sourceforge.net/lists/listinfo/ryu-devel>
>> <https://lists.sourceforge.net/lists/listinfo/ryu-devel
>> <https://lists.sourceforge.net/lists/listinfo/ryu-devel>>
>> <https://lists.sourceforge.ne
>> t/lists/listinfo/ryu-devel
>> <https://lists.sourceforge.net/lists/listinfo/ryu-devel>
>> <https://lists.sourceforge.net/lists/listinfo/ryu-devel
>> <https://lists.sourceforge.net/lists/listinfo/ryu-devel>>>>
>>
>>
>>
>>
>> ------------------------------
>> ------------------------------------------------
>> Check out the vibrant tech community on one of
>> the
>> world's most
>> engaging tech sites, Slashdot.org!
>> http://sdm.link/slashdot
>>
>>
>>
>> _______________________________________________
>> Ryu-devel mailing list
>> Ryu-devel@lists.sourceforge.net <mailto:Ryu-devel@lists.source
>> forge.net>
>> <mailto:Ryu-devel@lists.sourceforge.net
>> <mailto:Ryu-devel@lists.sourceforge.net>>
>> <mailto:Ryu-devel@lists.sourceforge.net
>> <mailto:Ryu-devel@lists.sourceforge.net>
>> <mailto:Ryu-devel@lists.sourceforge.net
>> <mailto:Ryu-devel@lists.sourceforge.net>>>
>> https://lists.sourceforge.net/lists/listinfo/ryu-devel
>> <https://lists.sourceforge.net/lists/listinfo/ryu-devel>
>> <https://lists.sourceforge.net/lists/listinfo/ryu-devel
>> <https://lists.sourceforge.net/lists/listinfo/ryu-devel>>
>> <https://lists.sourceforge.ne
>> t/lists/listinfo/ryu-devel
>> <https://lists.sourceforge.net/lists/listinfo/ryu-devel>
>> <https://lists.sourceforge.net/lists/listinfo/ryu-devel
>> <https://lists.sourceforge.net/lists/listinfo/ryu-devel>>>
>>
>>
>>
>>
>> ------------------------------
>> ------------------------------------------------
>> Check out the vibrant tech community on one of the
>> world's most
>> engaging tech sites, Slashdot.org!
>> http://sdm.link/slashdot
>>
>>
>>
>> _______________________________________________
>> Ryu-devel mailing list
>> Ryu-devel@lists.sourceforge.net <mailto:Ryu-devel@lists.source
>> forge.net>
>> <mailto:Ryu-devel@lists.sourceforge.net
>> <mailto:Ryu-devel@lists.sourceforge.net>>
>> https://lists.sourceforge.net/lists/listinfo/ryu-devel
>> <https://lists.sourceforge.net/lists/listinfo/ryu-devel>
>> <https://lists.sourceforge.net/lists/listinfo/ryu-devel
>> <https://lists.sourceforge.net/lists/listinfo/ryu-devel>>
>>
>>
>>
>>
>> ------------------------------------------------------------
>> ------------------
>> Check out the vibrant tech community on one of the world's most
>> engaging tech sites, Slashdot.org! http://sdm.link/slashdot
>>
>>
>>
>> _______________________________________________
>> Ryu-devel mailing list
>> Ryu-devel@lists.sourceforge.net <mailto:Ryu-devel@lists.source
>> forge.net>
>> https://lists.sourceforge.net/lists/listinfo/ryu-devel
>> <https://lists.sourceforge.net/lists/listinfo/ryu-devel>
>>
>>
>>
>>
>> ------------------------------------------------------------
>> ------------------
>> Check out the vibrant tech community on one of the world's most
>> engaging tech sites, Slashdot.org! http://sdm.link/slashdot
>>
>>
>>
>> _______________________________________________
>> Ryu-devel mailing list
>> Ryu-devel@lists.sourceforge.net
>> https://lists.sourceforge.net/lists/listinfo/ryu-devel
>>
>>
------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Ryu-devel mailing list
Ryu-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ryu-devel