-added UdpAppend() git-svn-id: http://moon:8086/svn/mips@219 a8ebac50-d88d-4704-bea3-6648445a41b3
60 lines
1.5 KiB
C
60 lines
1.5 KiB
C
// -------------------------------------------------------------------------
|
|
// 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);
|
|
}
|
|
} |