6 #include "NetUdpSocket.hpp"
11 uint16_t NetUdpSocket::sAutomaticPort = 0xC000;
13 NetUdpSocket::NetUdpSocket() {
15 NetUdp::addSocket(*
this);
18 NetUdpSocket::~NetUdpSocket() {
19 NetUdp::removeSocket(*
this);
21 while (mRxMsgBox.take(pkt, 0)) {
26 void NetUdpSocket::open(NetDefs::UDP_PORT localPort) {
28 mLocalPort = sAutomaticPort++;
29 if (sAutomaticPort == 0) {
30 sAutomaticPort = 0xC000;
34 mLocalPort = localPort;
38 void NetUdpSocket::close() {
42 NetUdpSocket::TX_PACKET* NetUdpSocket::allocTxPacket(
size_t maxDataLen) {
43 if ((
sizeof(NetDefs::MAC_HEADER) +
sizeof(NetDefs::IP_HEADER) +
sizeof(NetDefs::UDP_HEADER) + maxDataLen) > NetDefs::MAX_FRAME_LEN) {
46 NetDefs::FRAME* frame = Net::allocFrame(
sizeof(NetDefs::MAC_HEADER) +
sizeof(NetDefs::IP_HEADER) +
sizeof(NetDefs::UDP_HEADER) + maxDataLen);
48 TX_PACKET* pkt = (TX_PACKET*) frame;
50 pkt->data = frame->types.udp.data;
56 void NetUdpSocket::discardTxPacket(TX_PACKET* pkt) {
57 Net::freeFrame(*(NetDefs::FRAME*) pkt);
60 bool NetUdpSocket::sendPacket(TX_PACKET& pkt,
size_t dataLen) {
61 NetDefs::MAC_ADDR macAddr;
62 NetDefs::IP_ADDR dstIpAddr = pkt.hdr.ip;
63 if (!NetArp::resolve(dstIpAddr, macAddr)) {
64 Net::freeFrame((NetDefs::FRAME&) pkt);
67 NetDefs::UDP_PORT dstPort = pkt.hdr.port;
68 NetUdp::putHeader((NetDefs::FRAME&) pkt, macAddr, dstIpAddr, mLocalPort, dstPort, dataLen);
69 NetUdp::flush((NetDefs::FRAME&) pkt, dataLen,
true);
74 NetUdpSocket::RX_PACKET* NetUdpSocket::recvPacket(
Rtos::TICK timeout) {
76 if (!mRxMsgBox.take(pkt, timeout)) {
82 void NetUdpSocket::discardRxPacket(RX_PACKET* pkt) {
83 Net::freeFrame((NetDefs::FRAME&) *pkt);