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

LWIP, PPP, сервер не открывает соединение

Доброго времени суток!

 

Имеется gsm-модем в связке с STM32F030, на модеме включен режим ppp. Со стороны МК, в свою очередь, крутится lwip.

 

Функция настройки PPP в lwip:

void  lwip_start(void)
{
  tcpip_init( NULL, NULL );             /*Инициализация стека tcp/ip*/
  
  
  /*Create a new PPPoS interface*/
  ppp = pppapi_pppos_create(&ppp_netif,
       output_cb, status_cb, 0);
  
  ppp_set_default(ppp);
  
  
  err_t err = pppapi_connect(ppp,0);
  if (err == ERR_ALREADY)
  {
    printf("Connected successfully");
  }
  
  sys_thread_new("tcp_thread1", tcp_thread, NULL, 256, osPriorityNormal );  //задача tcp
  printf("Configuration end");
  
}

 

В задаче tcp_thread я ожидаю соединение

 

static void tcp_thread(void *arg)
{
  struct netconn *conn, *newconn;
  err_t err, accept_err;
  
  while (1)
  {
    conn = netconn_new(NETCONN_TCP);
    if(conn)
    {
      err = netconn_bind(conn, IP_ADDR_ANY, 4111);
      if (err != NULL)
      {
        netconn_listen(conn);
        
        DEBUG_MSG("netconn_accept....\n");
        osDelay(5);
        
        while(1)
        {
          accept_err = netconn_accept(conn, &newconn);
          if (accept_err == ERR_OK) 
          {
            DEBUG_MSG("connection established \n");
            HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0);
          }
        }        
      }
    }    
  }
}

 

Но когда с пк я пытаюсь установить соединение (использую hercules), в ответ приходят rst. Из netconn_accept, соответственно, не выходит. В чем проблема, не могу понять, буду очень благодарен, если кто-нибудь наставит на путь истинный.

 

P.S.

Данные пихаю в стек в отдельной задаче, используя функцию pppos_input_tcpip

 

void uart_rxTask(void const * argument)
{
  uint8_t u8=0, cnt=0, answer=0;
  uint8_t uart_buff[128]={0};
  Sim8xFlag_t SimFlag;
  
  
  for (;;)
  {
    if (pdPASS == xQueueReceive(xQueue_Uart, &u8, 1000/portTICK_RATE_MS))
    {
      if (PPP_Connect)
      {
        pppos_input_tcpip(ppp, &u8, 1);
        
        osDelay(1);
      }else /*Работа с AT-командами*/
      {
          //Разбор AT-команд
      }
    }
  }
}

 

 

 

 

 

 

 

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


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

Но когда с пк я пытаюсь установить соединение (использую hercules), в ответ приходят rst. Из netconn_accept, соответственно, не выходит. В чем проблема, не могу понять, буду очень благодарен, если кто-нибудь наставит на путь истинный.

 

Сокет, скорее всего, не открыт.

Под дебагером посмотрите все tcp syn. Если PPP настроен корректно, то увидите Ваше входяшее соединение с ПК. Если нет, копайтесь в PPP. Если соединение есть и сокет не открыт, то tcp сформирует rst, что Вы и видите. Поэтому, проверьте в tcp_thread, сформирован ли сокет.

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


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

Сокет, скорее всего, не открыт.

Под дебагером посмотрите все tcp syn. Если PPP настроен корректно, то увидите Ваше входяшее соединение с ПК. Если нет, копайтесь в PPP. Если соединение есть и сокет не открыт, то tcp сформирует rst, что Вы и видите. Поэтому, проверьте в tcp_thread, сформирован ли сокет.

 

Да, спасибо, что подсказали, сокет и правда был закрыт.

После того, как переписал немного код (косяк был в if), соединение открылось, но в Wireshark началась какая-то вакханалия: после подтверждения обменом syn, модем решил не останавливаться на достигнутом и стал друг за другом слать клиенту syn и совершенно игнорировать отправленный в ответ ask, в итоге я заметил, что функция netconn_listen не возвращает положенный ERR_OK. Пока буду разбираться с этим, спасибо за помощь.

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


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

Сокет создается, netconn_listen возвращает ERR_OK и программа в задаче tcp_thread заходит в netconn_accept и ожидает сообщение от mbox. Как я понимаю, данное сообщение должно появится при подключении, но когда я пытаюсь с пк установить соединение с модемом, повторяется та же история, о которой я писал выше: сервер клинит и на syn от клиента от начинает бесконечно повторять свой ответный syn+ack, что я вижу в wireshark. Может, кто-нибудь знает из-за чего вообще может быть такая реакция?

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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