PDA

View Full Version : New Feature Ready for Review: VLAN Support



mystery
05-31-2023, 02:43 AM
Hello,

This is my first contribution and I haven't worked in c/c++ for quite a while, so it took me a while to figure out the exact place and method for this feature enhancement.

I have a working proof-of-concept (patch attached), but I'm hoping some existing contributor(s) can help me get it across the line. I'm not sure what your style and implementation preferences are.

Problem Statement:

Packets with VLAN tagging (802.11q) are ignored by showeq

Solution:

This feature allows showeq to decode packets that include VLAN tagging.

Motivation:

I have a network setup with a managed switch and a SPAN port that is mirroring traffic to a dedicated secondary NIC in a showeq VM. Because of my specific switch design (TP-LINK) and usage of VLANs, the mirrored traffic ends up including traffic both with and without VLAN tagging (incoming traffic is untagged, outgoing traffic is tagged).

Implementation Details:

I discovered that while the packets were being seen by libpcap's packet filter, they were ultimately ending up rejected by showeq. The additional 4 bytes in the ethernet header meant that VLAN-tagged packets ended up failing to decode, as the code would attempt to index into the memory buffer to access the packet payload, but would end up misaligned with the IP header, causing it to believe it was a non-IP packet.

To solve this, I modified packetcapture.cpp PacketCaptureThread :: packetCallback

I added a new define check, for PCAP_VLAN, which when built into the project (./configure CXXFLAGS='-DPCAP_VLAN'), examines the packet header for ETHERTYPE_VLAN, and if found, skips the 4-byte VLAN field when copying the data into the packetCache. This allows showeq to process it just like any other normal IP packet.

I used the inspiration from the PCAP_DEBUG section (which I also modified slightly), as it already showed how to examine the packet for ETHERTYPE_IP, so I just had to add an additional check there for ETHERTYPE_VLAN so I could confirm that the packets were making it past libpcap.

However, I don't know the full performance implications of the additional if checks at runtime, which is why I included this change as a compiler-time flag. If maintainers believe it would make sense at runtime, I'm open to changes!

original code



struct packetCache *pc;
PacketCaptureThread* myThis = (PacketCaptureThread*)param;
pc = (struct packetCache *) malloc (sizeof (struct packetCache) + ph->len);
pc->len = ph->len;
memcpy (pc->data, data, ph->len);
pc->next = NULL;


modified code



#ifdef PCAP_VLAN
// check the type from header
struct ether_header* packetHeader = (struct ether_header*) data;
uint16_t packetType = ntohs(packetHeader->ether_type);
uint32_t packetLength = ph->len;
if (packetType == ETHERTYPE_VLAN)
{
// will use 4 less bytes without VLAN
packetLength -= 4;
}
struct packetCache *pc;
PacketCaptureThread* myThis = (PacketCaptureThread*)param;
pc = (struct packetCache *) malloc (sizeof (struct packetCache) + packetLength);
pc->len = packetLength;
if (packetType == ETHERTYPE_VLAN)
{
// copy first 12 bytes (src/dst)
memcpy (pc->data, data, 12);
// copy remaining bytes, skipping the 4 byte VLAN header (12 + 4 = 16)
memcpy (pc->data + 12, data + 16, packetLength - 12);
}
else
{
// copy the entire packet
memcpy (pc->data, data, packetLength);
}
pc->next = NULL;
#else
struct packetCache *pc;
PacketCaptureThread* myThis = (PacketCaptureThread*)param;
pc = (struct packetCache *) malloc (sizeof (struct packetCache) + ph->len);
pc->len = ph->len;
memcpy (pc->data, data, ph->len);
pc->next = NULL;
#endif


please see patch file and advise. TIA

cn187
06-01-2023, 09:13 AM
Hi! Thanks for your submission.

Honestly, I'm a bit surprised by this issue. In my experience, drivers typically process and strip the dot1q tags, so you never even see them. Anecdotally, none of the systems on my network show the vlan tag in packet captures, but I know the tags are there because I can see them if I do a capture on the switch. Out of curiosity, what nic/driver is your SEQ box using?

That said, SEQ isn't exactly a typical application, so there are bound to be edge-cases, especially related to networking.

