10 #include "LibEndian.hpp"
11 #include "NetClientDhcp.hpp"
12 #include "NetNbns.hpp"
13 #include "NetRemoteConfiguration.hpp"
14 #include "NetUdpSocket.hpp"
16 LibLinkedList<NetUdpSocket> NetUdp::sSocketList;
19 void NetUdp::processFrame(NetDefs::FRAME& frame, NetDefs::UDP_HEADER& header,
int len) {
22 #if NET_CFG_USE_DHCP_CLIENT//
23 if (header.dstPort == NetDefs::UDP_PORT_DHCP_CLIENT) {
24 NetClientDhcp::processFrame(frame, *((NetDefs::DHCP_HEADER*) (((uint8_t*) &header) +
sizeof(header))), len -
sizeof(header));
27 #endif//NET_CFG_USE_DHCP_CLIENT
28 #if NET_CFG_USE_NBNS//
29 if (header.dstPort == NetDefs::UDP_PORT_NBNS) {
30 NetNbns::processFrame(frame, *((NetDefs::NBNS_HEADER*) (((uint8_t*) &header) +
sizeof(header))), len -
sizeof(header));
33 #endif//NET_CFG_USE_NBNS
34 #if NET_CFG_USE_REMOTE_CONFIGURATION//
35 if (header.dstPort == NET_CFG_REMOTE_CONFIGURATION_PORT) {
36 NetRemoteConfiguration::processFrame(frame, len -
sizeof(header));
39 #endif//NET_CFG_USE_REMOTE_CONFIGURATION
41 if (header.dstPort == 0) {
42 Net::freeFrame(frame);
44 else if ((socket = findMatchingSocket(header.dstPort)) == 0) {
45 Net::freeFrame(frame);
48 NetDefs::IP_ADDR srcIp = frame.types.ip.ipHeader.srcAddr;
49 NetDefs::UDP_PORT srcPort = header.srcPort;
51 NetUdpSocket::RX_PACKET* rxPkt = (NetUdpSocket::RX_PACKET*) Net::resizeFrameLeft(frame,
52 (((uint8_t*) &header +
sizeof(NetDefs::UDP_HEADER) - (uint8_t*) &frame)) -
sizeof(NetUdpSocket::PACKET_HEADER));
54 Net::freeFrame(frame);
57 rxPkt->hdr.ip = srcIp;
58 rxPkt->hdr.port = srcPort;
59 rxPkt->hdr.dataLen = len -
sizeof(NetDefs::UDP_HEADER);
60 if (!socket->mRxMsgBox.give(rxPkt, 0)) {
61 Net::freeFrame((NetDefs::FRAME&) rxPkt);
67 void NetUdp::putHeader(NetDefs::FRAME& frame,
const NetDefs::MAC_ADDR& macDst,
const NetDefs::IP_ADDR& dstAddr, uint16_t srcPort, uint16_t dstPort,
70 frame.types.udp.udpHeader.dstPort = dstPort;
71 frame.types.udp.udpHeader.srcPort = srcPort;
72 frame.types.udp.udpHeader.len =
sizeof(NetDefs::UDP_HEADER) + dataLen;
73 frame.types.udp.udpHeader.checkSum = 0;
75 swapHeader(frame.types.udp.udpHeader);
77 NetIp::putHeader(frame, macDst, dstAddr,
sizeof(NetDefs::UDP_HEADER) + dataLen, NetDefs::IP_PROTOCOL_UDP);
80 void NetUdp::flush(NetDefs::FRAME& frame,
int dataLen,
bool discardable) {
81 NetIp::flush(frame,
sizeof(NetDefs::UDP_HEADER) + dataLen, discardable);
84 void NetUdp::swapHeader(NetDefs::UDP_HEADER& header) {
85 header.srcPort = LibEndian::hwToBe(header.srcPort);
86 header.dstPort = LibEndian::hwToBe(header.dstPort);
87 header.len = LibEndian::hwToBe(header.len);
90 NetUdpSocket* NetUdp::findMatchingSocket(NetDefs::UDP_PORT port) {
92 for (NetUdpSocket* s = sSocketList.getFirst(); s != 0; s = s->getNext()) {
93 if (s->mLocalPort == port) {
102 void NetUdp::addSocket(NetUdpSocket& socket) {
104 sSocketList.insert(socket);
108 void NetUdp::removeSocket(NetUdpSocket& socket) {
110 sSocketList.remove(socket);