2
0
mirror of https://github.com/openvswitch/ovs synced 2025-10-25 15:07:05 +00:00

ovs-l3ping: A new test utility that allows to detect L3 tunneling issues

ovs-l3ping is similar to ovs-test, but the main difference
is that it does not require administrator to open firewall
holes for the XML/RPC control connection. This is achieved
by encapsulating the Control Connection over the L3 tunnel
itself.

This tool is not intended as a replacement for ovs-test,
because ovs-test covers much broader set of test cases.

Sample usage:
Node1: ovs-l3ping -s 192.168.122.236,10.1.1.1 -t gre
Node2: ovs-l3ping -c 192.168.122.220,10.1.1.2,10.1.1.1 -t gre

Issue#11791
Signed-off-by: Ansis Atteka <aatteka@nicira.com>
This commit is contained in:
Ansis Atteka
2012-06-28 15:52:40 -07:00
parent 969e46a224
commit 2d8bdd8f22
16 changed files with 635 additions and 277 deletions

View File

@@ -19,10 +19,13 @@ import array
import exceptions
import fcntl
import os
import select
import socket
import struct
import signal
import subprocess
import re
import xmlrpclib
def str_ip(ip_address):
@@ -147,3 +150,81 @@ def move_routes(iface1, iface2):
for route in out.splitlines():
args = ["ip", "route", "replace", "dev", iface2] + route.split()
start_process(args)
def get_interface_from_routing_decision(ip):
"""
This function returns the interface through which the given ip address
is reachable.
"""
args = ["ip", "route", "get", ip]
ret, out, _err = start_process(args)
if ret == 0:
iface = re.search(r'dev (\S+)', out)
if iface:
return iface.group(1)
return None
def rpc_client(ip, port):
return xmlrpclib.Server("http://%s:%u/" % (ip, port), allow_none=True)
def sigint_intercept():
"""
Intercept SIGINT from child (the local ovs-test server process).
"""
signal.signal(signal.SIGINT, signal.SIG_IGN)
def start_local_server(port):
"""
This function spawns an ovs-test server that listens on specified port
and blocks till the spawned ovs-test server is ready to accept XML RPC
connections.
"""
p = subprocess.Popen(["ovs-test", "-s", str(port)],
stdout=subprocess.PIPE, stderr=subprocess.PIPE,
preexec_fn=sigint_intercept)
fcntl.fcntl( p.stdout.fileno(),fcntl.F_SETFL,
fcntl.fcntl(p.stdout.fileno(), fcntl.F_GETFL) | os.O_NONBLOCK)
while p.poll() is None:
fd = select.select([p.stdout.fileno()], [], [])[0]
if fd:
out = p.stdout.readline()
if out.startswith("Starting RPC server"):
break
if p.poll() is not None:
raise RuntimeError("Couldn't start local instance of ovs-test server")
return p
def get_datagram_sizes(mtu1, mtu2):
"""
This function calculates all the "interesting" datagram sizes so that
we test both - receive and send side with different packets sizes.
"""
s1 = set([8, mtu1 - 100, mtu1 - 28, mtu1])
s2 = set([8, mtu2 - 100, mtu2 - 28, mtu2])
return sorted(s1.union(s2))
def ip_from_cidr(string):
"""
This function removes the netmask (if present) from the given string and
returns the IP address.
"""
token = string.split("/")
return token[0]
def bandwidth_to_string(bwidth):
"""Convert bandwidth from long to string and add units."""
bwidth = bwidth * 8 # Convert back to bits/second
if bwidth >= 10000000:
return str(int(bwidth / 1000000)) + "Mbps"
elif bwidth > 10000:
return str(int(bwidth / 1000)) + "Kbps"
else:
return str(int(bwidth)) + "bps"