dimka76 54 14 мая Опубликовано 14 мая · Жалоба Здравствуйте. Никак не получается настроить VLAN в указанном коммутаторе. Цель - сделать так, чтобы с порта 1 все шло только на порт 3, с порта 2 все шло только на порт 3, с порта 3 можно было бы отправлять и на порт 1 и на порт 2. Порт 3 это порт микроконтроллера. Что делаю. 1. Включаю функцию добавления тага по умолчанию и удаление тага на выходе порта. 2. Настраиваю членство для портов: - порт 1 состоит в группе порта 1 и порта 3 - порт 2 состоит в группе порта 2 и порта 3 - порт 3 состоит в группе порта 1, порта 2 и порта 3 3. Настраиваю для портов таги по умолчанию: - для порта 1 - таг по умолчанию равен 1 - для порта 2 - таг по умолчанию равен 2 - для порта 3 - таг по умолчанию равен 3 4. Разрешаю для всех портов подстановку постановку тагов по умолчанию. 5. Настраиваю таблицу VLAN - первый элемент таблицы - членство для портов 1 и 3, FID = 1, VID = 1 - второй элемент таблицы - членство для портов 2 и 3, FID = 2, VID = 2 - третий элемент таблицы - членство для портов 1, 2 и 3, FID = 3, VID = 3 6. В глобальном регистре настроек включаю разрешение работы VLAN. В итоге. На порт 3 приходит все и с порта 1 и с порта 2. Пакеты между портами 1 и 2 туда-сюда не проходят. Но с порта 3 ничего не выходит ни на порт 1 ни на порт 2. Что я делаю не так ? Spoiler void vlan_init(void) { uint16_t data16; // PxCR1 ----------------------------- data16 = ksz8463_read(KSZ8463_P1CR1); data16 |= ((2UL << 1) | /* Tag Insertion */ (1UL << 1)); /* Tag removal */ ksz8463_write(KSZ8463_P1CR1, data16); data16 = ksz8463_read(KSZ8463_P2CR1); data16 |= ((2UL << 1) | /* Tag Insertion */ (1UL << 1)); /* Tag removal */ ksz8463_write(KSZ8463_P2CR1, data16); data16 = ksz8463_read(KSZ8463_P3CR1); data16 |= ((2UL << 1) | /* Tag Insertion */ (1UL << 1)); /* Tag removal */ ksz8463_write(KSZ8463_P3CR1, data16); // PxCR2 ----------------------------- data16 = ksz8463_read(KSZ8463_P1CR2); data16 &= ~(7UL << 0); // clear Port VLAN Membership bits data16 |= ((1UL << 14) | /* Ingress VLAN Filtering */ (5UL << 0)); /* Port VLAN Membership - Port3 and Port1 */ /* какие порты будут входить в сеть VLAN1. Только Port1 и Port3. */ /* Т.е. Port1 будет общаться только с Port3. Это будет VLAN1 */ ksz8463_write(KSZ8463_P1CR2, data16); data16 = ksz8463_read(KSZ8463_P2CR2); data16 &= ~(7UL << 0); // clear Port VLAN Membership bits data16 |= ((1UL << 14) | /* Ingress VLAN Filtering */ (6UL << 0)); /* Port VLAN Membership - Port3 and Port2 */ /* какие порты будут входить в сеть VLAN2. Только Port2 и Port3 */ /* Т.е. Port2 будет общаться только с Port3. Это будет VLAN2 */ ksz8463_write(KSZ8463_P2CR2, data16); data16 = ksz8463_read(KSZ8463_P3CR2); data16 &= ~(7UL << 0); // clear Port VLAN Membership bits data16 |= ((1UL << 14) | /* Ingress VLAN Filtering */ (7UL << 0)); /* Port VLAN Membership - all ports - Port1, Port2 and Port3 */ /* объединение VLAN1 и VLAN2 на Port3 */ /* Т.е. Port3 будет общаться и с Port1 и с Port2. Это будет объединение VLAN1 и VLAN2 */ ksz8463_write(KSZ8463_P3CR2, data16); // PxVIDCR ----------------------------- data16 = 0x01UL; // default tag for PORT1 ksz8463_write(KSZ8463_P1VIDCR, data16); data16 = 0x02UL; // default tag for PORT2 ksz8463_write(KSZ8463_P2VIDCR, data16); data16 = 0x01UL; // default tag for PORT3 ksz8463_write(KSZ8463_P3VIDCR, data16); // SGCR7 ------------------------------ data16 = ksz8463_read(KSZ8463_SGCR7); data16 &= ~(0x07UL << 0); // clear Unknown Packet Default Port(s) data16 |= ((1UL << 7) | /* Unknown Default Port Enable */ (4UL << 0)); /* Unknown Packet Default Port(s) = Port3 */ ksz8463_write(KSZ8463_SGCR7, data16); // SGCR8 ------------------------------ data16 = ksz8463_read(KSZ8463_SGCR8); data16 |= (1UL << 8); /* Port 3 Tail-Tag Mode Enable */ ksz8463_write(KSZ8463_SGCR8, data16); // SGCR9 ------------------------------ data16 = ksz8463_read(KSZ8463_SGCR9); data16 &= ~((1UL << 11) - 1UL); /* clear bits from 0 to 10 */ data16 |= ((4UL << 8) | /* Forwarding Invalid Frame */ /* Define the forwarding port for frame with invalid VID */ /* Port3 only*/ (0x3F << 0)); /* Enable Insert Source Port PVID Tag when Untagged Frame */ /* for all ports to all ports */ ksz8463_write(KSZ8463_SGCR9, data16); // VLAN table init // clear all table entries for(uint32_t i=0; i<16; ++i) { ksz8463_write(KSZ8463_IADR5, 0); // VLAN table bits [19:16] ksz8463_write(KSZ8463_IADR4, 0); // VLAN table bits [15:0] data16 = ((0UL << 12) | /* write cycle */ (1UL << 10) | /* VLAN table selected. */ ((i & 0x3FF) << 0)); /* Indirect Address */ ksz8463_write(KSZ8463_IACR, data16); // set indirect address and trigger a write VLAN table operation } union{ uint16_t dat16[2]; uint32_t dat32; }data32; data32.dat32 = ((1UL << 19) | /* Specifies that this entry is valid, the look up result will be used */ (5UL << 16) | /* Membership - Port3 and Port1 */ (1UL << 12) | /* FID */ (1UL << 0)); /* VID */ ksz8463_write(KSZ8463_IADR5, data32.dat16[1]); // VLAN table bits [19:16] ksz8463_write(KSZ8463_IADR4, data32.dat16[0]); // VLAN table bits [15:0] data16 = ((0UL << 12) | /* write cycle */ (1UL << 10) | /* VLAN table selected. */ (0UL << 0)); /* Indirect Address */ ksz8463_write(KSZ8463_IACR, data16); // set indirect address and trigger a write VLAN table operation data32.dat32 = ((1UL << 19) | /* Specifies that this entry is valid, the look up result will be used */ (6UL << 16) | /* Membership - Port3 and Port2 */ (2UL << 12) | /* FID */ (2UL << 0)); /* VID */ ksz8463_write(KSZ8463_IADR5, data32.dat16[1]); // VLAN table bits [19:16] ksz8463_write(KSZ8463_IADR4, data32.dat16[0]); // VLAN table bits [15:0] data16 = ((0UL << 12) | /* write cycle */ (1UL << 10) | /* VLAN table selected. */ (1UL << 0)); /* Indirect Address */ ksz8463_write(KSZ8463_IACR, data16); // set indirect address and trigger a write VLAN table operation data32.dat32 = ((1UL << 19) | /* Specifies that this entry is valid, the look up result will be used */ (7UL << 16) | /* Membership - Port3, Port2 and Port1*/ (3UL << 12) | /* FID */ (3UL << 0)); /* VID */ ksz8463_write(KSZ8463_IADR5, data32.dat16[1]); // VLAN table bits [19:16] ksz8463_write(KSZ8463_IADR4, data32.dat16[0]); // VLAN table bits [15:0] data16 = ((0UL << 12) | /* write cycle */ (1UL << 10) | /* VLAN table selected. */ (2UL << 0)); /* Indirect Address */ ksz8463_write(KSZ8463_IACR, data16); // set indirect address and trigger a write VLAN table operation // SGCR2 (VLAN Enable) ------------------------------ data16 = ksz8463_read(KSZ8463_SGCR2); data16 |= (1UL << 15); // VLAN enable ksz8463_write(KSZ8463_SGCR2, data16); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sorok-odin 5 14 мая Опубликовано 14 мая · Жалоба 8 часов назад, dimka76 сказал: Цель - сделать так, чтобы с порта 1 все шло только на порт 3, с порта 2 все шло только на порт 3, с порта 3 можно было бы отправлять и на порт 1 и на порт 2. не знаю, как это сделать "настоящими VLAN-таблицами", но именно ваша задача когда-то давно успешно решалась (если не изменяет память) установкой значений только лишь в поля Port VLAN Membership в регистрах P*CR2. Остальные поля и регистры вообще не трогали. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 54 16 мая Опубликовано 16 мая · Жалоба On 5/15/2024 at 12:07 AM, sorok-odin said: именно ваша задача когда-то давно успешно решалась (если не изменяет память) установкой значений только лишь в поля Port VLAN Membership в регистрах P*CR2. Остальные поля и регистры вообще не трогали. Попробовал сделать так же. Не работает. Из порта 3 не выходят широковещалки. При этом, порт принимает все пакеты, в том числе и широковещалки. На сайте микрочипа нашел документ AN-135 802.1Q Tag Based and Port Based VLAN Function and Setting in KSZ8995M/MA Из него следует, что ваш метод это Port based VLAN. Так там указано, что в этом режиме широковещалки и групповая рассылка все таки буде проходить на все порты. Для полной изоляции надо применять как раз Tag based VLAN и заполнять таблицу. Но у меня ни тот ни другой метод до конца не работает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться