Wykonałem oznaczanie ramek VLAN 802.1Q dla klienta, który miał tylko 802.3 ramki Ethernet, ale chciał przejść do wersji 802.1Q, ponieważ był zainstalowany nowy przełącznik VLAN aware.
Po pierwsze, nie można kopiować bitów. Skopiowaliśmy tag w bajtach za pomocą memcpy.
Ilustracja (patrz Wikipedia opisy pól): -
VLAN Tag = 4 bajty; składający się z TPID (2 Bytes) i TCI (2 Bytes).
Identyfikator TPID jest prosty i zawsze jest wartością 0x8100 wskazującą ramkę ze znacznikiem VLAN.
TCI składa się z PCP-3bit, DEI-1bit, VID-12bit. Podział TCI na przekąski, np. 4-bitowe. Domyślnie przydział (PCP + DEI) = 0x0 przy założeniu, że priorytet jest wyłączony, a DEI = 0. Pozostałe 3-nibbles (12 bitów) dotyczą samego VLAN-ID. Powiedzmy, że chcesz oznaczyć ramkę dla VLAN-ID = 123. W hexie będzie to = 0x07B.
Grupuj przekąski razem i tam masz swoje 2 bajtowe pole TCI, które można teraz zobaczyć jako 0x007B.
Następnie można wykonać poniższe czynności. (kod nie został skompilowany)
unsigned short int vlanTPID, vlanTCI;
unsigned char *dest, *src;
// Set the VLAN Tag
vlanTPID = 0x8100;
vlanTCI = 0x007B;
// Pointer to the TPID position of ethernet frame
dest = &vlanTagPosition;
src = &vlanTPID;
memcpy(dest, src, sizeof(vlanTPID));
// Increment dest pointer by 2 bytes to insert TCI in the ethernet frame
dest += 2;
src = &vlanTCI;
memcpy(dest, src, sizeof(vlanTCI));
Najważniejsze pytanie brzmi, czy spodziewasz się przesunięcia bitów w stosunku do 8-bitowych granic jako części kopii; i czy spodziewasz się, że bity mogą się nakładać? –
kopie memcpy n 'bytes' od źródła do miejsca docelowego.Nie możesz użyć 'memcpy' dla bitów. –
Potrzebuję tej funkcji z tego samego powodu. Proszę podać odpowiedź na pytanie, jak rozwiązać ten problem. – jwbensley