ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
29 марта
914664
misyachniy (08.04.2019 08:43, просмотров: 492)
Формирование сырых UDP пакетов. Допиливаю "рыбу" под свои нужды. Рыба = Xilinx/Eclopse + LwIp. В ней есть пример ARP и TFTP. На выходе буфер готовый для пересылки в PHY. int tftp_make_ack(tftp_session_t* session, u8 *packet, u32 len, u16 block_num){ // Payload eth_set_u16(packet, (ETH_FRAME_UDP_DATA_OFF + 0), TFTP_ACK); eth_set_u16(packet, (ETH_FRAME_UDP_DATA_OFF + 2), block_num); // Ethernet eth_swap_macs(packet); // IPv4 eth_swap_ips(packet); eth_set_u16(packet, ETH_FRAME_IPV4_TOTAL_LENGTH_OFF, (ETH_FRAME_IPV4_HEADER_SIZE + UDP_HEADER_SIZE + TFTP_ACK_SIZE)); eth_set_ipv4_sc(packet); // UDP udp_swap_ports(packet); eth_set_u16(packet, ETH_FRAME_UDP_LENGTH_OFF, (UDP_HEADER_SIZE + TFTP_ACK_SIZE)); eth_set_u16(packet, ETH_FRAME_UDP_CS_OFF, 0); return (ETH_FRAME_HEADER_SIZE + ETH_FRAME_IPV4_HEADER_SIZE + UDP_HEADER_SIZE + TFTP_ACK_SIZE); Я проверил, передачу и разбор моих UDP пакетов из ПК. По аналогии с tftp_make_ack формирую свой ответ. WireShark показывает, что пакеты приходят но видно явный сдвиг байт. Поискал примеры LwIp, но в них формирование идет без MAC и заканчивается функцией sendto(). Глянул первоисточники на 8-ми дюймовых дискетах ;-) https://unix.super …m/Net2/newsrc/netinet/ И пример https://gist.githu …d/909a883c114eb58ed49f Тот же sendto() Я бы использовал sendto(), но в BSP для исходного примера нет такой функции. Встречал ли кто пример формирования полного raw UDP пакета?