mirror of
				https://github.com/Telecominfraproject/ols-nos.git
				synced 2025-11-03 19:47:56 +00:00 
			
		
		
		
	- Why I did it Fixes #11431 - How I did it dhcp6relay binds to ipv6 addresses configured on these vlan interfaces Thus check if they are ready before launching dhcp6relay - How to verify it Unit Tests Tested on a live device Signed-off-by: Vivek Reddy Karri <vkarri@nvidia.com>
		
			
				
	
	
		
			72 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Django/Jinja
		
	
	
	
	
	
			
		
		
	
	
			72 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Django/Jinja
		
	
	
	
	
	
#!/usr/bin/env bash
 | 
						|
 | 
						|
function wait_until_iface_ready
 | 
						|
{
 | 
						|
    IFACE_NAME=$1
 | 
						|
    IFACE_CIDR=$2
 | 
						|
 | 
						|
    echo "Waiting until interface ${IFACE_NAME} is ready..."
 | 
						|
 | 
						|
    # Wait for the interface to come up
 | 
						|
    # (i.e., interface is present in STATE_DB and state is "ok")
 | 
						|
    while true; do
 | 
						|
        RESULT=$(sonic-db-cli STATE_DB HGET "INTERFACE_TABLE|${IFACE_NAME}|${IFACE_CIDR}" "state" 2> /dev/null)
 | 
						|
        if [ x"$RESULT" == x"ok" ]; then
 | 
						|
            break
 | 
						|
        fi
 | 
						|
 | 
						|
        sleep 1
 | 
						|
    done
 | 
						|
 | 
						|
    echo "Interface ${IFACE_NAME} is ready!"
 | 
						|
}
 | 
						|
 | 
						|
function check_for_ipv6_link_local
 | 
						|
{
 | 
						|
    IFACE_NAME=$1
 | 
						|
    echo "Waiting until interface ${IFACE_NAME} has a link-local ipv6 address configured...."
 | 
						|
 | 
						|
    # Status of link local address is not populated in STATE_DB
 | 
						|
    while true; do
 | 
						|
        HAS_LL=$(ip -6 addr show ${IFACE_NAME} scope link 2> /dev/null)
 | 
						|
        RC=$?
 | 
						|
        if [[ ${RC} == "0" ]] && [[ ! -z ${HAS_LL} ]]; then
 | 
						|
            break
 | 
						|
        fi
 | 
						|
 | 
						|
        sleep 1
 | 
						|
    done
 | 
						|
 | 
						|
    echo "Link-Local address is configured on ${IFACE_NAME}"
 | 
						|
}
 | 
						|
 | 
						|
# Wait for all interfaces with IPv4 addresses to be up and ready
 | 
						|
# dhcp6relay binds to ipv6 addresses configured on these vlan ifaces
 | 
						|
# Thus check if they are ready before launching dhcp6relay
 | 
						|
{% for (name, prefix) in INTERFACE|pfx_filter %}
 | 
						|
{% if prefix | ipv4 %}
 | 
						|
wait_until_iface_ready {{ name }} {{ prefix }}
 | 
						|
{% endif %}
 | 
						|
{% endfor %}
 | 
						|
{% for (name, prefix) in VLAN_INTERFACE|pfx_filter %}
 | 
						|
{% if prefix | ipv4 %}
 | 
						|
wait_until_iface_ready {{ name }} {{ prefix }}
 | 
						|
{% endif %}
 | 
						|
{% if prefix | ipv6 %}
 | 
						|
{% if DHCP_RELAY and name in DHCP_RELAY %}
 | 
						|
wait_until_iface_ready {{ name }} {{ prefix }}
 | 
						|
check_for_ipv6_link_local {{ name }}
 | 
						|
{% endif %}
 | 
						|
{% endif %}
 | 
						|
{% endfor %}
 | 
						|
{% for (name, prefix) in PORTCHANNEL_INTERFACE|pfx_filter %}
 | 
						|
{% if prefix | ipv4 %}
 | 
						|
wait_until_iface_ready {{ name }} {{ prefix }}
 | 
						|
{% endif %}
 | 
						|
{% endfor %}
 | 
						|
 | 
						|
# Wait 10 seconds for the rest of interfaces to get added/populated.
 | 
						|
# dhcrelay listens on each of the interfaces (in addition to the port
 | 
						|
# channels and vlan interfaces)
 | 
						|
sleep 10
 |