I don't think I'm going to be able to test this myself, but if it works for you, and we keep it as a compile-time option, I don't have an issue merging it. At a cursory glance, it looks fine, but I'll do a proper review as soon as I get a chance. (probably this weekend).

mystery
06-01-2023, 12:32 PM
Hi cn187, thank you for your response.

You're (obviously) correct that typically one might have the drivers strip VLAN information assuming the NIC is configured to do so.

That's actually one of the first things I tried while investigating why I couldn't get showeq to work.

That's when I discovered that some of the traffic hitting my interface was untagged, so even if I created a VLAN interface, which would strip the tags from that traffic, I only had some of the traffic on a single interface.

The problem comes down to my network switch, made by TP-LINK, which when doing port mirroring, doesn't care what the settings are on the destination port. Other switches, such as more advanced Cisco switches, allow you to configure the behavior on a mirror port.

So for example, ideally assuming I had "VLAN 5" traffic getting mirrored, I could set the destination port to VLAN 5 and then it would strip the tags for me automatically at the switch. Unfortunately, this TP-LINK switch doesn't do that. It's mirroring traffic from an "access" port, so all the incoming traffic it mirrors is untagged, but the outgoing traffic (destined for the router) ends up tagged.

In addition, because this is mirror traffic, I don't have the dedicated NIC that is receiving the traffic connected to an actual network. It's got a link-local address since showeq requires an IP to bind to it, but the interface is getting sent all the packets it needs without requiring any IP binding at all (confirmed with wireshark).

One of the advantages of the implementation I proposed is that in theory I can combine multiple port mirrors into my single destination port, so I could have multiple different VLANs of mirrored traffic hitting my showeq's dedicated mirror NIC, and I could sniff eq sessions on any of them.

As far as testing, I created an offline packet capture and then replayed it while I was doing my testing. I would share it but I'm not sure of the privacy of the eq packets in my capture.

Please let me know if you have any other questions! So far my solution has been working great for me, and it's awesome being able to run it in a VM in a complex network.

cn187
06-01-2023, 01:06 PM
One of the advantages of the implementation I proposed is that in theory I can combine multiple port mirrors into my single destination port, so I could have multiple different VLANs of mirrored traffic hitting my showeq's dedicated mirror NIC, and I could sniff eq sessions on any of them.

That's a really nice capability for multi-boxers on TrueBox servers, or households with multiple players and a dedicated showeq box.



As far as testing, I created an offline packet capture and then replayed it while I was doing my testing. I would share it but I'm not sure of the privacy of the eq packets in my capture.


The capture will have all kinds of identifying info in it, so you definitely don't want to post it publicly. Thinking about it a little more, I probably can't reproduce your exact scenario, but I should be able to do a capture directly on my switch (since the I can see the tags there) and then use that pcap for playback, which should be good enough.

mystery
06-01-2023, 04:56 PM
That's a really nice capability for multi-boxers on TrueBox servers, or households with multiple players and a dedicated showeq box.

Yeah that's exactly what I was thinking. There's one edge case that I guess would still exist, where if you somehow used multiple different VLANs and then allowed the same IP addressing on each (like two diff vlans but they both had same IP). At that point you would need to instead preserve the VLAN information, or pass it further into the stack so that they could be categorized separately in the UI, but I don't forsee that situation being likely even with my weird edge case (all my boxes are on the same VLAN already).




The capture will have all kinds of identifying info in it, so you definitely don't want to post it publicly. Thinking about it a little more, I probably can't reproduce your exact scenario, but I should be able to do a capture directly on my switch (since the I can see the tags there) and then use that pcap for playback, which should be good enough.

If you're just looking to get some traffic with 802.1q tags, and your switch supports TRUNK or GENERAL mode, you might be able to add an additional VLAN to the switch port and it will keep that traffic tagged (since trunked VLAN traffic stays tagged, or any VLAN beyond the first one on a GENERAL port, which seems to combine TRUNK and ACCESS). You probably already know all this, but just in case it helps!

xerxes
06-02-2023, 06:29 PM
One of the advantages of the implementation I proposed is that in theory I can combine multiple port mirrors into my single destination port, so I could have multiple different VLANs of mirrored traffic hitting my showeq's dedicated mirror NIC, and I could sniff eq sessions on any of them.

