реклама на сайте
подробности

 
 
> lwIP PPP netif и Ethernet netif HW/SW checksum, проблемы с аппаратным расчётом контрольной суммы
eisufu
сообщение Jul 23 2012, 05:14
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 33
Регистрация: 29-06-10
Пользователь №: 58 196



Создаю два интерфейса - один Ethernet (STM32F4x7 Ethernet controller настроен на hardware checksum), другой - PPP over serial. lwIP в lwipopts.h имеет настройки того, как будет считаться контрольная сумма: аппаратно или программно. Конечно, для PPP железо не считает контрольную сумму, интерфейс-то — "виртуальный". Попробовал следующее: везде в коде lwIP, где встречаются CHECKSUM_GEN_* (IP, TCP, UDP, ICMP) добавить код
Код
#if CHECKSUM_GEN_*
  <code>
#else
if ((netif->flags | NETIF_FLAG_POINTTOPOINT) != 0) {
  тот же самый <code>
}
#endif

но сгодилось это лишь для ICMP, TCP уже такое не позволит, так как в функции, содержащие код:
Код
#if CHECKSUM_GEN_*
  <code>
#endif
не передаётся netif *, для которого формируется пакет TCP. Да и вообще пришёл к выводу, что контрольную сумму надо считать централизованно для PPP (на камне есть периферия, которая быстро считает CRC), а для остальных netif - в зависимости от дефайнов CHECKSUM_GEN_*, зависящих от CHECKSUM_BY_HARDWARE.
Масса исходников — сходу не могу понять, где это "узкое место" где проходят все пакеты для каждого из IP, TCP, UDP, ICMP. Каково красивое решение?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
eisufu
сообщение Jul 23 2012, 11:47
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 33
Регистрация: 29-06-10
Пользователь №: 58 196



Сделал диспетчер задач (собственно, оформил FreeRTOS-овский как надо). Если фладить так:
Код
cat /dev/random | nc -u 172.16.0.100 22222
, даже не на открытый порт (например 22221), то падает (через 3-4 секунды с момента старта железки, когда флад идёт, либо во время работы железки, с момента запуска скрипта). Посмотрел в Wireshark — порядка 10к пакетов в секунду отправляется с машины (фреймы по 1514 байт).
Задача udp выгдялит так:
CODE
static
void udpTestTask(void * pvParameters) {
while (inet_setup == 0) {
vTaskDelay(1000 / portTICK_RATE_MS);
}
printf("udpTestTask started\r\n");
struct netconn * conn;
struct netbuf * buf;
err_t err;
(void)err;
conn = netconn_new(NETCONN_UDP);
netconn_bind(conn, IP_ADDR_ANY, 22222);
for (;;) {
err = netconn_recv(conn, &buf);
printf("rcvd length = %u\r\n", buf->p->tot_len);
netbuf_delete(buf);
}
}

lwIP настроен так:
CODE
/**
******************************************************************************
* @file lwipopts.h
* @author MCD Application Team
* @version V1.0.0
* @date 31-October-2011
* @brief lwIP Options Configuration.
* This file is based on Utilities\lwip_v1.3.2\src\include\lwip\opt.h
* and contains the lwIP configuration for the STM32F4x7 demonstration.
******************************************************************************
* @attention
*
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
*
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
******************************************************************************
*/

#ifndef __LWIPOPTS_H__
#define __LWIPOPTS_H__

/**
* SYS_LIGHTWEIGHT_PROT==1: if you want inter-task protection for certain
* critical regions during buffer allocation, deallocation and memory
* allocation and deallocation.
*/
#define SYS_LIGHTWEIGHT_PROT 1

#define ETHARP_TRUST_IP_MAC 0
#define IP_REASSEMBLY 1
#define IP_FRAG 0
#define ARP_QUEUEING 0

/**
* NO_SYS==1: Provides VERY minimal functionality. Otherwise,
* use lwIP facilities.
*/
#define NO_SYS 0

/* ---------- Memory options ---------- */
/* MEM_ALIGNMENT: should be set to the alignment of the CPU for which
lwIP is compiled. 4 byte alignment -> define MEM_ALIGNMENT to 4, 2
byte alignment -> define MEM_ALIGNMENT to 2. */
#define MEM_ALIGNMENT 4

/* MEM_SIZE: the size of the heap memory. If the application will send
a lot of data that needs to be copied, this should be set high. */
#define MEM_SIZE (4*1024)

