Добро пожаловать в единственный репозиторий picoTCP.
picoTCP — это небольшой модульный стек TCP/IP, предназначенный для встраиваемых систем и Интернета вещей. Его активно разрабатывает компания Altran Intelligent Systems .
Этот код выпущен на условиях GNU GPL v2 и GNU GPL v3. Некоторые права защищены. Другие лицензии могут применяться по усмотрению правообладателей.
Узнайте, как использовать picoTCP в своем проекте, прочитав руководство по началу работы на нашей вики GitHub.
Для получения дополнительной информации отправьте нам электронное письмо или свяжитесь с нами в Twitter, Facebook или Reddit.
Хотите узнать о качестве кода picoTCP? Проверьте наш рейтинг TiCS
Функциональные тесты: - Модульные тесты: - Соответствие RFC: - Качество TICS: Coverity Scan Статус сборки:
Благодаря простоте интерфейсов усилия по портированию на новые платформы и ОС сводятся к минимуму. Для справки: портирование на новую платформу можно выполнить за 3 дня или меньше, на новую ОС — за один день, а если вы действительно сходите с ума, вы можете выполнить первоначальный порт за один вечер. Разные платформы означают разные компиляторы, поэтому мы постоянно компилируем наш стек из нескольких из них. В следующем списке показаны некоторые из поддерживаемых в настоящее время платформ, драйверов устройств и компиляторов.
Платформы, на которых работает picoTCP : серия ARM Cortex-M (ST Micro STM, NXP LPC, TI Stellaris, Freescale K64F), серия ARM ARM9 (ST Micro STR9), Texas Instruments (MSP430), Microchip (PIC24, PIC32), Atmel ( AVR 8 бит), Linux (пространство пользователя (TUN/TAP), пространство ядра), Windows (пространство пользователя (TAP))
Сетевые устройства, с которыми picoTCP работал : BCM43362 (IEEE 802.11), MRF24WG (IEEE 802.11), LPC Ethernet ENET/EMAC (IEEE 802.3), Stellaris Ethernet (IEEE 802.3), STM32 Ethernet (IEEE 802.3), Wiznet W5100 (IEEE 802.3), USB CDC-ECM (CDC1.2), PPP, виртуальные драйверы (TUN/TAP, VDE, Libpcap)
(RT)Операционные системы picoTCP интегрирован в : No OS / Bare Metal, FreeRTOS, mbed-RTOS, Frosted, linux/POSIX, MS DOS, MS Windows.
Библиотеки picoTCP интегрированы с : wolfSSL, mbedTLS, библиотекой Mongoose RESTful, MicroPython.
Компиляторы picoTCP компилируется под : GCC, Clang, TCC, ARM-RCVT, IAR, XC-16, XC-32, MSP-GCC, AVR-GCC.
К сожалению, мы не можем опубликовать весь код, в том числе потому, что некоторые части зависят от кода или двоичных файлов, несовместимых с GPL, некоторые части были разработаны по коммерческому контракту, а некоторые состоят из очень грубого кода для проверки концепции. Если вы хотите узнать больше о доступности по коммерческой лицензии или о возможности использования наших экспертных услуг для портирования или разработки драйверов, свяжитесь с нами по адресу [email protected].
Вашего фаворита нет в списке? Посетите вики для получения информации и примеров переноса picoTCP на новую платформу!
Функции разрабатываются в виде модулей в picoTCP, что позволяет вам выбирать функции, которые вам нужны в вашем приложении. В результате получается минимально возможный стек, который остается совместимым с интернет-стандартами. На схеме ниже представлен обзор всех реализованных протоколов.
В этом примере используется Ubuntu 14.04. Он работает и в других дистрибутивах Linux, хотя вам может потребоваться изменить имена некоторых пакетов. Дополнительную информацию см. в разделе Настройка среды.
sudo apt-get install git check vde2 libvdeplug2-dev libpcap0.8-dev openvpn wireshark
git clone https://github.com/tass-belgium/picotcp
cd picotcp
make TAP=1
cd ..
Затем создайте новый каталог, например example
, и создайте файл со следующим содержимым: //: # (Приведенный ниже код пропускается через наш CI — пожалуйста, оставьте комментарии экстрактора кода нетронутыми!) //: # (запуск экстрактора кода)
#include
#include
#include
#include
#include
#define NUM_PING 10
static int finished = 0 ;
/* gets called when the ping receives a reply, or encounters a problem */
void cb_ping ( struct pico_icmp4_stats * s )
{
char host [ 30 ];
pico_ipv4_to_string ( host , s -> dst . addr );
if ( s -> err == 0 ) {
/* if all is well, print some pretty info */
printf ( "%lu bytes from %s: icmp_req=%lu ttl=%lu time=%lu msn" , s -> size ,
host , s -> seq , s -> ttl , ( long unsigned int ) s -> time );
if ( s -> seq >= NUM_PING )
finished = 1 ;
} else {
/* if something went wrong, print it and signal we want to stop */
printf ( "PING %lu to %s: Error %dn" , s -> seq , host , s -> err );
finished = 1 ;
}
}
int main ( void ){
int id ;
struct pico_ip4 ipaddr , netmask ;
struct pico_device * dev ;
/* initialise the stack. Super important if you don't want ugly stuff like
* segfaults and such! */
pico_stack_init ();
/* create the tap device */
dev = pico_tap_create ( "tap0" );
if (! dev )
return -1 ;
/* assign the IP address to the tap interface */
pico_string_to_ipv4 ( "192.168.5.4" , & ipaddr . addr );
pico_string_to_ipv4 ( "255.255.255.0" , & netmask . addr );
pico_ipv4_link_add ( dev , ipaddr , netmask );
printf ( "starting pingn" );
id = pico_icmp4_ping ( "192.168.5.5" , NUM_PING , 1000 , 10000 , 64 , cb_ping );
if ( id == -1 )
return -1 ;
/* keep running stack ticks to have picoTCP do its network magic. Note that
* you can do other stuff here as well, or sleep a little. This will impact
* your network performance, but everything should keep working (provided
* you don't go overboard with the delays). */
while ( finished != 1 )
{
usleep ( 1000 );
pico_stack_tick ();
}
printf ( "finished !n" );
return 0 ;
}
Теперь мы можем скомпилировать это и связать, запустив
gcc -c -o main.o -I../picotcp/build/include main.c
gcc -o main.elf main.o ../picotcp/build/lib/libpicotcp.a
Далее мы создадим постоянное перехватывающее устройство — виртуальный сетевой порт. Вам не нужно повторять это каждый раз, устройство будет существовать до тех пор, пока вы не перезагрузитесь, или пока вы не зайдете sudo tunctl -d tap0
sudo tunctl -u < username >
sudo ifconfig tap0 192.168.5.5
Теперь вы сможете запустить ./main.elf
и увидеть вывод, например
Protocol ethernet registered (layer: 2).
Protocol ipv4 registered (layer: 3).
Protocol ipv6 registered (layer: 3).
Protocol icmp4 registered (layer: 4).
Protocol icmp6 registered (layer: 4).
Protocol igmp registered (layer: 4).
Protocol udp registered (layer: 4).
Protocol tcp registered (layer: 4).
Device tap0 created.
Assigned ipv4 192.168.5.4 to device tap0
starting ping
64 bytes from 192.168.5.5: icmp_req=1 ttl=64 time=5 ms
64 bytes from 192.168.5.5: icmp_req=2 ttl=64 time=0 ms
64 bytes from 192.168.5.5: icmp_req=3 ttl=64 time=0 ms
64 bytes from 192.168.5.5: icmp_req=4 ttl=64 time=0 ms
64 bytes from 192.168.5.5: icmp_req=5 ttl=64 time=0 ms
64 bytes from 192.168.5.5: icmp_req=6 ttl=64 time=0 ms
64 bytes from 192.168.5.5: icmp_req=7 ttl=64 time=0 ms
64 bytes from 192.168.5.5: icmp_req=8 ttl=64 time=0 ms
64 bytes from 192.168.5.5: icmp_req=9 ttl=64 time=0 ms
64 bytes from 192.168.5.5: icmp_req=10 ttl=64 time=0 ms
finished !
Пока приложение работает, вы также можете запустить
ping 192.168.5.4
для отправки пингов в другом направлении.
Запустите Wireshark и проверьте интерфейс Tap0. Затем снова запустите ./main.elf
и посмотрите, что произойдет. Вы должны увидеть запрос ARP от picoTCP к Linux и ответ. После этого вы должны увидеть пинг-запросы и ответы, идущие туда и обратно.
Обратите внимание: иногда вы можете увидеть множество других вещей, запросы маршрутизатора IPv6, различные широковещательные передачи, mDNS, DNS-SD и т. д. Это происходит, когда ваш Linux замечает, что новый сетевой интерфейс включен, и начинает выполнять всевозможные открытия. При использовании постоянного устройства TAP это обычно происходит только при первом запуске приложения. Запустите новый захват Wireshark и запустите приложение снова, теперь оно должно быть намного чище.
Теперь вы можете внести некоторые изменения в файл main.c
и немного поэкспериментировать! Сохраняйте статистику ваших пингов (максимальное, минимальное, среднее время). Откройте сокет UDP, отправьте что-нибудь в экземпляр netcat на вашем Linux. Или создайте элементарный сканер портов и посмотрите, какие порты открыты на вашем компьютере.
Это всего лишь очень краткий обзор, дополнительную информацию можно найти в нашей вики.
Авторы очень приветствуются. Сообщите об ошибке, предложите способ улучшить нашу документацию или напишите новый код.
Однако обратите внимание: прежде чем принять ваш код, мы попросим вас подписать наше Лицензионное соглашение для участников. Ваш код остается под вашими авторскими правами и всегда будет доступен под лицензиями GPLv2 и GPLv3. Однако этот CLA позволяет нам использовать picoTCP (включая код от внешних участников, таких как вы) по другим лицензиям, включая нашу коммерческую лицензию. Выполняя коммерческие проекты, мы можем продолжать инвестировать в качество и возможности picoTCP.