That's a really nice capability for multi-boxers on TrueBox servers, or households with multiple players and a dedicated showeq box.
I've been wondering about how much extra load the port mirroring puts on the network. I multibox on multiple machines and the way I ended up giving the same functionality is that the secondary switch that's connected to the machines running EQ are mirroring their traffic to the switch port that is connected to another switch with the showEQ box on it. Since the port being mirrored contains all of the traffic from the other switch, I am able to easily swap between which machine it is monitoring. But I think by doing this, it's also creating a ton of additional, unnecessary traffic on the network, both when EQ is running and when it is not.

cn187
06-05-2023, 03:50 PM
I've been wondering about how much extra load the port mirroring puts on the network. I multibox on multiple machines and the way I ended up giving the same functionality is that the secondary switch that's connected to the machines running EQ are mirroring their traffic to the switch port that is connected to another switch with the showEQ box on it. Since the port being mirrored contains all of the traffic from the other switch, I am able to easily swap between which machine it is monitoring. But I think by doing this, it's also creating a ton of additional, unnecessary traffic on the network, both when EQ is running and when it is not.

To clarify - You have the EQ client switch mirroring multiple ports to a singe port, then you're connecting that mirrored port to the SEQ switch. But then on the SEQ switch, you have that port mirrored again to the SEQ box's port?

xerxes
06-06-2023, 08:28 AM
< Main Router > <-- Port 16 on Secondary Switch --> <-- Secondary Switch -->
< Main Router > <-- Port 4 on Main Switch --> < SEQ box >
< Secondary Switch > <------> < EQ1 >
< Secondary Switch > <------> < EQ2 >
< Secondary Switch > <------> < EQ3 >

On the second switch, port mirroring is enabled to mirror to port 16. Source is port 15, which doesn't have anything plugged into it. This has the effect of having all of the switch ports on the secondary switch be mirrored onto the link to the main router, which then gives the SEQ box on the main router access to any EQ session.

