Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Dhcpv6 li fix iapd and ia address naming made same as yang model #387

Merged
merged 6 commits into from
Aug 28, 2024

Conversation

SouravSinhaRoy
Copy link
Contributor

https://redocly.github.io/redoc/?url=https://raw.githubusercontent.com/open-traffic-generator/models/dhcpv6_li_fix/artifacts/openapi.yaml&nocors#tag/Monitor/operation/get_states

This PR changes the client get states to have a array of learned v6 prefixes,addresses,prefix lens and gateway addresses. The array naming convention is made at par with yang model

This shows configuration of one dhcpv6 client and server in two different ports

The first eg is of a dhcpv6 client and the next of a dhcpv6 server

// Case-1: DHCPv6 Client
// DHCPv6 Client is configured on connected interface.
#Creating Ports
import otg
api = otg.api(location="https://localhost/")
config = api.config()
p1 = config.ports.port(name='p1', location='172.17.0.2:50071')[-1]

#Create DHCPv6 client running on connected interface port 1.
p1_d1 = config.devices.device(name='p1_d1')[-1]

p1_eth1 = p1_d1.ethernets.ethernet()[-1]
p1_eth1.connection.port_name = p1.name
p1_eth1.name = 'p1_eth1'

p1_eth1.mac = '64:00:00:00:00:01'
p1_dhcp1 = p1_eth1.dhcpv6_interfaces.dhcpv6client(name = 'p1_dhcp1')[-1]
print(config.serialize())

// Case-2: DHCPv6 Server.
#Creating Ports
import otg
api = otg.api(location="https://localhost/")
config = api.config()
p2 = config.ports.port(name='p2', location='172.17.0.3:50071')[-1]

#Create ethernet and ipv6 running on connected ipv6 interface port 2.
p2_d1 = config.devices.device(name='p1_d1')[-1]
p2_eth1 = p2_d1.ethernets.ethernet()[-1]
p2_eth1.connection.port_name = p2.name
p2_eth1.name = 'p1_eth1'
p2_eth1.mac = '64:00:00:00:00:01'
p2_ip1 = p2_eth1.ipv6_addresses.ipv6(name = 'p2_ip1', address = '2000:0:0:1::2', gateway = '2000:0:0:1::1')[-1]

Creating a DHCPv6 server on the connected interface port2.
p2_dhcp1 = p2_d1.dhcp_server.ipv6_interfaces.v6(name='p2_dhcp1',ipv6_name=p2_ip1.name)[-1]
p2_dhcp1_lease = p2_dhcp1.leases.lease()[-1]
p2_dhcp1_lease_iatype = p2_dhcp1_lease.ia_type.choice="iapd"
p2_dhcp1_lease.ia_type.iapd.start_prefix_address = "a1a1::0"
p2_dhcp1_lease.ia_type.iapd.prefix_step = 1
print(config.serialize())
{
"devices": [
{
"ethernets": [
{
"connection": {
"choice": "port_name",
"port_name": "p1"
},
"dhcpv6_interfaces": [
{
"name": "p1_dhcp1",
"rapid_commit": false
}
],
"mac": "64:00:00:00:00:01",
"mtu": 1500,
"name": "p1_eth1"
}
],
"name": "p1_d1"
}
],
"ports": [
{
"location": "172.17.0.2:50071",
"name": "p1"
}
]
}

{
"devices": [
{
"dhcp_server": {
"ipv6_interfaces": [
{
"ipv6_name": "p2_ip1",
"leases": [
{
"ia_type": {
"choice": "iapd",
"iapd": {
"advertised_prefix_len": 64,
"configured_prefix_len": 64,
"prefix_size": 10,
"prefix_step": 1,
"start_prefix_address": "a1a1::0"
}
},
"lease_time": 86400
}
],
"name": "p2_dhcp1",
"rapid_commit": false,
"reconfigure_via_relay_agent": false.
}
]
},
"ethernets": [
{
"connection": {
"choice": "port_name",
"port_name": "p2"
},
"ipv6_addresses": [
{
"address": "2000:0:0:1::2",
"gateway": "2000:0:0:1::1",
"name": "p2_ip1",
"prefix": 64
}
],
"mac": "64:00:00:00:00:01",
"mtu": 1500,
"name": "p1_eth1"
}
],
"name": "p1_d1"
}
],
"ports": [
{
"location": "172.17.0.3:50071",
"name": "p2"
}
]
}
// This example basically focuses on how flows can be created for dhcp configurations

config := gosnappi.NewConfig()

// skipping configuration of ports, devices, and common protocols like ethernet

// Configure a DHCP Client on device 1
d1Eth1.DhcpV6Interfaces().Add().
SetName("p1d1dchpv6client")

// configure ipv4 on device 2
d2Eth1.
Ipv4Addresses().
Add().
SetName("p2d1ipv6").
SetAddress("2000:0:0:1::2").
SetGateway("2000:0:0:1::1").
SetPrefix(64)

// Configure a DHCP Server on device 2
d2Dhcpv6Server := d6.DhcpServer().Ipv6Interfaces().Add().SetName("p2d2dhcpv6server")

d2Dhcpv6Server.SetIpv6Name("p2d1ipv6").Leases().Add().
SetName("pool1").
SetLeaseTime(3600).
IaType("iapd").
SetStartPrefixAddrress("a1a1::0").
SetStep("0:0:0:1:0:0:0:0")

// configure flow from dhcp client to ipv4 interface on dhcp server side
f1 := config.Flows().Items()[0]
f1.SetName(p1.Name() + " -> " + p2.Name()).
TxRx().Device().
SetTxNames([]string{"p1d1dhcpv6client"}).
SetRxNames([]string{"p2d1ipv6"})

f1Eth := f1.Packet().Add().Ethernet()
f1Eth.Src().SetValue(d1Eth1.Mac())
f1Eth.Dst().Auto()

f1Ip := f1.Packet().Add().Ipv6()
// will be populated automatically with the the dynamically allocated Ip to DHCP client
f1Ip.Src().Auto().Dhcp()
f1Ip.Dst().SetValue("2000:0:0:1::2")

// configure flow from ipv4 interface on the dhcp server side to DHCP client
f2 := config.Flows().Items()[1]
f2.SetName(p2.Name() + " -> " + p1.Name()).
TxRx().Device().
SetTxNames([]string{"p2d1ipv6")}).
SetRxNames([]string{"p1d1dhcpv6client"})

f2Eth := f2.Packet().Add().Ethernet()
f2Eth.Src().SetValue(d2Eth1.Mac())
f2Eth.Dst().Auto()

f2Ip := f2.Packet().Add().Ipv6()
f2Ip.Src().SetValue("2000:0:0:1::2")
// will be populated automatically with the the dynamically allocated Ip to DHCP client
f2Ip.Dst().Auto().Dhcp()

Copy link
Contributor

@biplamal biplamal left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@apratimmukherjee apratimmukherjee merged commit 94f166a into master Aug 28, 2024
@apratimmukherjee apratimmukherjee deleted the dhcpv6_li_fix branch August 28, 2024 06:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants