Jump to content
    

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);
}

 

 

Share this post


Link to post
Share on other sites

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

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

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

 

 

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...