859
https://www.showeq.net/forums/image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA+EAAAFSCAYAAAC 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 8GpyZuRfG9ZlzEX5sk1zZE5JFjMhifFu0CnJfaAxKY3m6Dltun futGXcZC7O7VjXCz23r1ll9tYKSVSYaRUzZGaF2Xe7OsrVAFHm ycLq4LnSBA/3iMwzAWOpnEHT29NNMBIXLAwc62ZfCLzXVbxy3plRTj0nLcmoU dZ9wA12kbDt6dGbcCZwrC6Nk1P4NVKjvN2YkAkldFoK3Z56vFf NSV2TzPiseb/07rr2KgThQJfStPWr5Wr3WppKZ2qQupvN+A+Weu/94L9k6c0rzNQGWVFzi9ibm7ZmPOyzHacXEfNLPF7ItuaFNZKYO UMSpfq3RNMqr1kktVKqQY6hNQ2rZ8q8PFMSu4YGt7rbLzLb8xr zWiZrSvgm/qp7tYz6WlQStUy5mYvchxtlzlWFp07HRS8W5zR4v7sGFPmmzsa qImFCGbOPupolm7XR+La5PC8NOc/tFRNknBtUeqOrS5kAsfXvO0PmdyC1v5ja/1up56uEzKzq2lJ75Qz/46g1pdfcqlkmXX/zNdf29G4Oz5PzKyUjPb2rhJbT3sxKSu2ia71zfglkwOTeP1fJM vt3SX/7Uswg7F0IwoHYmMD6IRNFzDxdTrF/TTTQXirJj9d46eoLqqR+aY0XYDv170yUGn3v8xfLglvmSqX539 yam6U6YT77/RWS8NPdzXvJpSFt0Hs4vdu7TLyLtpK9n6s1oX56qvmjVyo1Y2m upuGq80o2CPNoZoGXRme3Z3WjLFtUgtvT1oiai7BT/XKK1N5Tir+707hGzK8vM0qwctmzxl40aq2Obs/TXriuJC5yWzP7p7nqXbvMuxBf3lBR4scTisecU29dJjK/NNKSc9GbW5o6PXP1Ips2X3LxWLe4OWy4v/Hea6HM2VQazRCy2RuD5iLxNL+cUiv3Ptrg3kVXIAgHiqh+abqm +uqra2SFzJWaz1d5AWOyXp5PVsqsma5da9VcmWuC6+dXp0+Klb NOabMTt/qH6kwobySqTbC+QEog+y02ehdf0xZLPtXXsempJVQzlqJBmAkc a2/V4EHbXOpwqdfeetuzrBS3p60RTcgEd91Ysr+7k6xfLaKZJG685 Php3u4wn3HqdHPi05qnEqRpvu5ifOGpZttWTDD7Qokz++a7blC VcpOZ7kFvGi03AfiSdmrKS4XX3MMGaCVGz03JxlpZpLW22nmgD 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 adl0SItfzHLq1rHLd9smyF+vP93ffj5/3J+vmOVEJoJwoNfRPyR6d1ZPtt5Lx81/velu2DsP61zeKziu82S+XwyUM1qUM1qUM1qUM1qUM1qUM1rdpZ zKrKu5Wfr166tPHpPmpiYTPPWVb9x4rdz8levlcN8yW/PdzxRZnyle1qfZvN9Hh9x38cvmlbk4utP2hI8gHOhlvLuc5o9D k562+0pzixku62enlWlvnraHT2+e4Lj3d8SbHnx570ePckaLck aLckaLckaLckaLckaru5RTaVlbmsukqcms/LBXDq3sLmtukf59TGDeZIJX86/HK0+z+Z9Hy6bTTFhrPl6scnan7Yk0tjLQy5hzsznxNkufvi1S1 nLYplH1kSZz0jUnb3NCto+zMCP6r56fvX/NyTr1MvSPki7LvYqBckaLckaLckaLckaLckaLckaru5SzyUZJZ j22LbdZSx9XjubD0ty3XA5ruUzZtba7yQTiGvbaspgvqBnpOqz fRz/jf59i6C7bE5kIwoHepqWPOUGXS9Nh725ns71ha07O+q+9Q2pOx OYE7f/rpVIFX+asrkN2uv5r/4ke5YwW5YwW5YwW5YwW5YwW5YxWNylnmYlutRZcy6hr9DtcM6M 2ELfzuFBKO15Ll9XMa76Lll+5f4zUQLS6y++ODGVmgxe8qZOb3 pGRo8e4MaDn2b51iyTGH+nGur+rr75a7rrrLjdWPNdcc40sXbo 09YenUAsWLJAlS/SZm8Wl5bz77rvdWOHi3J6dLaduz47+Hvm69tpr7e/eUd1pe3IcpXEcRYvjKFocR9HiOIpWbzmOkBs14QAAAAAAxISac CBET6wJj0tnax46cErqkM7egY4L5YxWdyknx1G0KGe0OI6ixe8 eLcoZLWrCi4MgHAjR04LwAwcOuKHiGzBggBsqHOVsjXJGi3JGi 3JGi3JGi3JGi3JGqzeUE7mRjg4AAAAAQEyoCQdC9LSacAAAAAC lgZpwAAAAAABiQhAOAAAAAEBMCMIBAAAAAIgJQTgAAAAAADEhC AcAAAAAICYE4QAAAAAAxIQgHAAAAACAmBCEAwAAAAAQE4JwAAA AAABiQhAOAAAAAEBMCMIBAAAAAIgJQTgAAAAAADEhCAcAAAAAI CYE4QAAAAAAxIQgHAAAAACAmBCEAwAAAAAQE4JwAAAAAABiQhA OAAAAAEBMCMIBAAAAAIgJQTgAAAAAADEhCAcAAAAAICYE4QAAA AAAxIQgHAAAAACAmBCEAwAAAAAQE4JwAAAAAABiQhAOAAAAAEB MCMIBAAAAAIgJQTgAAAAAADEhCAcAAAAAICYE4QAAAAAAxIQgH AAAAACAmBCEAwAAAAAQE4JwAAAAAABiQhAOAAAAAEBMCMIBAAA AAIiFyP8P0lK580TvDmAAAAAASUVORK5CYII=

