Verify your VLANs

This is now directly available on the ONU http interface starting 2.7.0+ version of the firmware.

Extract VLANs data

You will need to ssh to the ONU first.

ssh root@192.168.11.1

Extract the VLANs data

omci_pipe.sh meg 171 257

The result will be something similar to that.

Class ID    = 171 (Extended VLAN conf data)
Instance ID = 257
Upload      = yes
Alarms      = -
-------------------------------------------------------------------------------
 1 Association type              1b ENUM RWS-------
   0x02 (2)
-------------------------------------------------------------------------------
 2 RX frame VLAN table max       2b UINT R---------
   0x0000 (0)
-------------------------------------------------------------------------------
 3 Input TPID                    2b UINT RW--------
   0xXXXX (XXXXX)
-------------------------------------------------------------------------------
 4 Output TPID                   2b UINT RW--------
   0xXXXX (XXXXX)
-------------------------------------------------------------------------------
 5 Downstream mode               1b ENUM RW--------
   0x00 (0)
-------------------------------------------------------------------------------
 6 RX frame VLAN table          16b TBL  RW---UTP--
   0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX
   0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX
   0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX
   0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX
   0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX
   0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX
   0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX
   0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX
   0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX
   0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX
   0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX
   0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX
   0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX
   0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX
   0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX
   0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX
   0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX
   0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX
   0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX
   0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX
   0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX
   0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX
   0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX

-------------------------------------------------------------------------------
 7 Associated ME ptr             2b PTR  RWS-------
   0xXXXX (257)
-------------------------------------------------------------------------------
 8 DSCP to P-bit mapping        24b STR  RW--O--P--
   0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX
   \xXX\xXX\xXX$\xXX$\xXX\xXX\xXX\xXX$\xXX\xXX\xXX\xXX\xXX\xXX\xXX
-------------------------------------------------------------------------------
R - Readable          O - Not supported (optional)
W - Writable          E - Excluded from MIB upload (template)
S - set-by-create     T - Table
A - Send AVC          V - Volatile
U - No upload         P - No swap
N - Not supported     Y - Partly supported

errorcode=0

Extract the table frome that and copy it.

   0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX
   0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX
   0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX
   0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX
   0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX
   0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX
   0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX
   0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX
   0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX
   0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX
   0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX
   0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX
   0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX
   0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX
   0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX
   0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX
   0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX
   0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX
   0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX
   0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX
   0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX
   0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX
   0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX

Compile table parser

nano vlan_decode.cpp
#include <iostream>
#include <string>
#include <vector>
#include <cstdlib>
#include <iomanip>
#include <climits>
#include <bit>

void output_priority(unsigned int n) {
    if (n < 7) {
      std::cout << n;
    } else if (n == 8) {
      std::cout << "Do not filter";
    } else if (n == 14) {
      std::cout << "Default";
    } else if (n == 15) {
      std::cout << "Not a double tag, ignore";
    } else {
      std::cout << "Invalid";
    }
}
void output_vid(unsigned int n) {
    if (n < 4096) {
      std::cout << n;
    } else if (n == 4096) {
      std::cout << "Do not filter on the outer VID";
    } else {
      std::cout << "Invalid";
    }
}