/* MEMP_NUM_PBUF: the number of memp struct pbufs. If the application
sends a lot of data out of ROM (or other static memory), this
should be set high. */
#define MEMP_NUM_PBUF 8
/* MEMP_NUM_UDP_PCB: the number of UDP protocol control blocks. One
per active UDP "connection". */
#define MEMP_NUM_UDP_PCB 2
/* MEMP_NUM_TCP_PCB: the number of simulatenously active TCP
connections. */
#define MEMP_NUM_TCP_PCB 2
/* MEMP_NUM_TCP_PCB_LISTEN: the number of listening TCP
connections. */
#define MEMP_NUM_TCP_PCB_LISTEN 5
/* MEMP_NUM_TCP_SEG: the number of simultaneously queued TCP
segments. */
#define MEMP_NUM_TCP_SEG 16
/* MEMP_NUM_SYS_TIMEOUT: the number of simulateously active
timeouts. */
#define MEMP_NUM_SYS_TIMEOUT 7


/* ---------- Pbuf options ---------- */
/* PBUF_POOL_SIZE: the number of buffers in the pbuf pool. */
#define PBUF_POOL_SIZE 24

/* PBUF_POOL_BUFSIZE: the size of each pbuf in the pbuf pool. */
#define PBUF_POOL_BUFSIZE 512


/* ---------- TCP options ---------- */
#define LWIP_TCP 1
#define TCP_TTL 255

/* Controls if TCP should queue segments that arrive out of
order. Define to 0 if your device is low on memory. */
#define TCP_QUEUE_OOSEQ 1

/* TCP Maximum segment size. */
#define TCP_MSS (1500 - 40) /* TCP_MSS = (Ethernet MTU - IP header size - TCP header size) */

/* TCP sender buffer space (bytes). */
#define TCP_SND_BUF (5*TCP_MSS)

/* TCP_SND_QUEUELEN: TCP sender buffer space (pbufs). This must be at least
as much as (2 * TCP_SND_BUF/TCP_MSS) for things to work. */

#define TCP_SND_QUEUELEN (2* TCP_SND_BUF/TCP_MSS)

/* TCP receive window. */
#define TCP_WND (2*TCP_MSS)


/* ---------- ICMP options ---------- */
#define LWIP_ICMP 1


/* ---------- DHCP options ---------- */
/* Define LWIP_DHCP to 1 if you want DHCP configuration of
interfaces. DHCP is not implemented in lwIP 0.5.1, however, so
turning this on does currently not work. */
#define LWIP_DHCP 1


/* ---------- UDP options ---------- */
#define LWIP_UDP 1
#define UDP_TTL 255


/* ---------- Statistics options ---------- */
#define LWIP_STATS 0
#define LWIP_PROVIDE_ERRNO 1


/*
--------------------------------------
---------- Checksum options ----------
--------------------------------------
*/

/*
The STM32F4x7 allows computing and verifying the IP, UDP, TCP and ICMP checksums by hardware:
- To use this feature let the following define uncommented.
- To disable it and process by CPU comment the the checksum.
*/
#define CHECKSUM_BY_HARDWARE


#ifdef CHECKSUM_BY_HARDWARE
/* CHECKSUM_GEN_IP==0: Generate checksums by hardware for outgoing IP packets.*/
#define CHECKSUM_GEN_IP 0
/* CHECKSUM_GEN_UDP==0: Generate checksums by hardware for outgoing UDP packets.*/
#define CHECKSUM_GEN_UDP 0
/* CHECKSUM_GEN_TCP==0: Generate checksums by hardware for outgoing TCP packets.*/
#define CHECKSUM_GEN_TCP 0
/* CHECKSUM_CHECK_IP==0: Check checksums by hardware for incoming IP packets.*/
#define CHECKSUM_CHECK_IP 0
/* CHECKSUM_CHECK_UDP==0: Check checksums by hardware for incoming UDP packets.*/
#define CHECKSUM_CHECK_UDP 0
/* CHECKSUM_CHECK_TCP==0: Check checksums by hardware for incoming TCP packets.*/
#define CHECKSUM_CHECK_TCP 0
/* CHECKSUM_GEN_ICMP==0: Generate checksums by hardware for outgoing ICMP packets.*/
#define CHECKSUM_GEN_ICMP 0
#else
/* CHECKSUM_GEN_IP==1: Generate checksums in software for outgoing IP packets.*/
#define CHECKSUM_GEN_IP 1
/* CHECKSUM_GEN_UDP==1: Generate checksums in software for outgoing UDP packets.*/
#define CHECKSUM_GEN_UDP 1
/* CHECKSUM_GEN_TCP==1: Generate checksums in software for outgoing TCP packets.*/
#define CHECKSUM_GEN_TCP 1
/* CHECKSUM_CHECK_IP==1: Check checksums in software for incoming IP packets.*/
#define CHECKSUM_CHECK_IP 1
/* CHECKSUM_CHECK_UDP==1: Check checksums in software for incoming UDP packets.*/
#define CHECKSUM_CHECK_UDP 1
/* CHECKSUM_CHECK_TCP==1: Check checksums in software for incoming TCP packets.*/
#define CHECKSUM_CHECK_TCP 1
/* CHECKSUM_GEN_ICMP==1: Check checksums in software for outgoing ICMP packets.*/
#define CHECKSUM_GEN_ICMP 1
#endif


