Par défaut, les tests de Fluor montrent qu'avec Bouygues (au moins) seul le port LAN1 (1Gbps) est fonctionnel.
Le comportement serait peut-être différent avec des OLT qui configurent plusieurs ports, mais en France ce n'est pas le cas (du moins pour les opérateurs nationaux).
Il est peut-être possible de configurer les VLAN et autres manuellement sur les ports, mais l'idéal est de faire en sorte que l'ONT utilise le port LAN2 (2,5Gbps) comme premier (ou seul port) vu de l'ONT.
Pour cela, il existe une configuration, PORT_REMAPPING.
Sa valeur par défaut est 0000000000000000.
Mais il y a un code qui la positionne à 0100000000000000 au boot.
Comme indiqué par Fluor plus tôt, si on le met à 0001000000000000, alors c'est le port LAN2 qui est utilisé.
Le code de la fonction d'init se répète pas mal, et le compilateur a essayé de mettre des bouts en commun donc ce n'est pas très lisible.
Une fois simplifié, ça donne quelque chose comme :
void Lansds_Rtk_Mac0_Phy_8221b_Detect()
{
char first_up[3];
char lan_type = 0;
uint8_t port_remapping[?];
char sys_capability[32];
int cap0, cap1, cap2, cap3, cap4, cap5;
...
get_value(id_FIRST_UP, &first_up);
if (first_up[0] == 0x01) {
cmd("flash set FIRST_UP 0");
}
cmd("lansds initmac0");
cmd("lansds detect_mac0_phy");
if (cond) { // detected ?
printf("%s-%d", "Lansds_Rtk_Mac0_Phy_8221b_Detect", 1097);
get_value(id_LAN_TYPE, &lan_type);
if ((lan_type & 2) == 0) {
lan_type |= 2;
set_value(id_LAN_TYPE, &lan_type);
}
if ((lan_type & 3) == 3) {
g_number_of_interfaces = 2;
get_value(id_PORT_REMAPPING, &port_remapping);
if (port_remapping[0] != 0x01 || port_remapping[1] != 0x00)
cmd("flash set PORT_REMAPPING 0100000000000000");
} else {
if ((lan_type & 2) != 0) {
g_number_of_interfaces = 1;
get_value(id_PORT_REMAPPING, &port_remapping);
if (port_remapping[0] != 0x01 || port_remapping[1] != 0x00)
cmd("flash set PORT_REMAPPING 0100000000000000");
} else {
g_number_of_interfaces = 1;
get_value(id_PORT_REMAPPING, &port_remapping);
if (port_remapping[0] != 0x00 || port_remapping[1] != 0x01)
cmd("flash set PORT_REMAPPING 0001000000000000");
}
}
get_value(id_SYS_CAPABILITY, &sys_capability);
sscanf(sys_capability, "%d;%d;%d;%d;%d;%d", &cap0, &cap1, &cap2, &cap3, &cap4, &cap5);
if (cap1 != g_number_of_interfaces) {
sprintf(sys_capability, "%d;%d;%d;%d;%d;%d", cap0, g_number_of_interfaces, cap2, cap3, cap4, cap5);
set_value(id_SYS_CAPABILITY, &sys_capability);
}
} else {
g_number_of_interfaces = 1;
get_value(id_PORT_REMAPPING, &port_remapping);
if (port_remapping[0] != 0x00 || port_remapping[1] != 0x01)
cmd("flash set PORT_REMAPPING 0001000000000000");
}
}
Donc si on résume :
if (RTL8221B detected) {
LAN_TYPE = LAN_TYPE | 2
if ((LAN_TYPE & 3) == 3) { // maybe if LAN1 port was detected / enabled ?
2 interfaces, PORT_REMAPPING = 0100000000000000
} else {
if (LAN_TYPE & 2) {
1 interface, PORT_REMAPPING = 0100000000000000
} else {
// dead code, due to "LAN_TYPE = LAN_TYPE | 2" above
1 interface, PORT_REMAPPING = 0001000000000000
}
}
set number of interfaces as second number in SYS_CAPABILITY
} else {
// maybe for SFP ONT (not sure what happens if it's in a media converter with RTL8221B...)
// or for an ONT with only a 1Gbps port (but in this case the mapping seems strange)
PORT_REMAPPING = 0001000000000000
}
C'est difficile à comprendre
Trois pistes :
- "flash set LAN_TYPE 2" : si rien ne vient forcer le premier bit, on aura PORT_REMAPPING = 0100000000000000, mais peut-être que seule l'interface LAN2 sera présente
- "flash set LAN_TYPE 2" + supprimer le test "if (LAN_TYPE & 2) {", ou changer la valeur dans le bloc de code, pour avoir PORT_REMAPPING = 0001000000000000
- modifier le code dans le "if ((LAN_TYPE & 3) == 3)" pour avoir les deux ports présents, mais le LAN2 en premier