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