/*
----------------------------------------------
---------- Sequential layer options ----------
----------------------------------------------
*/
/**
* LWIP_NETCONN==1: Enable Netconn API (require to use api_lib.c)
*/
#define LWIP_NETCONN 1

/*
------------------------------------
---------- Socket options ----------
------------------------------------
*/
/**
* LWIP_SOCKET==1: Enable Socket API (require to use sockets.c)
*/
#define LWIP_SOCKET 0

/*
-----------------------------------
---------- DEBUG options ----------
-----------------------------------
*/

#define LWIP_DEBUG 1


/*
---------------------------------
---------- OS options ----------
---------------------------------
*/

#define LWIP_DNS 1
#define LWIP_ARP 1

/*#define IP_FORWARD 0*/

//#define MEM_LIBC_MALLOC 1

#define TCPIP_THREAD_STACKSIZE configMINIMAL_STACK_SIZE
#define TCPIP_MBOX_SIZE 5
#define DEFAULT_UDP_RECVMBOX_SIZE 2024
#define DEFAULT_TCP_RECVMBOX_SIZE 2024
#define DEFAULT_ACCEPTMBOX_SIZE 2024
#define DEFAULT_THREAD_STACKSIZE configMINIMAL_STACK_SIZE
#define TCPIP_THREAD_PRIO (configMAX_PRIORITIES - 3)

#define TCP_DEBUG LWIP_DBG_ON

#define LWIP_COMPAT_MUTEX 1
#define LWIP_SO_SNDTIMEO 0
#define LWIP_SO_RCVTIMEO 1
#define PPP_SUPPORT 1
#define PPPOE_SUPPORT 0
#define PPPOS_SUPPORT 1
#define PAP_SUPPORT 1
#define CHAP_SUPPORT 1
#define VJ_SUPPORT 1
#define MD5_SUPPORT 1
#define PPP_THREAD_PRIO (configMAX_PRIORITIES - 2)
#define PPP_THREAD_STACKSIZE configMINIMAL_STACK_SIZE
#define PPP_DEBUG LWIP_DBG_ON

#endif /* __LWIPOPTS_H__ */

