embkernel
 All Classes Functions Variables Typedefs Groups Pages
NetUdpSocket.cpp
1 //------------------------------------------------------------------------------
2 //This file is part of embKernel.
3 //See license.txt for the full license governing this code.
4 //------------------------------------------------------------------------------
5 
6 #include "NetUdpSocket.hpp"
7 #include "Net.hpp"
8 #include "NetUdp.hpp"
9 #include "NetArp.hpp"
10 
11 uint16_t NetUdpSocket::sAutomaticPort = 0xC000;
12 
13 NetUdpSocket::NetUdpSocket() {
14  mLocalPort = 0;
15  NetUdp::addSocket(*this);
16 }
17 
18 NetUdpSocket::~NetUdpSocket() {
19  NetUdp::removeSocket(*this);
20  RX_PACKET* pkt;
21  while (mRxMsgBox.take(pkt, 0)) {
22  discardRxPacket(pkt);
23  }
24 }
25 
26 void NetUdpSocket::open(NetDefs::UDP_PORT localPort) {
27  if (localPort == 0) {
28  mLocalPort = sAutomaticPort++;
29  if (sAutomaticPort == 0) {
30  sAutomaticPort = 0xC000;
31  }
32  }
33  else {
34  mLocalPort = localPort;
35  }
36 }
37 
38 void NetUdpSocket::close() {
39  mLocalPort = 0;
40 }
41 
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) {
44  return 0;
45  }
46  NetDefs::FRAME* frame = Net::allocFrame(sizeof(NetDefs::MAC_HEADER) + sizeof(NetDefs::IP_HEADER) + sizeof(NetDefs::UDP_HEADER) + maxDataLen);
47 
48  TX_PACKET* pkt = (TX_PACKET*) frame;
49  if (pkt) {
50  pkt->data = frame->types.udp.data;
51  }
52 
53  return pkt;
54 }
55 
56 void NetUdpSocket::discardTxPacket(TX_PACKET* pkt) {
57  Net::freeFrame(*(NetDefs::FRAME*) pkt);
58 }
59 
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);
65  return false;
66  }
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);
70 
71  return true;
72 }
73 
74 NetUdpSocket::RX_PACKET* NetUdpSocket::recvPacket(Rtos::TICK timeout) {
75  RX_PACKET* pkt;
76  if (!mRxMsgBox.take(pkt, timeout)) {
77  return 0;
78  }
79  return pkt;
80 }
81 
82 void NetUdpSocket::discardRxPacket(RX_PACKET* pkt) {
83  Net::freeFrame((NetDefs::FRAME&) *pkt);
84 }