embkernel
 All Classes Functions Variables Typedefs Groups Pages
NetRemoteConfiguration.cpp
1 //------------------------------------------------------------------------------
2 //This file is part of embKernel.
3 //See license.txt for the full license governing this code.
4 //------------------------------------------------------------------------------
5 
6 #include "NetRemoteConfiguration.hpp"
7 #include "Net.hpp"
8 #include "NetUdp.hpp"
9 #include "NetCfg.hpp"
10 
11 void NetRemoteConfiguration::processFrame(NetDefs::FRAME& frame, int len) {
12  PKT* pkt = (PKT*) frame.types.udp.data;
13 
14  if ((len < (int) sizeof(HEADER)) || ((pkt->generic.hdr.macAddr != NetDefs::MAC_BROADCAST) && (pkt->generic.hdr.macAddr != Net::sMacAddr))
15  || (pkt->generic.hdr.key != KEY)) {
16  Net::freeFrame(frame);
17  return;
18  }
19 
20  switch (pkt->generic.hdr.cmd) {
21  case READ_CONFIG: {
22  int8_t id = pkt->generic.hdr.id;
23  NetDefs::MAC_ADDR remoteMacAddr = frame.types.mac.macHeader.srcAddr;
24  NetDefs::IP_ADDR remoteIpAddr = frame.types.ip.ipHeader.srcAddr;
25  uint16_t remotePort = frame.types.udp.udpHeader.srcPort;
26  Net::freeFrame(frame);
27 
28  NetDefs::FRAME * sendFrame = Net::allocFrame(
29  sizeof(NetDefs::MAC_HEADER) + sizeof(NetDefs::IP_HEADER) + sizeof(NetDefs::UDP_HEADER) + sizeof(HEADER) + sizeof(NetDefs::NET_CONFIG));
30  if (!sendFrame) {
31  return;
32  }
33  PKT* sendPkt = (PKT*) sendFrame->types.udp.data;
34  sendPkt->writeConfig.hdr.cmd = READ_CONFIG_REPLY;
35  sendPkt->writeConfig.hdr.id = id;
36  sendPkt->generic.hdr.macAddr = Net::sMacAddr;
37  sendPkt->writeConfig.hdr.key = KEY;
38  sendPkt->writeConfig.hdr.len = sizeof(NetDefs::NET_CONFIG);
39  sendPkt->writeConfig.config = Net::sConfig;
40  NetUdp::putHeader(*sendFrame, remoteMacAddr, remoteIpAddr, NET_CFG_REMOTE_CONFIGURATION_PORT, remotePort,
41  sizeof(HEADER) + sizeof(NetDefs::NET_CONFIG));
42  NetUdp::flush(*sendFrame, sizeof(HEADER) + sizeof(NetDefs::NET_CONFIG), true);
43  break;
44  }
45  case WRITE_CONFIG: {
46  pkt->generic.hdr.cmd = WRITE_CONFIG_REPLY;
47  Net::storeConfig(pkt->writeConfig.config);
48  Net::sConfig = pkt->writeConfig.config;
49  sendReply(frame, pkt);
50  break;
51  }
52  case WRITE_MAC: {
53  pkt->generic.hdr.cmd = WRITE_MAC_REPLY;
54  Net::storeMac(pkt->writeMac.macAddr);
55  Net::sMacAddr = pkt->writeMac.macAddr;
56  sendReply(frame, pkt);
57  break;
58  }
59  default:
60  Net::freeFrame(frame);
61  }
62 }
63 
64 void NetRemoteConfiguration::sendReply(NetDefs::FRAME& frame, PKT* pkt) {
65  pkt->generic.hdr.macAddr = Net::sMacAddr;
66  pkt->generic.hdr.len = 0;
67  NetUdp::putHeader(frame, frame.types.mac.macHeader.srcAddr, frame.types.ip.ipHeader.srcAddr, NET_CFG_REMOTE_CONFIGURATION_PORT,
68  frame.types.udp.udpHeader.srcPort, sizeof(HEADER));
69  NetUdp::flush(frame, sizeof(HEADER), true);
70 }