Формирование сырых 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 пакета?