1
0
Fork 0

handle ArtIpProg packets

This commit is contained in:
Kevin Matz 2023-05-22 10:16:20 -04:00
parent 47ac0220b4
commit b6300cf80b
2 changed files with 98 additions and 3 deletions

View File

@ -34,6 +34,34 @@ Node::Node()
}
/**
* @brief Node::rxArtIpProg
* @param packet
*/
void Node::rxArtIpProg(std::shared_ptr<ArtIpProg> packet)
{
auto data_opt = packet->data<ipprog_data>();
if (!data_opt.has_value())
return;
auto data = data_opt.value();
if (data->command.enable_programming)
{
if (data->command.enable_dhcp)
setDhcpEnable(true);
else
{
setDhcpEnable(false);
if (data->command.program_ip)
setDeviceIP(data->ip_address);
if (data->command.program_netmask)
setDeviceSubnetMask(data->subnet_mask);
}
}
txArtIpProgReply(packet->originAddress);
}
/**
* @brief Node::rxArtAddress
* @param packet
@ -56,4 +84,63 @@ void Node::rxArtAddress(std::shared_ptr<ArtAddress> packet)
txArtPollReply();
}
/**
* @brief Node::txArtIpProgReply
* @param dest
* @param reply
*/
void Node::txArtIpProgReply(const uint32_t dest, std::shared_ptr<ipprogreply_data> reply)
{
if (!reply)
reply = std::make_shared<ipprogreply_data>();
reply->ip_address = deviceIp().address.ipv4.value;
reply->subnet_mask = deviceSubnetMask();
reply->status.dhcp_enabled = deviceHasDHCP();
auto packet = std::make_shared<ArtIpProgReply>(reply);
auto controller = ipAddress();
controller.address.ipv4.value = dest;
send(packet, controller);
}
/**
* @brief Node::setDhcpEnable
* @param state
*
* The default implimentation is to ignore the request.
* \note Platform aware nodes may reimpliment to accept the DHCP state.
*/
void Node::setDhcpEnable(const bool state)
{
(void)state;
}
/**
* @brief Node::setDeviceIP
* @param value
*
* The default implimentation is to ignore the request.
* \note Platform aware nodes may reimpliment to accept the IP address change.
*/
void Node::setDeviceIP(const uint32_t value)
{
(void)value;
}
/**
* @brief Node::setDeviceSubnetMask
* @param value
*
* The default implimentation is to ignore the request.
* \note Platform aware nodes may reimpliment to accept the Subnet Mask change.
*/
void Node::setDeviceSubnetMask(const uint32_t value)
{
(void)value;
}
} // namespace ARTNET

View File

@ -36,13 +36,21 @@ class Node
: public Device
{
public:
explicit Node();
explicit Node();
protected:
virtual void rxArtAddress(std::shared_ptr<ArtAddress>) override;
virtual void rxArtIpProg(std::shared_ptr<ArtIpProg>) override;
virtual void rxArtAddress(std::shared_ptr<ArtAddress>) override;
virtual void txArtIpProgReply(const uint32_t dest, std::shared_ptr<ipprogreply_data> = nullptr);
// OSI layer 3
virtual void setDhcpEnable(const bool);
virtual void setDeviceIP(const uint32_t);
virtual void setDeviceSubnetMask(const uint32_t);
private:
std::vector<Port*> _ports;
std::vector<Port*> _ports;
};
} // namespace ARTNET