cn187
06-06-2023, 10:22 AM
But you have 16 mirrored to 4 on main, right? Otherwise, how is SEQ on 4 seeing the traffic on 16? At any rate - it's working for you, so maybe the details don't matter.

Though, I'm curious why you say it's generating a bunch of unnecessary network traffic. It seems to me that the only system that would see more traffic than usual is the SEQ box itself. Sure, there will be higher load on the switch, but assuming the link to the secondary isn't saturated, I don't really see a problem with your setup.

xerxes
06-14-2023, 02:10 PM
But you have 16 mirrored to 4 on main, right? Otherwise, how is SEQ on 4 seeing the traffic on 16? At any rate - it's working for you, so maybe the details don't matter.

Though, I'm curious why you say it's generating a bunch of unnecessary network traffic. It seems to me that the only system that would see more traffic than usual is the SEQ box itself. Sure, there will be higher load on the switch, but assuming the link to the secondary isn't saturated, I don't really see a problem with your setup.
Yep, that's correct. I left off that there's another switch that is mirroring the traffic to the SEQ box.

It's dumb mirroring a 16 port switch to another switch port on another switch. Not that there's a lot of traffic for EQ, but it could be slinging a lot of unnecessary packets unrelated to EQ at times.

Sorry to derail this thread. It seems somewhat related at first glance.

cn187
06-16-2023, 07:35 AM
Mystery - I haven't forgotten about this. I did a capture from my switch (in order to get the traffic with vlan tags) for testing, but it doesn't seem to be working. I assume it's an issue with my capture rather than with your patch, but things have been busy so I haven't had time to debug it. I'm hoping to get it wrapped up this weekend.

mystery
06-22-2023, 09:02 PM
Mystery - I haven't forgotten about this. I did a capture from my switch (in order to get the traffic with vlan tags) for testing, but it doesn't seem to be working. I assume it's an issue with my capture rather than with your patch, but things have been busy so I haven't had time to debug it. I'm hoping to get it wrapped up this weekend.

Thanks, no rush! I'm still happily running off the code changes on my local with no issues.

cn187
06-29-2023, 03:12 PM
Did you have to change the pcap filter strings? Asking because several of them include "and ether proto 0x0800", which should exclude packets with vlan tags (which are proto 0x8100) which means your modified packetCallBack would never see the packet.

mystery
09-09-2023, 12:28 AM
I don't think I had to change pcap filter strings, but unfortunately it's been a couple months since I messed with this. I had some major life changes and stepped away from EQ/SEQ for now.

Hopefully this patch can at least remain in this thread for anyone else who might need it in the future. Apologies that I can't finish bringing it over the line in the near term.

cn187
09-09-2023, 04:02 PM
No worries. I'm still planning on merging it at some point, and do appreciate you submitting what you have.

santa47
01-25-2024, 12:59 AM
This is generally better handled by letting the os network stack do its job, and at most run namespacing for isolation for the clients. Its total overkill to have the application understand stuff below layer 3 when the stack itself is designed to handle all of this trivially already.

Like you could add support for vxlan, qinq etc, or just configure the virtual interfaces on the box properly in about 4 lines of netconf and just tap the virtual interface and avoid all this extra work duplicating the effort.

mystery
02-18-2024, 09:40 AM
This is generally better handled by letting the os network stack do its job, and at most run namespacing for isolation for the clients. Its total overkill to have the application understand stuff below layer 3 when the stack itself is designed to handle all of this trivially already.

Like you could add support for vxlan, qinq etc, or just configure the virtual interfaces on the box properly in about 4 lines of netconf and just tap the virtual interface and avoid all this extra work duplicating the effort.

If that would have worked, I would have done that. I spent extensive time trying to figure out a solution without modifying the application code.

The issue is related to the TP-LINK switch I have, and how it does 802.1q tagging. Because some of the packets end up VLAN tagged and some do not (due to the mechanics of the mirror switch port), simply assigning VLANs at the network stack level does not solve it.

Thanks for your suggestion, though.

Edit: I would also argue that doing things by "letting the os network stack do its job" seems to be ignorant of the fact that seq itself is doing packet analysis already. It's a moot point.

santa47
02-18-2024, 10:55 AM
You can easily bridge the tagged and untagged interface in 2 lines of netconfig....