pppd застрял в процессе набора - PullRequest
0 голосов
/ 28 июня 2011

Я подключаю несколько USB-модемов к моей Ubuntu:
uname -a<br> Linux devlp 2.6.32-28-generic #55-Ubuntu SMP Mon Jan 10 21:21:01 UTC 2011 i686 GNU/Linux<br> pppd version: 2.4.5

Я делаю тест с 8 беспроводными модемами sierra, и все они подключены и работают. каждый из них имеет интерфейс "ppp".
после того, как они подключены, я пытаюсь переподключить ppp7, и сначала pppd завершается ошибкой, затем во второй попытке он достигает точки, где он говорит: «Последовательное соединение установлено» и застревает. я попробовал все сигналы kill, чтобы безуспешно завершить работу этого pppd, и единственный способ завершить его - отключить модем, на который он пытался дозвониться.
я искал точное место, где застрял pppd, и это прямо здесь:

int generic_establish_ppp (int fd)
{
    int x;

    if (new_style_driver) {
        int flags;
        FILE *f=fopen("/root/ptest.log","a");
        fputs("before get channel\n",f);
        fflush(f);
        /* Open an instance of /dev/ppp and connect the channel to it */
        if (ioctl(fd, PPPIOCGCHAN, &chindex) == -1) { // <<<<<<< STUCK HERE
            error("Couldn't get channel number: %m");
            goto err;
        }
        fputs("after get channel\n",f);
        ....
    }
}

похоже, проблема именно в ppp7 - и это может быть любой модем, так что я не думаю, что это проблема модема, но чего я не понимаю, что на самом деле происходит в этой команде? кто отвечает за ответ? это только ядро? драйвер модема? сам модем? я не совсем понимаю, что делать с этой информацией, так как документация PPPIOCGCHAN очень плохая ..

Сначала я подумал, что, возможно, pppd не освобождает канал или ppp после отключения, поэтому я скомпилировал свою собственную версию pppd и добавил PPPIOCDISCONN и PPPIOCDETACH, просто чтобы убедиться, что с моей версией все в порядке, и результаты были такими же.
что ты думаешь?

1 Ответ

0 голосов
/ 30 июня 2011

хорошо, я довольно решил эту проблему - я добавил несколько строк в pppd перед командой ioctl, чтобы сделать fd NONBLOCK:)

...