int main(int argc, char** argv) {
  std::cout << "Paste bitstream:" << std::endl;
  std::string input;
  std::vector<unsigned char> bitstream;
while (std::getline(std::cin, input)) {
  if (input.empty()) break;
//  std::cout << "Input " << input.size()/3 << " bytes" << std::endl;
  for (size_t i = 0; i < input.size(); i+=5) {
    while(std::isspace(input[i])) i++;
    if (i + 4 <= input.size()) {
      bitstream.push_back(strtoul(input.substr(i+2, 2).c_str(), 0, 16));
//      std::cerr << "Read " << std::hex << (unsigned int)bitstream.back() << std::endl;
    }
  }
}
//  std::cout << "Read " << bitstream.size() << " bytes" << std::endl;
  unsigned char* p = bitstream.data();
  int remaining = bitstream.size() - ((p - bitstream.data()));;
  size_t i = 1;
  std::cout << "Filter Outer\t\tFilter Inner\t\t\tTreatment Outer\t\t\tTreatment Innter" << std::endl;
  std::cout << "Prio\tVID\tTPIDDEI\tPrio\tVID\tTPIDDEI\tEthTyp\tTagRem\tPrio\tVID\tTPIDDEI\tPrio\tVID\tTPIDDEI" << std::endl;
  do {
    remaining -= 16;
    unsigned int* w = (unsigned int*)p;
    std::cout << ((__builtin_bswap32(w[0]) & 0xf0000000) >> 28) << ",\t" << ((__builtin_bswap32(w[0]) & 0x0fff8000) >> 15) << ",\t"
              << ((__builtin_bswap32(w[0]) & 0x00007000) >> 12) << ",\t" << ((__builtin_bswap32(w[1]) & 0xf0000000) >> 28) << ",\t"
              << ((__builtin_bswap32(w[1]) & 0x0fff8000) >> 15) << ",\t" << ((__builtin_bswap32(w[1]) & 0x00007000) >> 12) << ",\t"
              << (__builtin_bswap32(w[1]) & 0x0000000f) << ",\t(" << ((__builtin_bswap32(w[2]) & 0xc0000000) >> 30) << ",\t"
              << ((__builtin_bswap32(w[2]) & 0x000f0000) >> 16) << ",\t" << ((__builtin_bswap32(w[2]) & 0x0000fff8) >> 3) << ",\t"
              << (__builtin_bswap32(w[2]) & 0x00000007) << ",\t" << ((__builtin_bswap32(w[3]) & 0x000f0000) >> 16) << ",\t"
              << ((__builtin_bswap32(w[3]) & 0x0000fff8) >> 3) << ",\t" << (__builtin_bswap32(w[3]) & 0x00000007) << ")" << std::endl;
    /*unsigned int n = ((__builtin_bswap32(*w) & 0xf0000000) >> 28);
    std::cout << "Filter Outer Priority: ";
    output_priority(n);
    std::cout << std::endl;
    std::cout << "Filter Outer VID: ";
    output_vid((__builtin_bswap32(*w) & 0x0fff8000) >> 15);
    std::cout << std::endl;
    std::cout << "Filter Outer TPID/DEI: " << ((__builtin_bswap32(*w) & 0x00007000) >> 12) << std::endl;
    w++;
    n = ((__builtin_bswap32(*w) & 0xf0000000) >> 28);
    std::cout << "Filter Inner Priority: ";
    output_priority(n);
    std::cout << std::endl;
    std::cout << "Filter Inner VID: ";
    output_vid((__builtin_bswap32(*w) & 0x0fff8000) >> 15);
    std::cout << std::endl;
    std::cout << "Filter Inner TPID/DEI: " << ((__builtin_bswap32(*w) & 0x00007000) >> 12) << std::endl;
    std::cout << "Filter EtherType: " << (__builtin_bswap32(*w) & 0x0000000f) << std::endl;
    w++;
    std::cout << "Treatment, tags to remove: " << ((__builtin_bswap32(*w) & 0xc0000000) >> 30) << std::endl;
    std::cout << "Treatment outer priority: " << ((__builtin_bswap32(*w) & 0x000f0000) >> 16) << std::endl;
    std::cout << "Treatment outer vid: " << ((__builtin_bswap32(*w) & 0x0000fff8) >> 3) << std::endl;
    std::cout << "Treatment outer TPID/DEI: " << (__builtin_bswap32(*w) & 0x00000007) << std::endl;
    w++;
    std::cout << "Treatment inner priority: " << ((__builtin_bswap32(*w) & 0x000f0000) >> 16) << std::endl;
    std::cout << "Treatment inner vid: " << ((__builtin_bswap32(*w) & 0x0000fff8) >> 3) << std::endl;
    std::cout << "Treatment inner TPID/DEI: " << (__builtin_bswap32(*w) & 0x00000007) << std::endl;
    i++;*/
    p += 16;
  } while (remaining - 16 >= 0);
  return 0;
}
g++ -o vlan_decode vlan_decode.cpp

Use the table parser

Use the tool and paste the VLANs data.

./vlan_decode