/******************* © COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/

Что ж ей не хватает? Порекомендуйте пожалуйста.
Вот лог:
CODE
0
memory gap = 44952
task count = 7

udpTestTask 0 0%
IDLE 0 0%
counterTask 0 0%
blinkTask 0 0%
Eth_if 12 12%
tcpip_thread 15 15%
Tmr Svc 11 11%

udpTestTask started
1
memory gap = 44952
task count = 7

counterTask 431 <1%
IDLE 760839 76%
tcpip_thread 102363 10%
blinkTask 15 <1%
Eth_if 133518 13%
Tmr Svc 24 <1%
udpTestTask 93 <1%

2
memory gap = 44952
task count = 7

counterTask 987 <1%
IDLE 1215548 61%
tcpip_thread 336998 16%
blinkTask 22 <1%
Eth_if 437917 21%
Tmr Svc 24 <1%
udpTestTask 93 <1%

3
memory gap = 44952
task count = 7

counterTask 1560 <1%
IDLE 1679672 56%
tcpip_thread 568709 19%
blinkTask 29 <1%
Eth_if 735892 24%
Tmr Svc 24 <1%
udpTestTask 93 <1%

4
memory gap = 44952
task count = 7
assertion failed

Выдаёт задачка:
CODE
static
void counterTask(void * pvParameters) {
(void) pvParameters;
for (int i = 0;; ++i) {
printf("%d\r\n", i);
printf("memory gap = %u\r\n", xPortGetFreeHeapSize());
printf("task count = %u\r\n", uxTaskGetNumberOfTasks());
static signed char taskInfoBuf[48 * 8];
vTaskGetRunTimeStats(taskInfoBuf + 0);
printf("%s\r\n", taskInfoBuf);
vTaskDelay(1000 / portTICK_RATE_MS);
if (i == INT_MAX) {
i = 0;
}
}
}


Мало того, что не отвечает на все пакеты, так ещё и assertion failed без пояснений =(.

*во FreeRTOS используется heap_3.c

Сообщение отредактировал eisufu - Jul 23 2012, 11:45
Go to the top of the page
 
+Quote Post
scifi
сообщение Jul 23 2012, 11:56
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(eisufu @ Jul 23 2012, 15:47) *
Мало того, что не отвечает на все пакеты, так ещё и assertion failed без пояснений =(.

Дык радоваться надо, что assertion failed! С этого места и надо начинать копать: какое условие нарушилось и почему. Постепенно станете экспертом по lwip и будете такие баги отлавливать за 5 минут :-)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- eisufu   lwIP PPP netif и Ethernet netif HW/SW checksum   Jul 23 2012, 05:14
- - scifi   Насколько я понимаю, надо эмулировать поведение ап...   Jul 23 2012, 06:13
- - eisufu   Получается, что стоит отказаться от аппаратного ра...   Jul 23 2012, 06:26
|- - scifi   Цитата(eisufu @ Jul 23 2012, 10:26) Получ...   Jul 23 2012, 06:47
- - eisufu   Просто в эту железку (потом будет STM32F417) ещё S...   Jul 23 2012, 07:12
|- - scifi   Цитата(eisufu @ Jul 23 2012, 11:12) Прост...   Jul 23 2012, 07:18
- - eisufu   У железки аппаратная поддержка SSL. Померю загрузк...   Jul 23 2012, 07:48
|- - scifi   Цитата(eisufu @ Jul 23 2012, 11:48) Помер...   Jul 23 2012, 07:58
- - eisufu   Ладно). Что-то я видать совсем обнаглел. Буду погр...   Jul 23 2012, 12:38
- - eisufu   Утверждение не выполнялось в pbuf_free — нельзя пе...   Jul 24 2012, 05:57
|- - scifi   Цитата(eisufu @ Jul 24 2012, 09:57) Утвер...   Jul 24 2012, 06:14
- - eisufu   иметь бы опыт или требования, наводящие на правиль...   Jul 24 2012, 09:36
|- - VslavX   Цитата(eisufu @ Jul 24 2012, 12:36) что-т...   Jul 24 2012, 18:52
|- - Rst7   QUOTE (VslavX @ Jul 24 2012, 21:52) Малов...   Jul 24 2012, 19:00
||- - VslavX   Цитата(Rst7 @ Jul 24 2012, 22:00) Я смотр...   Jul 24 2012, 19:16
|- - scifi   Цитата(VslavX @ Jul 24 2012, 22:52) Сегод...   Jul 24 2012, 19:04
|- - eisufu   Цитата(VslavX @ Jul 25 2012, 00:52) iperf...   Jul 25 2012, 04:35
|- - VslavX   Цитата(eisufu @ Jul 25 2012, 07:35) Сложн...   Jul 25 2012, 04:43
|- - eisufu   Цитата(VslavX @ Jul 25 2012, 10:43) Реали...   Jul 25 2012, 05:52
|- - VslavX   Цитата(eisufu @ Jul 25 2012, 08:52) Какие...   Jul 25 2012, 07:46
|- - eisufu   Цитата(VslavX @ Jul 25 2012, 13:46) решил...   Jul 25 2012, 09:52
- - scifi   По скорости ничего не смогу посоветовать, так как ...   Jul 24 2012, 09:58
- - eisufu   Спасибо   Jul 24 2012, 13:18
- - Rst7   QUOTE но критично на свой код посмотреть заставили...   Jul 24 2012, 19:18


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 3rd August 2025 - 11:48
Рейтинг@Mail.ru


Страница сгенерированна за 0.01436 секунд с 7
ELECTRONIX ©2004-2016