Re: [ovs-dev] [PATCH] ovs-tcpdump: Support vlan option.
Daniel Ding writes: > 2024年3月30日 上午2:43,Aaron Conole 写道: > > Daniel Ding writes: > > When I try filter geneve protocol with a vlan, the warning message > occurs that tell me the kernel cann't support this combination. > > ^ can't > > $ ovs-tcpdump -i eth2 -nne vlan 10 and geneve > Warning: Kernel filter failed: Invalid argument > > So I fix it by the following: > 1. the mirror-to interface was added with a vlan tag, which let > datapath to pop its tag. > 2. the traffic will be mirrored with mirror's select_vlan, and that > don't care about will not be received on the mirror-to interface. > > Maybe rephrase: > > "The fix is to make a convenience argument that sets the mirror port's > select_vlan column, and also marks the port as native tagged with VLAN." > > Thanks you, Aaron. > I have already updated this description in the following patch. > > Signed-off-by: Daniel Ding > --- Please post as a v2 patch in a separate thread. ___ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev
Re: [ovs-dev] [PATCH] ovs-tcpdump: Support vlan option.
> 2024年3月30日 上午2:43,Aaron Conole 写道: > > Daniel Ding mailto:danieldin...@gmail.com>> writes: > >> When I try filter geneve protocol with a vlan, the warning message >> occurs that tell me the kernel cann't support this combination. > ^ can't >> >> $ ovs-tcpdump -i eth2 -nne vlan 10 and geneve >> Warning: Kernel filter failed: Invalid argument >> >> So I fix it by the following: >> 1. the mirror-to interface was added with a vlan tag, which let >> datapath to pop its tag. >> 2. the traffic will be mirrored with mirror's select_vlan, and that >> don't care about will not be received on the mirror-to interface. > > Maybe rephrase: > > "The fix is to make a convenience argument that sets the mirror port's > select_vlan column, and also marks the port as native tagged with VLAN." Thanks you, Aaron. I have already updated this description in the following patch. > >> Signed-off-by: Daniel Ding >> --- >> utilities/ovs-tcpdump.in | 37 + >> 1 file changed, 33 insertions(+), 4 deletions(-) >> >> diff --git a/utilities/ovs-tcpdump.in b/utilities/ovs-tcpdump.in >> index eada803bb..b2b69d3c4 100755 >> --- a/utilities/ovs-tcpdump.in >> +++ b/utilities/ovs-tcpdump.in >> @@ -142,6 +142,8 @@ The following options are available: >>--mirror-toThe name for the mirror port to use (optional) >> Default 'miINTERFACE' >>--span If specified, mirror all ports (optional) >> + --vlan If specified, mirror a vlan traffic and pop > s/ a// > >> + its tag (optional) >> """ % {'prog': sys.argv[0]}) >> sys.exit(0) >> >> @@ -319,7 +321,7 @@ class OVSDB(object): >> (mirror_name, txn.get_error())) >> self._txn = None >> >> -def make_port(self, port_name, bridge_name): >> +def make_port(self, port_name, bridge_name, vlan=None): >> iface_row = self.make_interface(port_name, False) >> txn = self._txn >> >> @@ -330,6 +332,12 @@ class OVSDB(object): >> port = txn.insert(self.get_table('Port')) >> port.name = port_name >> >> +if vlan is not None: >> +port.verify('tag') >> +tag = getattr(port, 'tag', []) >> +tag.append(vlan) >> +port.tag = tag >> + > > Can a port have multiple tags set for vlan? I was under the impression > that only one native tag was allowed per-port, but maybe I'm wrong. > Agree and updated the patch to ensure one native tag. >> br.verify('ports') >> ports = getattr(br, 'ports', []) >> ports.append(port) >> @@ -354,7 +362,7 @@ class OVSDB(object): >> return result >> >> def bridge_mirror(self, intf_name, mirror_intf_name, br_name, >> - mirror_select_all=False): >> + mirror_select_all=False, mirrored_vlan=None): >> >> txn = self._start_txn() >> mirror = txn.insert(self.get_table('Mirror')) >> @@ -374,6 +382,12 @@ class OVSDB(object): >> src_port.append(mirrored_port) >> mirror.select_src_port = src_port >> >> +if mirrored_vlan: >> +mirror.verify('select_vlan') >> +select_vlan = getattr(mirror, 'select_vlan', []) >> +select_vlan.append(mirrored_vlan) >> +mirror.select_vlan = select_vlan >> + >> output_port = self._find_row_by_name('Port', mirror_intf_name) >> >> mirror.verify('output_port') >> @@ -440,6 +454,7 @@ def main(): >> db_sock = 'unix:%s' % os.path.join(rundir, "db.sock") >> interface = None >> tcpdargs = [] >> +vlan = None >> >> skip_next = False >> mirror_interface = None >> @@ -474,12 +489,25 @@ def main(): >> elif cur in ['--span']: >> mirror_select_all = True >> continue >> +elif cur in ['--vlan']: >> +vlan = nxt >> +skip_next = True >> +continue >> tcpdargs.append(cur) >> >> if interface is None: >> print("Error: must at least specify an interface with '-i' option") >> sys.exit(1) >> >> +if vlan: >> +try: >> +vlan = int(vlan) >> +if vlan < 0 or vlan > 4095: >> +raise ValueError("out of range") >> +except ValueError: >> +print("Error: vlan muse be within <0-4095>") > ^must > >> +sys.exit(1) >> + >> if not py_which(dump_cmd): >> print("Error: unable to execute '%s' (check PATH)" % dump_cmd) >> sys.exit(1) >> @@ -523,10 +551,11 @@ def main(): >> teardown(db_sock, interface, mirror_interface, tap_created) >> >> try: >> -ovsdb.make_port(mirror_interface, ovsdb.port_bridge(interface)) >> +ovsdb.make_port(mirror_interface, >> +
Re: [ovs-dev] [PATCH] ovs-tcpdump: Support vlan option.
Daniel Ding writes: > When I try filter geneve protocol with a vlan, the warning message > occurs that tell me the kernel cann't support this combination. ^ can't > > $ ovs-tcpdump -i eth2 -nne vlan 10 and geneve > Warning: Kernel filter failed: Invalid argument > > So I fix it by the following: > 1. the mirror-to interface was added with a vlan tag, which let > datapath to pop its tag. > 2. the traffic will be mirrored with mirror's select_vlan, and that > don't care about will not be received on the mirror-to interface. Maybe rephrase: "The fix is to make a convenience argument that sets the mirror port's select_vlan column, and also marks the port as native tagged with VLAN." > Signed-off-by: Daniel Ding > --- > utilities/ovs-tcpdump.in | 37 + > 1 file changed, 33 insertions(+), 4 deletions(-) > > diff --git a/utilities/ovs-tcpdump.in b/utilities/ovs-tcpdump.in > index eada803bb..b2b69d3c4 100755 > --- a/utilities/ovs-tcpdump.in > +++ b/utilities/ovs-tcpdump.in > @@ -142,6 +142,8 @@ The following options are available: > --mirror-toThe name for the mirror port to use (optional) >Default 'miINTERFACE' > --span If specified, mirror all ports (optional) > + --vlan If specified, mirror a vlan traffic and pop s/ a// > + its tag (optional) > """ % {'prog': sys.argv[0]}) > sys.exit(0) > > @@ -319,7 +321,7 @@ class OVSDB(object): > (mirror_name, txn.get_error())) > self._txn = None > > -def make_port(self, port_name, bridge_name): > +def make_port(self, port_name, bridge_name, vlan=None): > iface_row = self.make_interface(port_name, False) > txn = self._txn > > @@ -330,6 +332,12 @@ class OVSDB(object): > port = txn.insert(self.get_table('Port')) > port.name = port_name > > +if vlan is not None: > +port.verify('tag') > +tag = getattr(port, 'tag', []) > +tag.append(vlan) > +port.tag = tag > + Can a port have multiple tags set for vlan? I was under the impression that only one native tag was allowed per-port, but maybe I'm wrong. > br.verify('ports') > ports = getattr(br, 'ports', []) > ports.append(port) > @@ -354,7 +362,7 @@ class OVSDB(object): > return result > > def bridge_mirror(self, intf_name, mirror_intf_name, br_name, > - mirror_select_all=False): > + mirror_select_all=False, mirrored_vlan=None): > > txn = self._start_txn() > mirror = txn.insert(self.get_table('Mirror')) > @@ -374,6 +382,12 @@ class OVSDB(object): > src_port.append(mirrored_port) > mirror.select_src_port = src_port > > +if mirrored_vlan: > +mirror.verify('select_vlan') > +select_vlan = getattr(mirror, 'select_vlan', []) > +select_vlan.append(mirrored_vlan) > +mirror.select_vlan = select_vlan > + > output_port = self._find_row_by_name('Port', mirror_intf_name) > > mirror.verify('output_port') > @@ -440,6 +454,7 @@ def main(): > db_sock = 'unix:%s' % os.path.join(rundir, "db.sock") > interface = None > tcpdargs = [] > +vlan = None > > skip_next = False > mirror_interface = None > @@ -474,12 +489,25 @@ def main(): > elif cur in ['--span']: > mirror_select_all = True > continue > +elif cur in ['--vlan']: > +vlan = nxt > +skip_next = True > +continue > tcpdargs.append(cur) > > if interface is None: > print("Error: must at least specify an interface with '-i' option") > sys.exit(1) > > +if vlan: > +try: > +vlan = int(vlan) > +if vlan < 0 or vlan > 4095: > +raise ValueError("out of range") > +except ValueError: > +print("Error: vlan muse be within <0-4095>") ^must > +sys.exit(1) > + > if not py_which(dump_cmd): > print("Error: unable to execute '%s' (check PATH)" % dump_cmd) > sys.exit(1) > @@ -523,10 +551,11 @@ def main(): > teardown(db_sock, interface, mirror_interface, tap_created) > > try: > -ovsdb.make_port(mirror_interface, ovsdb.port_bridge(interface)) > +ovsdb.make_port(mirror_interface, > +ovsdb.port_bridge(interface), vlan) > ovsdb.bridge_mirror(interface, mirror_interface, > ovsdb.port_bridge(interface), > -mirror_select_all) > +mirror_select_all, vlan) > except OVSDBException as oe: >