Aaron Conole <[email protected]> writes:

> Hi Bhanu,
>
> "Bodireddy, Bhanuprakash" <[email protected]> writes:
>
>> Hi,
>>
>>  
>>
>> ovs-tcpdump throws the below error when trying to capture packets on one of 
>> the
>> vhostuserports.
>>
>>  
>>
>> $ ovs-tcpdump -i dpdkvhostuser0
>>
>>    ERROR: Please create an interface called `midpdkvhostuser0`
>>
>>     See your OS guide for how to do this.
>>
>>     Ex: ip link add midpdkvhostuser0 type veth peer name midpdkvhostuser02
>>
>>  
>>
>> $ ip link add midpdkvhostuser0 type veth peer name midpdkvhostuser02
>>
>>      Error: argument "midpdkvhostuser0" is wrong: "name" too long
>>
>>  
>>
>> To get around this issue, I have to pass  ‘—mirror-to’ option as below.
>>
>>  
>>
>> $ ovs-tcpdump -i dpdkvhostuser0 -XX --mirror-to vh0
>>
>>  
>>
>> Is this due to the length of the port name?  Would be nice to fix this issue.
>
> Thanks for the detailed write up.
>
> It is related to the mirror port name length.  The mirror port is bound
> by IFNAMSIZ restriction, so it must be 15 characters + nul, and
> midpdkvhostuser0 would be 16 + nul.  This is a linux specific
> restriction, and it won't be changed because it is very much a well
> established UAPI (and changing it will have implications on code not
> able to deal with larger sized name buffers).
>
> I'm not sure how best to fix it.  My concession was the mirror-to
> option.  Perhaps there's a better way?

Hi Bhanu, I've been thinking about this a bit more.  How about something
like the following patch?

If you think it's acceptable, I'll submit it formally.

---

diff --git a/utilities/ovs-tcpdump.in b/utilities/ovs-tcpdump.in
index 6718c77..76e8a7b 100755
--- a/utilities/ovs-tcpdump.in
+++ b/utilities/ovs-tcpdump.in
@@ -18,6 +18,7 @@ import fcntl
 
 import os
 import pwd
+import random.randint
 import struct
 import subprocess
 import sys
@@ -39,6 +40,7 @@ except Exception:
 
 tapdev_fd = None
 _make_taps = {}
+_make_mirror_name = {}
 
 
 def _doexec(*args, **kwargs):
@@ -76,8 +78,16 @@ def _install_tap_linux(tap_name, mtu_value=None):
     pipe.wait()
 
 
+def _make_linux_mirror_name(interface_name):
+    if interface_name.length() > 13:
+        return "ovsmi%06d" % random.randint(1, 999999)
+    return "mi%s" % interface_name
+
+
 _make_taps['linux'] = _install_tap_linux
 _make_taps['linux2'] = _install_tap_linux
+_make_mirror_name['linux'] = _make_linux_mirror_name
+_make_mirror_name['linux2'] = _make_linux_mirror_name
 
 
 def username():
@@ -406,7 +416,7 @@ def main():
         print("TCPDUMP Args: %s" % ' '.join(tcpdargs))
 
     ovsdb = OVSDB(db_sock)
-    mirror_interface = mirror_interface or "mi%s" % interface
+    mirror_interface = mirror_interface or _make_mirror_name(interface)
 
     if sys.platform in _make_taps and \
        mirror_interface not in netifaces.interfaces():
---
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to