On Thu, 31 Jan 2013 10:35:28 +0900 OHMURA Kei <ohmura....@lab.ntt.co.jp> wrote:
> This app shows how to handle netflow packets. Can you convert this to something useful? I think that like our OpenFlow code, other applications can subscribe this netflow component to get netflow messages as an event. > Signed-off-by: OHMURA Kei <ohmura....@lab.ntt.co.jp> > --- > ryu/app/netflow_dumper.py | 72 > +++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 72 insertions(+) > create mode 100644 ryu/app/netflow_dumper.py > > diff --git a/ryu/app/netflow_dumper.py b/ryu/app/netflow_dumper.py > new file mode 100644 > index 0000000..af91b2d > --- /dev/null > +++ b/ryu/app/netflow_dumper.py > @@ -0,0 +1,72 @@ > +# Copyright (C) 2013 Nippon Telegraph and Telephone Corporation. > +# > +# Licensed under the Apache License, Version 2.0 (the "License"); > +# you may not use this file except in compliance with the License. > +# You may obtain a copy of the License at > +# > +# http://www.apache.org/licenses/LICENSE-2.0 > +# > +# Unless required by applicable law or agreed to in writing, software > +# distributed under the License is distributed on an "AS IS" BASIS, > +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or > +# implied. > +# See the License for the specific language governing permissions and > +# limitations under the License. > + > + > +import gevent > +import logging > +import struct > + > +from gevent import socket > +from ryu.base import app_manager > +from ryu.lib.xflow import netflow > + > +LOG = logging.getLogger('ryu.app.netflow_dumper') > + > +DEFAULT_HOST = '127.0.0.1' # TODO: XXX > +DEFAULT_PORT = 9996 # TODO: XXX > + > +NETFLOW_V5 = 0x05 > + > + > +class NetFlowDumper(app_manager.RyuApp): > + def __init__(self, *args, **kwargs): > + super(NetFlowDumper, self).__init__(*args, **kwargs) > + self.sock = None > + self.thread = None > + self._start_recv() > + > + def close(self): > + # TODO: closing.. > + pass > + > + def ipaddr_to_str(self, ip): > + return socket.inet_ntoa(struct.pack('!I', ip)) > + > + def ipaddr_to_int(self, s): > + return struct.unpack('!I', socket.inet_aton(s))[0] > + > + def _recv_loop(self): > + while True: > + (data, addrport) = self.sock.recvfrom(8192) > + > + nf = netflow.NetFlow.parser(data) > + if nf: > + flows = nf.flows > + LOG.info('NetFlow V%d containing %d flows', > + nf.version, nf.count) > + > + for i in range(nf.count): > + LOG.info('Flow%d: %s -> %s ', i, > + self.ipaddr_to_str(flows[i].srcaddr), > + self.ipaddr_to_str(flows[i].dstaddr)) > + LOG.info('%d packets and %d bytes in the flow', > + flows[i].dpkts, flows[i].doctets) > + else: > + LOG.info('NetFlow V%d is not suppported yet', v) > + > + def _start_recv(self): > + self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) > + self.sock.bind((DEFAULT_HOST, DEFAULT_PORT)) > + self.thread = gevent.spawn_later(0, self._recv_loop) > -- > 1.7.9.5 > > > ------------------------------------------------------------------------------ > Everyone hates slow websites. So do we. > Make your web apps faster with AppDynamics > Download AppDynamics Lite for free today: > http://p.sf.net/sfu/appdyn_d2d_jan > _______________________________________________ > Ryu-devel mailing list > Ryu-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/ryu-devel ------------------------------------------------------------------------------ Everyone hates slow websites. So do we. Make your web apps faster with AppDynamics Download AppDynamics Lite for free today: http://p.sf.net/sfu/appdyn_d2d_jan _______________________________________________ Ryu-devel mailing list Ryu-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/ryu-devel