Перейти к содержанию
    

KSZ8463 VLAN

Здравствуйте.

Никак не получается настроить 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);
}

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 часов назад, dimka76 сказал:

Цель - сделать так, чтобы с порта 1 все шло только на порт 3, с порта 2 все шло только на порт 3, с порта 3 можно было бы отправлять и на порт 1 и на порт 2.

не знаю, как это сделать "настоящими VLAN-таблицами", но именно ваша задача когда-то давно успешно решалась (если не изменяет память) установкой значений только лишь в поля Port VLAN Membership в регистрах P*CR2. Остальные поля и регистры вообще не трогали.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 и заполнять таблицу.
 

Но у меня ни тот ни другой метод до конца не работает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...