1 #pragma once
2 
3 #include "types.hpp"
4 #include <string>
5 // IPMI commands for Transport net functions.
6 enum ipmi_netfn_storage_cmds
7 {
8     // Get capability bits
9     IPMI_CMD_SET_LAN = 0x01,
10     IPMI_CMD_GET_LAN = 0x02,
11 };
12 
13 // Command specific completion codes
14 enum ipmi_transport_return_codes
15 {
16     IPMI_CC_PARM_NOT_SUPPORTED = 0x80,
17 };
18 
19 // Parameters
20 static const int LAN_PARM_INPROGRESS  = 0;
21 static const int LAN_PARM_AUTHSUPPORT = 1;
22 static const int LAN_PARM_AUTHENABLES = 2;
23 static const int LAN_PARM_IP          = 3;
24 static const int LAN_PARM_IPSRC       = 4;
25 static const int LAN_PARM_MAC         = 5;
26 static const int LAN_PARM_SUBNET      = 6;
27 static const int LAN_PARM_GATEWAY     = 12;
28 static const int LAN_PARM_VLAN        = 20;
29 static const int CIPHER_SUITE_COUNT   = 22;
30 static const int CIPHER_SUITE_ENTRIES = 23;
31 
32 constexpr uint8_t SET_COMPLETE = 0;
33 constexpr uint8_t SET_IN_PROGRESS = 1;
34 constexpr uint8_t SET_COMMIT_WRITE = 2; //Optional
35 constexpr uint8_t SET_IN_PROGRESS_RESERVED = 3; //Reserved
36 
37 const int CHANNEL_MASK = 0x0f;
38 const int NUM_CHANNELS = 0x0f;
39 
40 struct ChannelConfig_t
41 {
42     std::string ipaddr;
43     ipmi::network::IPOrigin ipsrc = ipmi::network::IPOrigin::UNSPECIFIED;
44     std::string netmask;
45     std::string gateway;
46     std::string macAddress;
47     // IPMI stores the vlan info in 16 bits,32 bits is to aligned
48     // with phosphor-dbus interfaces.
49     // vlan id is in 12 bits and the 16th bit is for enable mask.
50     uint32_t vlanID = ipmi::network::VLAN_ID_MASK;
51     uint8_t lan_set_in_progress = SET_COMPLETE;
52     bool flush = false;
53 
54     void clear()
55     {
56         ipaddr.clear();
57         netmask.clear();
58         gateway.clear();
59         macAddress.clear();
60         vlanID = ipmi::network::VLAN_ID_MASK;
61         ipsrc = ipmi::network::IPOrigin::UNSPECIFIED;
62         lan_set_in_progress = SET_COMPLETE;
63         flush = false;
64     }
65 };
66 
67 // Given a channel, get the corresponding configuration,
68 // or allocate it first.
69 //
70 // @param[in] channel the channel
71 // @return the ChannelConfig_t pointer.
72 struct ChannelConfig_t* getChannelConfig(int channel);
73 
74 /** @brief Iterate over all the channelconfig and if
75  *         user has given the data for a channel then
76  *         apply the network changes for that channel.
77  */
78 void commitNetworkChanges();
79 
80 /* @brief  Apply the network changes which is there in the
81  *         network cache for a given channel which gets filled
82  *         through setLan command. If some of the network
83  *         parameter was not given by the setLan then this function
84  *         gets the value of that parameter which is already
85  *         configured on the system.
86  * @param[in] channel: channel number.
87  */
88 void applyChanges(int channel);
89