Стоит шлюз на FreeBSD 5.1, подключение к провайдеру через pppoe.
Данное соединение ведёт себя очень нестабильно, может проработать пару дней, а может и пару раз в день рухнуть. Причём, самое интересное, захожу на шлюз, смотрю ifconfig
tun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1492
Т.е. интерфейс есть, но тунеля до прова нет.
Делаю ещё пару раз ifconfig, появляется :-) Всё становится в норме, инет в конторе появляется.
tun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1492
inet XXX.XXX.XXX.XXX --> YYY.YYY.YYY.YYY netmask 0xffffffff
Opened by PID 203
Но ента тварь, не хочет поднимать нормально соединение, пока не наберёшь ручкакми пару раз ifconfig!
В логах тоже интересно.
/var/log/messages
Oct 13 15:26:18 serv kernel: dc0: failed to force tx and rx to idle state
Oct 13 15:26:18 serv kernel: dc0: failed to force tx and rx to idle state
Oct 13 15:26:26 serv kernel: no matching session
Oct 13 15:26:26 serv kernel: no matching session
Oct 13 15:26:26 serv kernel: session in wrong state
dc0 это внешний интерфейс, три нижних сообщения идут из файла
/usr/src/sys/netgrapf/ng_pppoe.c
....
/*
* We are a client:
* Use the host_uniq tag to find the
* hook this is in response to.
* Received #2, now send #3
* For now simply accept the first we receive.
*/
utag = get_tag(ph, PTT_HOST_UNIQ);
if ((utag == NULL)
|| (ntohs(utag->tag_len) != sizeof(sp))) {
printf("no host unique field\n");
LEAVE(ENETUNREACH);
}
sendhook = pppoe_finduniq(node, utag);
if (sendhook == NULL) {
printf("no matching session\n");
LEAVE(ENETUNREACH);
}
/*
* Check the session is in the right state.
* It needs to be in PPPOE_SINIT.
*/
sp = NG_HOOK_PRIVATE(sendhook);
if (sp->state != PPPOE_SINIT) {
printf("session in wrong state\n");
LEAVE(ENETUNREACH);
Как сделать так, чтобы это соединение работало без сбоев?