Ho eseguito la codifica VLAN 802.1Q di frame per un client in cui disponevano solo di 802.3 frame Ethernet ma volevo eseguire la migrazione su 802.1Q in quanto era installato un nuovo switch VLAN consapevole.
Innanzitutto, non è possibile copiare i bit. Abbiamo copiato il tag in byte usando memcpy.
Illustrazione (vedi Wikipedia per le descrizioni dei campi): -
VLAN tag = 4 byte; composto da TPID (2 byte) e TCI (2 byte).
TPID è semplice ed è sempre 0x8100 che indica un frame con tag VLAN.
TCI è costituito da PCP-3 bit, DEI-1 bit, VID-12 bit. Ripartizione del TCI in nibbles, cioè 4 bit. Per impostazione predefinita, il nibble (PCP + DEI) = 0x0 assumendo la priorità è disabilitato e DEI = 0. I restanti 3-nibbles (12 bit) sono per l'ID VLAN stesso. Supponi di voler taggare un frame per VLAN-ID = 123. In esadecimale sarà = 0x07B.
Raggruppa insieme i bocconcini e lì hai il tuo campo TCI a 2 byte che ora può essere visto come 0x007B.
Quindi è possibile effettuare le seguenti operazioni. (codice non compilato)
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));
La domanda più importante è se si prevede che i bit si spostino in relazione ai limiti di 8 bit come parte della copia; e ti aspetti che i bit possano sovrapporsi? –
memcpy copia n 'byte' dall'origine alla destinazione.Non puoi usare 'memcpy' per bit. –
Ho bisogno di questa funzionalità per lo stesso motivo, per favore fornisci una risposta su come hai risolto questo problema. – jwbensley