// ------------------------------------------------------------------------- // udp.c // // 29.12.2003, J. Ahrensfeld // // ------------------------------------------------------------------------- #include "ethernet.h" #include "ipv4.h" #include "udp.h" #include "string.h" // ------------------------------------------------------------------------- // Testing uint8_t *UDP_create(packet_t *pPacket, uint8_t *inet_addr_src, uint16_t port_src, uint8_t *inet_addr_dst, uint16_t port_dst, void const *pUDP_payload, uint16_t len) { uint16_t sum; UDP *pUDP; UDPPP pseudo_hdr; uint8_t *pData; pUDP = (UDP*)IPV4_create(pPacket, IP_TYPE_UDP, sizeof(UDP)+len, inet_addr_src, inet_addr_dst); // Fill UDP header pUDP->src_port = port_src; pUDP->dst_port = port_dst; pUDP->len = len + sizeof(UDP); pUDP->chksum = 0x0000; // Fill pseudo header memcpy(&pseudo_hdr.inet_addr_src, inet_addr_src, 4); memcpy(&pseudo_hdr.inet_addr_dst, inet_addr_dst, 4); pseudo_hdr.proto = IP_TYPE_UDP; pseudo_hdr.len = len + sizeof(UDP); // Calculate checksums pUDP->chksum = ~IPv4ChkSum((uint16_t*)&pseudo_hdr, pUDP->chksum, sizeof(UDPPP)); // Commit header pData = (uint8_t*)Eth_pkt_append(pPacket, sizeof(UDP)); // Commit data if (pUDP_payload) { memcpy(pData, pUDP_payload, len); return Eth_pkt_append(pPacket, len); } return pData; } void UDP_append(packet_t *pPacket, void const *pData, uint16_t len) { // Commit data if (pData) { memcpy(pPacket->pData, pData, len); Eth_pkt_append(pPacket, len); } }