dhcp: API cleanup
Use consistent API types. Type: fix Signed-off-by: Jakub Grajciar <jgrajcia@cisco.com> Change-Id: Ia63d920788add2584060a240321acced7a471640
This commit is contained in:
committed by
Ole Trøan
parent
d6d50cebde
commit
103ba6ba9e
@@ -278,7 +278,8 @@ dhcp_client::event_handler::handle_populate(const client_db::key_t& key)
|
||||
|
||||
const dhcp_client::state_t& s =
|
||||
dhcp_client::state_t::from_vpp(payload.lease.state);
|
||||
route::prefix_t pfx(payload.lease.is_ipv6, payload.lease.host_address,
|
||||
route::prefix_t pfx(payload.lease.is_ipv6,
|
||||
(uint8_t*)&payload.lease.host_address.un,
|
||||
payload.lease.mask_width);
|
||||
std::string hostname =
|
||||
reinterpret_cast<const char*>(payload.lease.hostname);
|
||||
@@ -286,8 +287,8 @@ dhcp_client::event_handler::handle_populate(const client_db::key_t& key)
|
||||
dhcp_client dc(*itf, hostname, l2, payload.client.set_broadcast_flag,
|
||||
from_api(payload.client.dscp));
|
||||
dc.lease(std::make_shared<dhcp_client::lease_t>(
|
||||
s, itf, from_bytes(0, payload.lease.router_address), pfx, hostname,
|
||||
mac_address_t(payload.lease.host_mac)));
|
||||
s, itf, from_bytes(0, (uint8_t*)&payload.lease.router_address.un), pfx,
|
||||
hostname, mac_address_t(payload.lease.host_mac)));
|
||||
OM::commit(key, dc);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -173,15 +173,16 @@ events_cmd::notify()
|
||||
|
||||
const dhcp_client::state_t& s =
|
||||
dhcp_client::state_t::from_vpp(payload.lease.state);
|
||||
route::prefix_t pfx(payload.lease.is_ipv6, payload.lease.host_address,
|
||||
route::prefix_t pfx(payload.lease.is_ipv6,
|
||||
(uint8_t*)&payload.lease.host_address.un,
|
||||
payload.lease.mask_width);
|
||||
std::shared_ptr<interface> itf = interface::find(payload.lease.sw_if_index);
|
||||
|
||||
if (itf) {
|
||||
std::shared_ptr<dhcp_client::lease_t> ev =
|
||||
std::make_shared<dhcp_client::lease_t>(
|
||||
s, itf, from_bytes(0, payload.lease.router_address), pfx,
|
||||
reinterpret_cast<const char*>(payload.lease.hostname),
|
||||
s, itf, from_bytes(0, (uint8_t*)&payload.lease.router_address.un),
|
||||
pfx, reinterpret_cast<const char*>(payload.lease.hostname),
|
||||
mac_address_t(payload.lease.host_mac));
|
||||
m_listener.handle_dhcp_event(ev);
|
||||
|
||||
|
||||
+9
-10
@@ -2671,10 +2671,9 @@ vl_api_dhcp_compl_event_t_handler (vl_api_dhcp_compl_event_t * mp)
|
||||
{
|
||||
u8 *s, i;
|
||||
|
||||
s = format (0, "DHCP compl event: pid %d %s hostname %s host_addr %U "
|
||||
s = format (0, "DHCP compl event: pid %d hostname %s host_addr %U "
|
||||
"host_mac %U router_addr %U",
|
||||
ntohl (mp->pid), mp->lease.is_ipv6 ? "ipv6" : "ipv4",
|
||||
mp->lease.hostname,
|
||||
ntohl (mp->pid), mp->lease.hostname,
|
||||
format_ip4_address, mp->lease.host_address,
|
||||
format_ethernet_address, mp->lease.host_mac,
|
||||
format_ip4_address, mp->lease.router_address);
|
||||
@@ -9355,14 +9354,15 @@ api_dhcp_proxy_config (vat_main_t * vam)
|
||||
mp->server_vrf_id = ntohl (server_vrf_id);
|
||||
if (v6_address_set)
|
||||
{
|
||||
mp->is_ipv6 = 1;
|
||||
clib_memcpy (mp->dhcp_server, &v6address, sizeof (v6address));
|
||||
clib_memcpy (mp->dhcp_src_address, &v6srcaddress, sizeof (v6address));
|
||||
clib_memcpy (&mp->dhcp_server.un, &v6address, sizeof (v6address));
|
||||
clib_memcpy (&mp->dhcp_src_address.un, &v6srcaddress,
|
||||
sizeof (v6address));
|
||||
}
|
||||
else
|
||||
{
|
||||
clib_memcpy (mp->dhcp_server, &v4address, sizeof (v4address));
|
||||
clib_memcpy (mp->dhcp_src_address, &v4srcaddress, sizeof (v4address));
|
||||
clib_memcpy (&mp->dhcp_server.un, &v4address, sizeof (v4address));
|
||||
clib_memcpy (&mp->dhcp_src_address.un, &v4srcaddress,
|
||||
sizeof (v4address));
|
||||
}
|
||||
|
||||
/* send it... */
|
||||
@@ -9434,8 +9434,7 @@ static void vl_api_dhcp_proxy_details_t_handler_json
|
||||
|
||||
vat_json_init_object (node);
|
||||
vat_json_object_add_uint (node, "rx-table-id", ntohl (mp->rx_vrf_id));
|
||||
vat_json_object_add_bytes (node, "vss-type", &mp->vss_type,
|
||||
sizeof (mp->vss_type));
|
||||
vat_json_object_add_uint (node, "vss-type", ntohl (mp->vss_type));
|
||||
vat_json_object_add_string_copy (node, "vss-vpn-ascii-id",
|
||||
mp->vss_vpn_ascii_id);
|
||||
vat_json_object_add_uint (node, "vss-fib-id", ntohl (mp->vss_fib_id));
|
||||
|
||||
+75
-47
@@ -13,16 +13,47 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
option version = "2.0.1";
|
||||
option version = "3.0.1";
|
||||
|
||||
import "vnet/interface_types.api";
|
||||
import "vnet/ip/ip_types.api";
|
||||
import "vnet/ethernet/ethernet_types.api";
|
||||
|
||||
enum vss_type {
|
||||
VSS_TYPE_API_ASCII = 0,
|
||||
VSS_TYPE_API_VPN_ID = 1,
|
||||
VSS_TYPE_API_INVALID = 123,
|
||||
VSS_TYPE_API_DEFAULT = 255,
|
||||
};
|
||||
|
||||
enum dhcp_client_state {
|
||||
DHCP_CLIENT_STATE_API_DISCOVER,
|
||||
DHCP_CLIENT_STATE_API_REQUEST,
|
||||
DHCP_CLIENT_STATE_API_BOUND,
|
||||
};
|
||||
|
||||
enum dhcpv6_msg_type
|
||||
{
|
||||
DHCPV6_MSG_API_SOLICIT = 1,
|
||||
DHCPV6_MSG_API_ADVERTISE = 2,
|
||||
DHCPV6_MSG_API_REQUEST = 3,
|
||||
DHCPV6_MSG_API_CONFIRM = 4,
|
||||
DHCPV6_MSG_API_RENEW = 5,
|
||||
DHCPV6_MSG_API_REBIND = 6,
|
||||
DHCPV6_MSG_API_REPLY = 7,
|
||||
DHCPV6_MSG_API_RELEASE = 8,
|
||||
DHCPV6_MSG_API_DECLINE = 9,
|
||||
DHCPV6_MSG_API_RECONFIGURE = 10,
|
||||
DHCPV6_MSG_API_INFORMATION_REQUEST = 11,
|
||||
DHCPV6_MSG_API_RELAY_FORW = 12,
|
||||
DHCPV6_MSG_API_RELAY_REPL = 13,
|
||||
};
|
||||
|
||||
/** \brief DHCP Proxy config add / del request
|
||||
@param client_index - opaque cookie to identify the sender
|
||||
@param context - sender context, to match reply w/ request
|
||||
@param rx_vrf_id - Rx/interface vrf id
|
||||
@param server_vrf_id - server vrf id
|
||||
@param if_ipv6 - ipv6 if non-zero, else ipv4
|
||||
@param is_add - add the config if non-zero, else delete
|
||||
@param insert_circuit_id - option82 suboption 1 fib number
|
||||
@param dhcp_server[] - server address
|
||||
@@ -34,10 +65,9 @@ autoreply define dhcp_proxy_config
|
||||
u32 context;
|
||||
u32 rx_vrf_id;
|
||||
u32 server_vrf_id;
|
||||
u8 is_ipv6;
|
||||
u8 is_add;
|
||||
u8 dhcp_server[16];
|
||||
u8 dhcp_src_address[16];
|
||||
bool is_add;
|
||||
vl_api_address_t dhcp_server;
|
||||
vl_api_address_t dhcp_src_address;
|
||||
};
|
||||
|
||||
/** \brief DHCP Proxy set / unset vss request
|
||||
@@ -46,7 +76,7 @@ autoreply define dhcp_proxy_config
|
||||
@param tbl_id - table id
|
||||
@vss_type - 0: use ASCI vpn_id; 1: use oui/vpn_index; 255: global vpn
|
||||
@vpn_ascii - null terminated ASCII VPN ID up to 128 characters
|
||||
@param oui - first part of rfc2685 vpn id, 3 bytes oui
|
||||
@param oui - first part of rfc2685 vpn id, 3 bytes oui
|
||||
@param vpn_index - second part of rfc2685 vpn id, 4 bytes vpn index
|
||||
@param is_ipv6 - ip6 if non-zero, else ip4
|
||||
@param is_add - set vss if non-zero, else delete
|
||||
@@ -56,12 +86,12 @@ autoreply define dhcp_proxy_set_vss
|
||||
u32 client_index;
|
||||
u32 context;
|
||||
u32 tbl_id;
|
||||
u8 vss_type;
|
||||
u8 vpn_ascii_id[129];
|
||||
vl_api_vss_type_t vss_type;
|
||||
string vpn_ascii_id[129];
|
||||
u32 oui;
|
||||
u32 vpn_index;
|
||||
u8 is_ipv6;
|
||||
u8 is_add;
|
||||
bool is_ipv6;
|
||||
bool is_add;
|
||||
};
|
||||
|
||||
/** \brief DHCP Client config data
|
||||
@@ -77,11 +107,11 @@ autoreply define dhcp_proxy_set_vss
|
||||
*/
|
||||
typedef dhcp_client
|
||||
{
|
||||
u32 sw_if_index;
|
||||
u8 hostname[64];
|
||||
vl_api_interface_index_t sw_if_index;
|
||||
string hostname[64];
|
||||
u8 id[64];
|
||||
u8 want_dhcp_event;
|
||||
u8 set_broadcast_flag;
|
||||
bool want_dhcp_event;
|
||||
bool set_broadcast_flag;
|
||||
vl_api_ip_dscp_t dscp;
|
||||
u32 pid;
|
||||
};
|
||||
@@ -96,7 +126,7 @@ autoreply define dhcp_client_config
|
||||
{
|
||||
u32 client_index;
|
||||
u32 context;
|
||||
u8 is_add;
|
||||
bool is_add;
|
||||
vl_api_dhcp_client_t client;
|
||||
};
|
||||
|
||||
@@ -105,12 +135,12 @@ autoreply define dhcp_client_config
|
||||
*/
|
||||
typedef domain_server
|
||||
{
|
||||
u8 address[16];
|
||||
vl_api_address_t address;
|
||||
};
|
||||
|
||||
/** \brief Data learned by the client during the DHCP process
|
||||
@param sw_if_index - the interface on which the client is configured
|
||||
@param state - the state of the lease (see dhcp_client_state_t)
|
||||
@param state - the state of the lease
|
||||
@param is_ipv6 - if non-zero the address is ipv6, else ipv4
|
||||
@param mask_width - The length of the subnet mask assigned
|
||||
@param host_address - Host IP address
|
||||
@@ -119,14 +149,14 @@ typedef domain_server
|
||||
*/
|
||||
typedef dhcp_lease
|
||||
{
|
||||
u32 sw_if_index;
|
||||
u8 state;
|
||||
u8 hostname[64];
|
||||
u8 is_ipv6;
|
||||
vl_api_interface_index_t sw_if_index;
|
||||
vl_api_dhcp_client_state_t state;
|
||||
bool is_ipv6;
|
||||
string hostname[64];
|
||||
u8 mask_width;
|
||||
u8 host_address[16];
|
||||
u8 router_address[16];
|
||||
u8 host_mac[6];
|
||||
vl_api_address_t host_address;
|
||||
vl_api_address_t router_address;
|
||||
vl_api_mac_address_t host_mac;
|
||||
u8 count;
|
||||
vl_api_domain_server_t domain_server[count];
|
||||
};
|
||||
@@ -174,13 +204,13 @@ define dhcp_proxy_dump
|
||||
{
|
||||
u32 client_index;
|
||||
u32 context;
|
||||
u8 is_ip6;
|
||||
bool is_ip6;
|
||||
};
|
||||
|
||||
typedef dhcp_server
|
||||
{
|
||||
u32 server_vrf_id;
|
||||
u8 dhcp_server[16];
|
||||
vl_api_address_t dhcp_server;
|
||||
};
|
||||
|
||||
/** \brief Tell client about a DHCP completion event
|
||||
@@ -192,10 +222,10 @@ manual_endian manual_print define dhcp_proxy_details
|
||||
u32 rx_vrf_id;
|
||||
u32 vss_oui;
|
||||
u32 vss_fib_id;
|
||||
u8 vss_type;
|
||||
u8 vss_vpn_ascii_id[129];
|
||||
u8 is_ipv6;
|
||||
u8 dhcp_src_address[16];
|
||||
vl_api_vss_type_t vss_type;
|
||||
bool is_ipv6;
|
||||
string vss_vpn_ascii_id[129];
|
||||
vl_api_address_t dhcp_src_address;
|
||||
u8 count;
|
||||
vl_api_dhcp_server_t servers[count];
|
||||
};
|
||||
@@ -220,7 +250,7 @@ autoreply define dhcp6_clients_enable_disable
|
||||
{
|
||||
u32 client_index;
|
||||
u32 context;
|
||||
u8 enable;
|
||||
bool enable;
|
||||
};
|
||||
|
||||
/** \brief Struct representing DHCPv6 address
|
||||
@@ -230,21 +260,19 @@ autoreply define dhcp6_clients_enable_disable
|
||||
*/
|
||||
typedef dhcp6_address_info
|
||||
{
|
||||
u8 address[16];
|
||||
vl_api_ip6_address_t address;
|
||||
u32 valid_time;
|
||||
u32 preferred_time;
|
||||
};
|
||||
|
||||
/** \brief Struct representing DHCPv6 PD prefix
|
||||
@param prefix - prefix
|
||||
@param prefix_length - prefix length
|
||||
@param valid_time - valid lifetime
|
||||
@param preferred_time - preferred lifetime
|
||||
*/
|
||||
typedef dhcp6_pd_prefix_info
|
||||
{
|
||||
u8 prefix[16];
|
||||
u8 prefix_length;
|
||||
vl_api_ip6_prefix_t prefix;
|
||||
u32 valid_time;
|
||||
u32 preferred_time;
|
||||
};
|
||||
@@ -274,14 +302,14 @@ autoreply define dhcp6_send_client_message
|
||||
{
|
||||
u32 client_index;
|
||||
u32 context;
|
||||
u32 sw_if_index;
|
||||
vl_api_interface_index_t sw_if_index;
|
||||
u32 server_index;
|
||||
u32 irt;
|
||||
u32 mrt;
|
||||
u32 mrc;
|
||||
u32 mrd;
|
||||
u8 stop;
|
||||
u8 msg_type;
|
||||
bool stop;
|
||||
vl_api_dhcpv6_msg_type_t msg_type;
|
||||
u32 T1;
|
||||
u32 T2;
|
||||
u32 n_addresses;
|
||||
@@ -313,14 +341,14 @@ autoreply define dhcp6_pd_send_client_message
|
||||
{
|
||||
u32 client_index;
|
||||
u32 context;
|
||||
u32 sw_if_index;
|
||||
vl_api_interface_index_t sw_if_index;
|
||||
u32 server_index;
|
||||
u32 irt;
|
||||
u32 mrt;
|
||||
u32 mrc;
|
||||
u32 mrd;
|
||||
u8 stop;
|
||||
u8 msg_type;
|
||||
bool stop;
|
||||
vl_api_dhcpv6_msg_type_t msg_type;
|
||||
u32 T1;
|
||||
u32 T2;
|
||||
u32 n_prefixes;
|
||||
@@ -361,7 +389,7 @@ autoreply define want_dhcp6_pd_reply_events
|
||||
{
|
||||
u32 client_index;
|
||||
u32 context;
|
||||
u8 enable_disable;
|
||||
bool enable_disable;
|
||||
u32 pid;
|
||||
};
|
||||
|
||||
@@ -384,9 +412,9 @@ define dhcp6_reply_event
|
||||
{
|
||||
u32 client_index;
|
||||
u32 pid;
|
||||
u32 sw_if_index;
|
||||
vl_api_interface_index_t sw_if_index;
|
||||
u32 server_index;
|
||||
u8 msg_type;
|
||||
vl_api_dhcpv6_msg_type_t msg_type;
|
||||
u32 T1;
|
||||
u32 T2;
|
||||
u16 inner_status_code;
|
||||
@@ -415,9 +443,9 @@ define dhcp6_pd_reply_event
|
||||
{
|
||||
u32 client_index;
|
||||
u32 pid;
|
||||
u32 sw_if_index;
|
||||
vl_api_interface_index_t sw_if_index;
|
||||
u32 server_index;
|
||||
u8 msg_type;
|
||||
vl_api_dhcpv6_msg_type_t msg_type;
|
||||
u32 T1;
|
||||
u32 T2;
|
||||
u16 inner_status_code;
|
||||
|
||||
@@ -214,7 +214,7 @@ dhcp6_reply_event_handler (vl_api_dhcp6_reply_event_t * mp)
|
||||
inner_status_code = ntohs (mp->inner_status_code);
|
||||
status_code = ntohs (mp->status_code);
|
||||
|
||||
if (mp->msg_type == DHCPV6_MSG_ADVERTISE
|
||||
if (mp->msg_type == DHCPV6_MSG_API_ADVERTISE
|
||||
&& client_state->server_index == ~0)
|
||||
{
|
||||
address_info_t *address_list = 0, *address_info;
|
||||
@@ -246,7 +246,7 @@ dhcp6_reply_event_handler (vl_api_dhcp6_reply_event_t * mp)
|
||||
vec_free (address_list);
|
||||
}
|
||||
|
||||
if (mp->msg_type != DHCPV6_MSG_REPLY)
|
||||
if (mp->msg_type != DHCPV6_MSG_API_REPLY)
|
||||
return 0;
|
||||
|
||||
if (!client_state->rebinding && client_state->server_index != server_index)
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
#include <vlibmemory/api.h>
|
||||
#include <vnet/dhcp/dhcp6_ia_na_client_dp.h>
|
||||
#include <vnet/dhcp/dhcp6_client_common_dp.h>
|
||||
#include <vnet/ip/ip_types_api.h>
|
||||
|
||||
#include <vnet/vnet_msg_enum.h>
|
||||
|
||||
@@ -454,7 +455,7 @@ void
|
||||
params.mrt = ntohl (mp->mrt);
|
||||
params.mrc = ntohl (mp->mrc);
|
||||
params.mrd = ntohl (mp->mrd);
|
||||
params.msg_type = mp->msg_type;
|
||||
params.msg_type = ntohl (mp->msg_type);
|
||||
params.T1 = ntohl (mp->T1);
|
||||
params.T2 = ntohl (mp->T2);
|
||||
n_addresses = ntohl (mp->n_addresses);
|
||||
@@ -467,7 +468,7 @@ void
|
||||
dhcp6_send_client_message_params_address_t *addr = ¶ms.addresses[i];
|
||||
addr->preferred_lt = ntohl (ai->preferred_time);
|
||||
addr->valid_lt = ntohl (ai->valid_time);
|
||||
memcpy (addr->address.as_u8, ai->address, 16);
|
||||
ip6_address_decode (ai->address, &addr->address);
|
||||
}
|
||||
|
||||
dhcp6_send_client_message (vm, ntohl (mp->sw_if_index), mp->stop, ¶ms);
|
||||
@@ -535,7 +536,7 @@ dhcp6_reply_process (vlib_main_t * vm, vlib_node_runtime_t * rt,
|
||||
for (j = 0; j < vec_len (events[i].addresses); j++)
|
||||
{
|
||||
dhcp6_address_info_t *info = &events[i].addresses[j];
|
||||
memcpy (address->address, &info->address, 16);
|
||||
ip6_address_encode (&info->address, address->address);
|
||||
address->valid_time = htonl (info->valid_time);
|
||||
address->preferred_time = htonl (info->preferred_time);
|
||||
address++;
|
||||
|
||||
@@ -323,7 +323,7 @@ dhcp6_pd_reply_event_handler (vl_api_dhcp6_pd_reply_event_t * mp)
|
||||
inner_status_code = ntohs (mp->inner_status_code);
|
||||
status_code = ntohs (mp->status_code);
|
||||
|
||||
if (mp->msg_type == DHCPV6_MSG_ADVERTISE
|
||||
if (mp->msg_type == DHCPV6_MSG_API_ADVERTISE
|
||||
&& client_state->server_index == ~0)
|
||||
{
|
||||
prefix_info_t *prefix_list = 0, *prefix_info;
|
||||
@@ -341,8 +341,8 @@ dhcp6_pd_reply_event_handler (vl_api_dhcp6_pd_reply_event_t * mp)
|
||||
for (i = 0; i < n_prefixes; i++)
|
||||
{
|
||||
api_prefix = &mp->prefixes[i];
|
||||
prefix = (ip6_address_t *) api_prefix->prefix;
|
||||
prefix_length = api_prefix->prefix_length;
|
||||
prefix = (ip6_address_t *) api_prefix->prefix.address;
|
||||
prefix_length = api_prefix->prefix.len;
|
||||
|
||||
prefix_info = &prefix_list[i];
|
||||
prefix_info->prefix = *prefix;
|
||||
@@ -358,7 +358,7 @@ dhcp6_pd_reply_event_handler (vl_api_dhcp6_pd_reply_event_t * mp)
|
||||
vec_free (prefix_list);
|
||||
}
|
||||
|
||||
if (mp->msg_type != DHCPV6_MSG_REPLY)
|
||||
if (mp->msg_type != DHCPV6_MSG_API_REPLY)
|
||||
return 0;
|
||||
|
||||
if (!client_state->rebinding && client_state->server_index != server_index)
|
||||
@@ -398,15 +398,15 @@ dhcp6_pd_reply_event_handler (vl_api_dhcp6_pd_reply_event_t * mp)
|
||||
|
||||
api_prefix = &mp->prefixes[i];
|
||||
|
||||
prefix = (ip6_address_t *) api_prefix->prefix;
|
||||
prefix_length = api_prefix->prefix_length;
|
||||
prefix = (ip6_address_t *) api_prefix->prefix.address;
|
||||
prefix_length = api_prefix->prefix.len;
|
||||
|
||||
if (ip6_address_is_link_local_unicast (prefix))
|
||||
continue;
|
||||
|
||||
valid_time = ntohl (api_prefix->valid_time);
|
||||
preferred_time = ntohl (api_prefix->preferred_time);
|
||||
prefix_length = api_prefix->prefix_length;
|
||||
prefix_length = api_prefix->prefix.len;
|
||||
|
||||
if (preferred_time > valid_time)
|
||||
continue;
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
#include <vlibmemory/api.h>
|
||||
#include <vnet/dhcp/dhcp6_pd_client_dp.h>
|
||||
#include <vnet/dhcp/dhcp6_client_common_dp.h>
|
||||
#include <vnet/ip/ip_types_api.h>
|
||||
|
||||
#include <vnet/vnet_msg_enum.h>
|
||||
|
||||
@@ -457,7 +458,7 @@ void
|
||||
params.mrt = ntohl (mp->mrt);
|
||||
params.mrc = ntohl (mp->mrc);
|
||||
params.mrd = ntohl (mp->mrd);
|
||||
params.msg_type = mp->msg_type;
|
||||
params.msg_type = ntohl (mp->msg_type);
|
||||
params.T1 = ntohl (mp->T1);
|
||||
params.T2 = ntohl (mp->T2);
|
||||
n_prefixes = ntohl (mp->n_prefixes);
|
||||
@@ -471,8 +472,8 @@ void
|
||||
¶ms.prefixes[i];
|
||||
pref->preferred_lt = ntohl (pi->preferred_time);
|
||||
pref->valid_lt = ntohl (pi->valid_time);
|
||||
memcpy (pref->prefix.as_u8, pi->prefix, 16);
|
||||
pref->prefix_length = pi->prefix_length;
|
||||
ip6_address_decode (pi->prefix.address, &pref->prefix);
|
||||
pref->prefix_length = pi->prefix.len;
|
||||
}
|
||||
|
||||
dhcp6_pd_send_client_message (vm, ntohl (mp->sw_if_index), mp->stop,
|
||||
@@ -542,8 +543,8 @@ dhcp6_pd_reply_process (vlib_main_t * vm, vlib_node_runtime_t * rt,
|
||||
for (j = 0; j < vec_len (events[i].prefixes); j++)
|
||||
{
|
||||
dhcp6_prefix_info_t *info = &events[i].prefixes[j];
|
||||
memcpy (prefix->prefix, &info->prefix, 16);
|
||||
prefix->prefix_length = info->prefix_length;
|
||||
ip6_address_encode (&info->prefix, prefix->prefix.address);
|
||||
prefix->prefix.len = info->prefix_length;
|
||||
prefix->valid_time = htonl (info->valid_time);
|
||||
prefix->preferred_time = htonl (info->preferred_time);
|
||||
prefix++;
|
||||
|
||||
+22
-22
@@ -73,8 +73,8 @@ vl_api_dhcp_proxy_set_vss_t_handler (vl_api_dhcp_proxy_set_vss_t * mp)
|
||||
vpn_ascii_id = format (0, "%s", mp->vpn_ascii_id);
|
||||
rv =
|
||||
dhcp_proxy_set_vss ((mp->is_ipv6 ? FIB_PROTOCOL_IP6 : FIB_PROTOCOL_IP4),
|
||||
ntohl (mp->tbl_id), mp->vss_type, vpn_ascii_id,
|
||||
ntohl (mp->oui), ntohl (mp->vpn_index),
|
||||
ntohl (mp->tbl_id), ntohl (mp->vss_type),
|
||||
vpn_ascii_id, ntohl (mp->oui), ntohl (mp->vpn_index),
|
||||
mp->is_add == 0);
|
||||
|
||||
REPLY_MACRO (VL_API_DHCP_PROXY_SET_VSS_REPLY);
|
||||
@@ -88,12 +88,18 @@ static void vl_api_dhcp_proxy_config_t_handler
|
||||
ip46_address_t src, server;
|
||||
int rv = -1;
|
||||
|
||||
if (mp->is_ipv6)
|
||||
if (mp->dhcp_src_address.af != mp->dhcp_server.af)
|
||||
{
|
||||
clib_memcpy (&src.ip6, mp->dhcp_src_address, sizeof (src.ip6));
|
||||
clib_memcpy (&server.ip6, mp->dhcp_server, sizeof (server.ip6));
|
||||
rv = VNET_API_ERROR_INVALID_ARGUMENT;
|
||||
goto reply;
|
||||
}
|
||||
|
||||
rv = dhcp6_proxy_set_server (&server,
|
||||
ip_address_decode (&mp->dhcp_src_address, &src);
|
||||
ip_address_decode (&mp->dhcp_server, &server);
|
||||
|
||||
if (mp->dhcp_src_address.af == ADDRESS_IP4)
|
||||
{
|
||||
rv = dhcp4_proxy_set_server (&server,
|
||||
&src,
|
||||
(u32) ntohl (mp->rx_vrf_id),
|
||||
(u32) ntohl (mp->server_vrf_id),
|
||||
@@ -101,20 +107,14 @@ static void vl_api_dhcp_proxy_config_t_handler
|
||||
}
|
||||
else
|
||||
{
|
||||
ip46_address_reset (&src);
|
||||
ip46_address_reset (&server);
|
||||
|
||||
clib_memcpy (&src.ip4, mp->dhcp_src_address, sizeof (src.ip4));
|
||||
clib_memcpy (&server.ip4, mp->dhcp_server, sizeof (server.ip4));
|
||||
|
||||
rv = dhcp4_proxy_set_server (&server,
|
||||
rv = dhcp6_proxy_set_server (&server,
|
||||
&src,
|
||||
(u32) ntohl (mp->rx_vrf_id),
|
||||
(u32) ntohl (mp->server_vrf_id),
|
||||
(int) (mp->is_add == 0));
|
||||
}
|
||||
|
||||
|
||||
reply:
|
||||
REPLY_MACRO (VL_API_DHCP_PROXY_CONFIG_REPLY);
|
||||
}
|
||||
|
||||
@@ -162,7 +162,7 @@ dhcp_send_details (fib_protocol_t proto,
|
||||
|
||||
if (vss)
|
||||
{
|
||||
mp->vss_type = vss->vss_type;
|
||||
mp->vss_type = ntohl (vss->vss_type);
|
||||
if (vss->vss_type == VSS_TYPE_ASCII)
|
||||
{
|
||||
u32 id_len = vec_len (vss->vpn_ascii_id);
|
||||
@@ -193,23 +193,23 @@ dhcp_send_details (fib_protocol_t proto,
|
||||
|
||||
if (mp->is_ipv6)
|
||||
{
|
||||
memcpy (v_server->dhcp_server, &server->dhcp_server.ip6, 16);
|
||||
memcpy (&v_server->dhcp_server.un, &server->dhcp_server.ip6, 16);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* put the address in the first bytes */
|
||||
memcpy (v_server->dhcp_server, &server->dhcp_server.ip4, 4);
|
||||
memcpy (&v_server->dhcp_server.un, &server->dhcp_server.ip4, 4);
|
||||
}
|
||||
}
|
||||
|
||||
if (mp->is_ipv6)
|
||||
{
|
||||
memcpy (mp->dhcp_src_address, &proxy->dhcp_src_address.ip6, 16);
|
||||
memcpy (&mp->dhcp_src_address.un, &proxy->dhcp_src_address.ip6, 16);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* put the address in the first bytes */
|
||||
memcpy (mp->dhcp_src_address, &proxy->dhcp_src_address.ip4, 4);
|
||||
memcpy (&mp->dhcp_src_address.un, &proxy->dhcp_src_address.ip4, 4);
|
||||
}
|
||||
vl_api_send_msg (reg, (u8 *) mp);
|
||||
}
|
||||
@@ -223,15 +223,15 @@ dhcp_client_lease_encode (vl_api_dhcp_lease_t * lease,
|
||||
|
||||
lease->is_ipv6 = 0; // only support IPv6 clients
|
||||
lease->sw_if_index = ntohl (client->sw_if_index);
|
||||
lease->state = client->state;
|
||||
lease->state = ntohl (client->state);
|
||||
len = clib_min (sizeof (lease->hostname) - 1, vec_len (client->hostname));
|
||||
clib_memcpy (&lease->hostname, client->hostname, len);
|
||||
lease->hostname[len] = 0;
|
||||
|
||||
lease->mask_width = client->subnet_mask_width;
|
||||
clib_memcpy (&lease->host_address[0], (u8 *) & client->leased_address,
|
||||
clib_memcpy (&lease->host_address.un, (u8 *) & client->leased_address,
|
||||
sizeof (ip4_address_t));
|
||||
clib_memcpy (&lease->router_address[0], (u8 *) & client->router_address,
|
||||
clib_memcpy (&lease->router_address.un, (u8 *) & client->router_address,
|
||||
sizeof (ip4_address_t));
|
||||
|
||||
lease->count = vec_len (client->domain_server_address);
|
||||
|
||||
@@ -1047,20 +1047,11 @@ static void *vl_api_dhcp_proxy_config_t_print
|
||||
s = format (s, "rx_vrf_id %d ", (mp->rx_vrf_id));
|
||||
s = format (s, "server_vrf_id %d ", (mp->server_vrf_id));
|
||||
|
||||
if (mp->is_ipv6)
|
||||
{
|
||||
s = format (s, "svr %U ", format_ip6_address,
|
||||
(ip6_address_t *) mp->dhcp_server);
|
||||
s = format (s, "src %U ", format_ip6_address,
|
||||
(ip6_address_t *) mp->dhcp_src_address);
|
||||
}
|
||||
else
|
||||
{
|
||||
s = format (s, "svr %U ", format_ip4_address,
|
||||
(ip4_address_t *) mp->dhcp_server);
|
||||
s = format (s, "src %U ", format_ip4_address,
|
||||
(ip4_address_t *) mp->dhcp_src_address);
|
||||
}
|
||||
s = format (s, "svr %U ", format_ip46_address,
|
||||
(ip46_address_t *) & mp->dhcp_server.un);
|
||||
s = format (s, "src %U ", format_ip46_address,
|
||||
(ip46_address_t *) & mp->dhcp_src_address.un);
|
||||
|
||||
if (mp->is_add == 0)
|
||||
s = format (s, "del ");
|
||||
|
||||
|
||||
+122
-139
File diff suppressed because it is too large
Load Diff
+28
-18
@@ -10,6 +10,7 @@ from scapy.utils6 import in6_mactoifaceid
|
||||
from scapy.utils import inet_ntop, inet_pton
|
||||
|
||||
from framework import VppTestCase
|
||||
from vpp_papi import VppEnum
|
||||
import util
|
||||
|
||||
|
||||
@@ -52,14 +53,17 @@ class TestDHCPv6DataPlane(VppTestCase):
|
||||
|
||||
self.pg_enable_capture(self.pg_interfaces)
|
||||
self.pg_start()
|
||||
address_bin = '\00\01\00\02\00\03' + '\00' * 8 + '\00\05'
|
||||
address = {'address': address_bin,
|
||||
address = {'address': '1:2:3::5',
|
||||
'preferred_time': 60,
|
||||
'valid_time': 120}
|
||||
self.vapi.dhcp6_send_client_message(msg_type=1,
|
||||
sw_if_index=self.pg0.sw_if_index,
|
||||
T1=20, T2=40, addresses=[address],
|
||||
n_addresses=len([address]))
|
||||
self.vapi.dhcp6_send_client_message(
|
||||
msg_type=VppEnum.vl_api_dhcpv6_msg_type_t.DHCPV6_MSG_API_SOLICIT,
|
||||
sw_if_index=self.pg0.sw_if_index,
|
||||
T1=20,
|
||||
T2=40,
|
||||
addresses=[address],
|
||||
n_addresses=len(
|
||||
[address]))
|
||||
rx_list = self.pg0.get_capture(1)
|
||||
self.assertEqual(len(rx_list), 1)
|
||||
packet = rx_list[0]
|
||||
@@ -112,8 +116,8 @@ class TestDHCPv6DataPlane(VppTestCase):
|
||||
self.assert_equal(ev.T2, 40)
|
||||
|
||||
reported_address = ev.addresses[0]
|
||||
address = inet_pton(AF_INET6, ia_na_opts.getfieldval("addr"))
|
||||
self.assert_equal(reported_address.address, address)
|
||||
address = ia_na_opts.getfieldval("addr")
|
||||
self.assert_equal(str(reported_address.address), address)
|
||||
self.assert_equal(reported_address.preferred_time,
|
||||
ia_na_opts.getfieldval("preflft"))
|
||||
self.assert_equal(reported_address.valid_time,
|
||||
@@ -129,13 +133,18 @@ class TestDHCPv6DataPlane(VppTestCase):
|
||||
|
||||
self.pg_enable_capture(self.pg_interfaces)
|
||||
self.pg_start()
|
||||
prefix_bin = '\00\01\00\02\00\03' + '\00' * 10
|
||||
prefix = {'prefix': prefix_bin,
|
||||
'prefix_length': 50,
|
||||
|
||||
prefix = {'prefix': {'address': '1:2:3::', 'len': 50},
|
||||
'preferred_time': 60,
|
||||
'valid_time': 120}
|
||||
self.vapi.dhcp6_pd_send_client_message(1, self.pg0.sw_if_index,
|
||||
T1=20, T2=40, prefixes=[prefix])
|
||||
prefixes = [prefix]
|
||||
self.vapi.dhcp6_pd_send_client_message(
|
||||
msg_type=VppEnum.vl_api_dhcpv6_msg_type_t.DHCPV6_MSG_API_SOLICIT,
|
||||
sw_if_index=self.pg0.sw_if_index,
|
||||
T1=20,
|
||||
T2=40,
|
||||
prefixes=prefixes,
|
||||
n_prefixes=len(prefixes))
|
||||
rx_list = self.pg0.get_capture(1)
|
||||
self.assertEqual(len(rx_list), 1)
|
||||
packet = rx_list[0]
|
||||
@@ -189,9 +198,10 @@ class TestDHCPv6DataPlane(VppTestCase):
|
||||
self.assert_equal(ev.T2, 40)
|
||||
|
||||
reported_prefix = ev.prefixes[0]
|
||||
prefix = inet_pton(AF_INET6, ia_pd_opts.getfieldval("prefix"))
|
||||
self.assert_equal(reported_prefix.prefix, prefix)
|
||||
self.assert_equal(reported_prefix.prefix_length,
|
||||
prefix = ia_pd_opts.getfieldval("prefix")
|
||||
self.assert_equal(
|
||||
str(reported_prefix.prefix).split('/')[0], prefix)
|
||||
self.assert_equal(int(str(reported_prefix.prefix).split('/')[1]),
|
||||
ia_pd_opts.getfieldval("plen"))
|
||||
self.assert_equal(reported_prefix.preferred_time,
|
||||
ia_pd_opts.getfieldval("preflft"))
|
||||
@@ -288,7 +298,7 @@ class TestDHCPv6IANAControlPlane(VppTestCase):
|
||||
self.assertNotEqual(elapsed_time.elapsedtime, 0)
|
||||
else:
|
||||
self.assertEqual(elapsed_time.elapsedtime, 0)
|
||||
except:
|
||||
except BaseException:
|
||||
packet.show()
|
||||
raise
|
||||
|
||||
@@ -544,7 +554,7 @@ class TestDHCPv6PDControlPlane(VppTestCase):
|
||||
self.assertNotEqual(elapsed_time.elapsedtime, 0)
|
||||
else:
|
||||
self.assertEqual(elapsed_time.elapsedtime, 0)
|
||||
except:
|
||||
except BaseException:
|
||||
packet.show()
|
||||
raise
|
||||
|
||||
|
||||
@@ -0,0 +1,128 @@
|
||||
from vpp_object import VppObject
|
||||
|
||||
|
||||
class VppDHCPProxy(VppObject):
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
test,
|
||||
dhcp_server,
|
||||
dhcp_src_address,
|
||||
rx_vrf_id=0,
|
||||
server_vrf_id=0,
|
||||
):
|
||||
self._test = test
|
||||
self._rx_vrf_id = rx_vrf_id
|
||||
self._server_vrf_id = server_vrf_id
|
||||
self._dhcp_server = dhcp_server
|
||||
self._dhcp_src_address = dhcp_src_address
|
||||
|
||||
def set_proxy(
|
||||
self,
|
||||
dhcp_server,
|
||||
dhcp_src_address,
|
||||
rx_vrf_id=0,
|
||||
server_vrf_id=0):
|
||||
if self.query_vpp_config():
|
||||
raise Exception('Vpp config present')
|
||||
self._rx_vrf_id = rx_vrf_id
|
||||
self._server_vrf_id = server_vrf_id
|
||||
self._dhcp_server = dhcp_server
|
||||
self._dhcp_src_address = dhcp_src_address
|
||||
|
||||
def add_vpp_config(self):
|
||||
self._test.vapi.dhcp_proxy_config(
|
||||
rx_vrf_id=self._rx_vrf_id,
|
||||
server_vrf_id=self._server_vrf_id,
|
||||
dhcp_server=self._dhcp_server,
|
||||
dhcp_src_address=self._dhcp_src_address)
|
||||
self._test.registry.register(self, self._test.logger)
|
||||
|
||||
def remove_vpp_config(self):
|
||||
self._test.vapi.dhcp_proxy_config(
|
||||
rx_vrf_id=self._rx_vrf_id,
|
||||
server_vrf_id=self._server_vrf_id,
|
||||
dhcp_server=self._dhcp_server,
|
||||
dhcp_src_address=self._dhcp_src_address,
|
||||
is_add=0)
|
||||
|
||||
def get_vpp_dump(self):
|
||||
dump = self._test.vapi.dhcp_proxy_dump()
|
||||
for entry in dump:
|
||||
if entry.rx_vrf_id == self._rx_vrf_id:
|
||||
return entry
|
||||
|
||||
def query_vpp_config(self):
|
||||
dump = self.get_vpp_dump()
|
||||
return True if dump else False
|
||||
|
||||
def object_id(self):
|
||||
return "dhcp-proxy-%d" % self._rx_vrf_id
|
||||
|
||||
|
||||
class VppDHCPClient(VppObject):
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
test,
|
||||
sw_if_index,
|
||||
hostname,
|
||||
id=None,
|
||||
want_dhcp_event=False,
|
||||
set_broadcast_flag=True,
|
||||
dscp=None,
|
||||
pid=None):
|
||||
self._test = test
|
||||
self._sw_if_index = sw_if_index
|
||||
self._hostname = hostname
|
||||
self._id = id
|
||||
self._want_dhcp_event = want_dhcp_event
|
||||
self._set_broadcast_flag = set_broadcast_flag
|
||||
self._dscp = dscp
|
||||
self._pid = pid
|
||||
|
||||
def set_client(
|
||||
self,
|
||||
sw_if_index,
|
||||
hostname,
|
||||
id=None,
|
||||
want_dhcp_event=False,
|
||||
set_broadcast_flag=True,
|
||||
dscp=None,
|
||||
pid=None):
|
||||
if self.query_vpp_config():
|
||||
raise Exception('Vpp config present')
|
||||
self._sw_if_index = sw_if_index
|
||||
self._hostname = hostname
|
||||
self._id = id
|
||||
self._want_dhcp_event = want_dhcp_event
|
||||
self._set_broadcast_flag = set_broadcast_flag
|
||||
self._dscp = dscp
|
||||
self._pid = pid
|
||||
|
||||
def add_vpp_config(self):
|
||||
client = {'sw_if_index': self._sw_if_index, 'hostname': self._hostname,
|
||||
'id': self._id, 'want_dhcp_event': self._want_dhcp_event,
|
||||
'set_broadcast_flag': self._set_broadcast_flag,
|
||||
'dscp': self._dscp, 'pid': self._pid}
|
||||
self._test.vapi.dhcp_client_config(client=client)
|
||||
self._test.registry.register(self, self._test.logger)
|
||||
|
||||
def remove_vpp_config(self):
|
||||
client = client = {
|
||||
'sw_if_index': self._sw_if_index,
|
||||
'hostname': self._hostname}
|
||||
self._test.vapi.dhcp_client_config(client=client, is_add=0)
|
||||
|
||||
def get_vpp_dump(self):
|
||||
dump = self._test.vapi.dhcp_client_dump()
|
||||
for entry in dump:
|
||||
if entry.client.sw_if_index == self._sw_if_index:
|
||||
return entry
|
||||
|
||||
def query_vpp_config(self):
|
||||
dump = self.get_vpp_dump()
|
||||
return True if dump else False
|
||||
|
||||
def object_id(self):
|
||||
return "dhcp-client-%s/%d" % (self._hostname, self._sw_if_index)
|
||||
@@ -50,7 +50,8 @@ defaultmapping = {
|
||||
'dhcp6_clients_enable_disable': {'enable': 1, },
|
||||
'dhcp6_pd_client_enable_disable': {'enable': 1, },
|
||||
'dhcp6_send_client_message': {'server_index': 4294967295, 'mrc': 1, },
|
||||
'dhcp_client_config': {'is_add': 1, 'set_broadcast_flag': 1, },
|
||||
'dhcp6_pd_send_client_message': {'server_index': 0xFFFFFFFF, 'mrc': 1},
|
||||
'dhcp_client_config': {'is_add': 1, 'client': {'set_broadcast_flag': 1}, },
|
||||
'dhcp_proxy_config': {'is_add': 1, },
|
||||
'dhcp_proxy_set_vss': {'vss_type': 255, 'is_add': 1, },
|
||||
'gbp_subnet_add_del': {'sw_if_index': 4294967295, 'epg_id': 65535, },
|
||||
@@ -147,6 +148,8 @@ defaultmapping = {
|
||||
'want_ip6_nd_events': {'enable_disable': 1, 'ip': '::', },
|
||||
'want_ip6_ra_events': {'enable_disable': 1, },
|
||||
'want_l2_macs_events': {'enable_disable': 1, },
|
||||
'want_dhcp6_reply_events': {'enable_disable': 1, 'pid': os.getpid(), },
|
||||
'want_dhcp6_pd_reply_events': {'enable_disable': 1, 'pid': os.getpid(), },
|
||||
}
|
||||
|
||||
|
||||
@@ -409,41 +412,6 @@ class VppPapiProvider(object):
|
||||
'learn_limit': learn_limit,
|
||||
'pid': os.getpid(), })
|
||||
|
||||
def want_dhcp6_reply_events(self, enable_disable=1):
|
||||
return self.api(self.papi.want_dhcp6_reply_events,
|
||||
{'enable_disable': enable_disable,
|
||||
'pid': os.getpid()})
|
||||
|
||||
def want_dhcp6_pd_reply_events(self, enable_disable=1):
|
||||
return self.api(self.papi.want_dhcp6_pd_reply_events,
|
||||
{'enable_disable': enable_disable,
|
||||
'pid': os.getpid()})
|
||||
|
||||
def dhcp6_pd_send_client_message(self, msg_type, sw_if_index, T1, T2,
|
||||
prefixes, server_index=0xFFFFFFFF,
|
||||
irt=0, mrt=0, mrc=1, mrd=0, stop=0,
|
||||
):
|
||||
return self.api(self.papi.dhcp6_pd_send_client_message,
|
||||
{'sw_if_index': sw_if_index,
|
||||
'server_index': server_index,
|
||||
'irt': irt,
|
||||
'mrt': mrt,
|
||||
'mrc': mrc,
|
||||
'mrd': mrd,
|
||||
'stop': stop,
|
||||
'msg_type': msg_type,
|
||||
'T1': T1,
|
||||
'T2': T2,
|
||||
'n_prefixes': len(prefixes),
|
||||
'prefixes': prefixes})
|
||||
|
||||
def dhcp6_pd_client_enable_disable(self, sw_if_index, prefix_group='',
|
||||
enable=1):
|
||||
return self.api(self.papi.dhcp6_pd_client_enable_disable,
|
||||
{'sw_if_index': sw_if_index,
|
||||
'prefix_group': prefix_group,
|
||||
'enable': enable})
|
||||
|
||||
def ip6_add_del_address_using_prefix(self, sw_if_index, address,
|
||||
prefix_length, prefix_group,
|
||||
is_add=1):
|
||||
@@ -907,66 +875,6 @@ class VppPapiProvider(object):
|
||||
'udp_checksum': udp_checksum,
|
||||
})
|
||||
|
||||
def dhcp_proxy_config(self,
|
||||
dhcp_server,
|
||||
dhcp_src_address,
|
||||
rx_table_id=0,
|
||||
server_table_id=0,
|
||||
is_add=1,
|
||||
is_ipv6=0):
|
||||
return self.api(
|
||||
self.papi.dhcp_proxy_config,
|
||||
{
|
||||
'rx_vrf_id': rx_table_id,
|
||||
'server_vrf_id': server_table_id,
|
||||
'is_ipv6': is_ipv6,
|
||||
'is_add': is_add,
|
||||
'dhcp_server': dhcp_server,
|
||||
'dhcp_src_address': dhcp_src_address,
|
||||
})
|
||||
|
||||
def dhcp_proxy_set_vss(self,
|
||||
table_id,
|
||||
vss_type=255,
|
||||
vpn_ascii_id="",
|
||||
oui=0,
|
||||
vpn_index=0,
|
||||
is_add=1,
|
||||
is_ip6=0):
|
||||
return self.api(
|
||||
self.papi.dhcp_proxy_set_vss,
|
||||
{
|
||||
'tbl_id': table_id,
|
||||
'vss_type': vss_type,
|
||||
'vpn_ascii_id': vpn_ascii_id,
|
||||
'oui': oui,
|
||||
'vpn_index': vpn_index,
|
||||
'is_add': is_add,
|
||||
'is_ipv6': is_ip6,
|
||||
})
|
||||
|
||||
def dhcp_client_config(self,
|
||||
sw_if_index,
|
||||
hostname,
|
||||
client_id='',
|
||||
is_add=1,
|
||||
set_broadcast_flag=1,
|
||||
want_dhcp_events=0,
|
||||
dscp=0):
|
||||
return self.api(
|
||||
self.papi.dhcp_client_config,
|
||||
{
|
||||
'is_add': is_add,
|
||||
'client': {
|
||||
'sw_if_index': sw_if_index,
|
||||
'hostname': hostname,
|
||||
'id': client_id,
|
||||
'want_dhcp_event': want_dhcp_events,
|
||||
'set_broadcast_flag': set_broadcast_flag,
|
||||
'dscp': dscp,
|
||||
'pid': os.getpid()}
|
||||
})
|
||||
|
||||
def ip_mroute_add_del(self,
|
||||
table_id,
|
||||
prefix,
|
||||
|
||||
Reference in New Issue
Block a user