module RAW_NS {

/* Osmocom NS test suite for NS in TTCN-3
 * (C) 2018-2019 Harald Welte <laforge@gnumonks.org>
 * All rights reserved.
 *
 * Released under the terms of GNU General Public License, Version 2 or
 * (at your option) any later version.
 *
 * SPDX-License-Identifier: GPL-2.0-or-later
 */

import from Misc_Helpers all;
import from General_Types all;
import from Osmocom_Types all;
import from Osmocom_Gb_Types all;
import from NS_Emulation all;
import from NS_Types all;
import from BSSGP_Types all;
import from NS_Emulation all;
import from Native_Functions all;
import from IPL4asp_Types all;
import from NS_Provider_IPL4 all;
#ifdef NS_EMULATION_FR
import from NS_Provider_FR all;
#endif

public type component RAW_NS_CT {
	/* UDP port towards the bottom (IUT) */
	port NS_PROVIDER_PT NSCP[4];
	var NS_Provider_IPL4_CT vc_NSP_IP[4];
#ifdef NS_EMULATION_FR
	var NS_Provider_FR_CT vc_NSP_FR[4];
#endif
	var NSConfiguration g_nsconfig;
	timer g_T_guard;
}

public altstep as_Tguard() runs on RAW_NS_CT {
	[] g_T_guard.timeout {
		setverdict(fail, "Timeout of T_guard");
		mtc.stop;
		}
}

function f_init_ns_codec(NSConfiguration ns_config, integer idx := 0, float guard_secs := 60.0, charstring id := testcasename()) runs on RAW_NS_CT {
	var Result res;

	if (not g_T_guard.running) {
		g_T_guard.start(guard_secs);
		activate(as_Tguard());
	}

	if (not isbound(g_nsconfig)) {
		g_nsconfig := ns_config;
	}

	if (ischosen(ns_config.nsvc[idx].provider.ip)) {
		/* Connect the UDP socket */
		vc_NSP_IP[idx] := NS_Provider_IPL4_CT.create(id & "-provIP");
		connect(self:NSCP[idx], vc_NSP_IP[idx]:NSE);
		vc_NSP_IP[idx].start(NS_Provider_IPL4.main(ns_config.nsvc[idx], ns_config, id));
#ifdef NS_EMULATION_FR
	} else if (ischosen(ns_config.nsvc[idx].provider.fr)) {
		vc_NSP_FR[idx] := NS_Provider_FR_CT.create(id & "-provFR");
		connect(self:NSCP[idx], vc_NSP_FR[idx]:NSE);
		vc_NSP_FR[idx].start(NS_Provider_FR.main(ns_config.nsvc[idx], ns_config, id));
#endif
	} else {
		Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, "Unsupported NS provider");
	}

	NSCP[idx].receive(NS_Provider_Evt:{link_status:=NS_PROV_LINK_STATUS_UP});
}

function f_clean_ns_codec() runs on RAW_NS_CT {
	for (var integer i := 0; i < lengthof(vc_NSP_IP); i := i + 1) {
		vc_NSP_IP[i].stop;
	}
#ifdef NS_EMULATION_FR
	for (var integer i := 0; i < lengthof(vc_NSP_FR); i := i + 1) {
		vc_NSP_FR[i].stop;
	}
#endif NS_EMULATION_FR
}

public altstep ax_rx_fail_on_any_ns(integer idx := 0) runs on RAW_NS_CT {
	var PDU_NS nrf;
	[] NSCP[idx].receive(PDU_NS: ?) -> value nrf {
		setverdict(fail, "Received unexpected NS: ", nrf);
		mtc.stop;
		}
}

function f_ns_exp(template PDU_NS exp_rx, integer idx := 0) runs on RAW_NS_CT return PDU_NS {
	var PDU_NS nrf;
	log("f_ns_exp() expecting ", exp_rx);
	/* last activated altstep has the lowest priority */
	var default d := activate(ax_rx_fail_on_any_ns());
	alt {
	[] NSCP[idx].receive(PDU_NS: exp_rx) -> value nrf { }
	}
	deactivate(d);
	return nrf;
}

/* perform outbound NS-ALIVE procedure */
function f_outgoing_ns_alive(integer idx := 0) runs on RAW_NS_CT {
	NSCP[idx].send(t_NS_ALIVE);
	alt {
	[] NSCP[idx].receive(t_NS_ALIVE_ACK);
	[] NSCP[idx].receive { repeat; }
	}
}

/* perform outbound NS-ALIVE procedure */
function f_outgoing_ns_alive_no_ack(integer idx := 0, float tout := 10.0) runs on RAW_NS_CT {
	timer T := tout;
	NSCP[idx].send(t_NS_ALIVE);
	T.start;
	alt {
	[] NSCP[idx].receive(t_NS_ALIVE_ACK) {
		setverdict(fail, "Received unexpected NS-ALIVE ACK");
		}
	[] NSCP[idx].receive { repeat; }
	[] T.timeout {
		setverdict(pass);
		}
	}
}

function f_outgoing_ns_reset(integer idx := 0, float tout := 10.0) runs on RAW_NS_CT {
	timer T := tout;
	var template PDU_NS reset := ts_NS_RESET(NS_CAUSE_EQUIPMENT_FAILURE, g_nsconfig.nsvc[idx].nsvci, g_nsconfig.nsei)
	NSCP[idx].send(reset);
	T.start;
	alt {
	[] NSCP[idx].receive(ts_NS_RESET_ACK(g_nsconfig.nsvc[idx].nsvci, g_nsconfig.nsei)) {
		setverdict(pass);
		}
	[] NSCP[idx].receive { repeat; }
	[] T.timeout {
		setverdict(fail, "Failed to receive a RESET ACK");
		}
	}
}

/* perform outbound NS-BLOCK procedure */
function f_outgoing_ns_block(NsCause cause, integer idx := 0) runs on RAW_NS_CT {
	NSCP[idx].send(ts_NS_BLOCK(cause, g_nsconfig.nsvc[idx].nsvci));
	alt {
	[] NSCP[idx].receive(tr_NS_BLOCK_ACK(g_nsconfig.nsvc[idx].nsvci));
	[] NSCP[idx].receive { repeat; }
	}
}

/* perform outbound NS-UNBLOCK procedure */
function f_outgoing_ns_unblock(integer idx := 0) runs on RAW_NS_CT {
	NSCP[idx].send(t_NS_UNBLOCK);
	alt {
	[] NSCP[idx].receive(t_NS_UNBLOCK_ACK);
	[] NSCP[idx].receive { repeat; }
	}
}

/* receive NS-ALIVE and ACK it */
altstep as_rx_alive_tx_ack(boolean oneshot := false, integer idx := 0) runs on RAW_NS_CT {
	[] NSCP[idx].receive(t_NS_ALIVE) {
		NSCP[idx].send(t_NS_ALIVE_ACK);
		if (not oneshot) { repeat; }
		}
}

/* Transmit BSSGP RESET for given BVCI and expect ACK */
function f_tx_bvc_reset_rx_ack(BssgpBvci bvci, template (omit) BssgpCellId tx_cell_id, template BssgpCellId rx_cell_id,
			       integer idx := 0, boolean exp_ack := true)
runs on RAW_NS_CT {
	var PDU_BSSGP bssgp_tx := valueof(ts_BVC_RESET(BSSGP_CAUSE_NET_SV_CAP_MOD_GT_ZERO_KBPS, bvci,
						       tx_cell_id));
	timer T := 5.0;
	NSCP[idx].send(ts_NS_UNITDATA(t_SduCtrlB, 0, enc_PDU_BSSGP(bssgp_tx)));
	T.start;
	alt {
	[exp_ack] NSCP[idx].receive(tr_NS_UNITDATA(t_SduCtrlB, 0,
						   decmatch tr_BVC_RESET_ACK(bvci, rx_cell_id))) {
		setverdict(pass);
		}
	[exp_ack] T.timeout {
		setverdict(fail, "No response to BVC-RESET");
		}
	[not exp_ack] T.timeout {
		setverdict(pass);
		}
	[] NSCP[idx].receive { repeat; }
	}
}

/* Receive a BSSGP RESET for given BVCI and ACK it */
altstep as_rx_bvc_reset_tx_ack(BssgpBvci bvci, template BssgpCellId rx_cell_id, template (omit) BssgpCellId tx_cell_id,
				boolean oneshot := false, integer idx := 0) runs on RAW_NS_CT {
	var PDU_NS ns_rf;
	[] NSCP[idx].receive(tr_NS_UNITDATA(t_SduCtrlB, 0,
						  decmatch tr_BVC_RESET(?, bvci, rx_cell_id)))
								-> value ns_rf {
		var PDU_BSSGP bssgp_rx := dec_PDU_BSSGP(ns_rf.pDU_NS_Unitdata.nS_SDU);
		var PDU_BSSGP bssgp_tx := valueof(ts_BVC_RESET_ACK(bvci, tx_cell_id));
		NSCP[idx].send(ts_NS_UNITDATA(t_SduCtrlB, 0, enc_PDU_BSSGP(bssgp_tx)));
		if (not oneshot) { repeat; }
		}
}


/* Receive a BSSGP UNBLOCK for given BVCI and ACK it */
altstep as_rx_bvc_unblock_tx_ack(BssgpBvci bvci, boolean oneshot := false, integer idx := 0) runs on RAW_NS_CT {
	var PDU_NS ns_rf;
	[] NSCP[idx].receive(tr_NS_UNITDATA(t_SduCtrlB, 0, decmatch tr_BVC_UNBLOCK(bvci))) -> value ns_rf {
		var PDU_BSSGP bssgp_rx := dec_PDU_BSSGP(ns_rf.pDU_NS_Unitdata.nS_SDU);
		var PDU_BSSGP bssgp_tx := valueof(ts_BVC_UNBLOCK_ACK(bvci));
		NSCP[idx].send(ts_NS_UNITDATA(t_SduCtrlB, 0, enc_PDU_BSSGP(bssgp_tx)));
		if (not oneshot) { repeat; }
		}
}

/* Receive a BSSGP FLOW-CONTROL-BVC and ACK it */
altstep as_rx_bvc_fc_tx_ack(BssgpBvci bvci, boolean oneshot := false, integer idx := 0) runs on RAW_NS_CT {
	var PDU_NS ns_rf;
	[] NSCP[idx].receive(tr_NS_UNITDATA(t_SduCtrlB, bvci,
					    decmatch tr_BVC_FC_BVC))
								-> value ns_rf {
		var PDU_BSSGP bssgp_rx := dec_PDU_BSSGP(ns_rf.pDU_NS_Unitdata.nS_SDU);
		var OCT1 tag := bssgp_rx.pDU_BSSGP_FLOW_CONTROL_BVC.tag.unstructured_Value;
		var PDU_BSSGP bssgp_tx := valueof(ts_BVC_FC_BVC_ACK(tag));
		NSCP[idx].send(ts_NS_UNITDATA(t_SduCtrlB, bvci, enc_PDU_BSSGP(bssgp_tx)));
		if (not oneshot) { repeat; }
		}
}

/**********************************************************************************
 * Classic Gb/IP bring-up test cases using NS-{RESET,BLOCK,UNBLOCK} and no IP-SNS *
 **********************************************************************************/

/* Receive a NS-RESET and ACK it */
public altstep as_rx_ns_reset_ack(boolean oneshot := false, integer idx := 0) runs on RAW_NS_CT {
	var PDU_NS ns_rf;
	[] NSCP[idx].receive(tr_NS_RESET(NS_CAUSE_OM_INTERVENTION, g_nsconfig.nsvc[idx].nsvci,
						  g_nsconfig.nsei)) -> value ns_rf {
		NSCP[idx].send(ts_NS_RESET_ACK(g_nsconfig.nsvc[idx].nsvci, g_nsconfig.nsei));
		if (not oneshot) { repeat; }
		}
}
/* Receive a NS-UNBLOCK and ACK it */
public altstep as_rx_ns_unblock_ack(boolean oneshot := false, integer idx := 0) runs on RAW_NS_CT {
	var PDU_NS ns_rf;
	[] NSCP[idx].receive(t_NS_UNBLOCK) -> value ns_rf {
		NSCP[idx].send(t_NS_UNBLOCK_ACK);
		if (not oneshot) { repeat; }
		}
}

/* Receive a NS-BLOCK and ACK it */
public altstep as_rx_ns_block_ack(boolean oneshot := false, integer idx := 0, template NsCause cause := *, template Nsvci nsvci := *) runs on RAW_NS_CT {
	var PDU_NS ns_rf;
	[] NSCP[idx].receive(tr_NS_BLOCK(cause, nsvci)) -> value ns_rf {
		NSCP[idx].send(ts_NS_BLOCK_ACK(oct2int(ns_rf.pDU_NS_Block.nS_VCI.nS_VCI)));
		if (not oneshot) { repeat; }
		}
}

/**********************************************************************************
 * IP Sub-Network Service (SNS)
 **********************************************************************************/

/* perform inbound SNS-SIZE procedure */
function f_incoming_sns_size(template (omit) NsCause cause := omit, integer idx := 0)
runs on RAW_NS_CT {
	log("f_incoming_sns_size(idx=", idx, ")");
	var PDU_NS rx;
	var NSVCConfiguration nsvc_cfg := g_nsconfig.nsvc[idx];

	if (nsvc_cfg.provider.ip.address_family == AF_INET) {
		/* expect one single SNS-SIZE with RESET flag; 4x v4 EP; no v6 EP */
		rx := f_ns_exp(tr_SNS_SIZE(g_nsconfig.nsei, rst_flag := true, max_nsvcs := 8,
					   num_v4 := 4, num_v6 := omit), idx);
	} else {
		/* expect one single SNS-SIZE with RESET flag; no v4 EP; 4x v6 EP */
		rx := f_ns_exp(tr_SNS_SIZE(g_nsconfig.nsei, rst_flag := true, max_nsvcs := 8,
					   num_v4 := omit, num_v6 := 4), idx);
	}
	NSCP[idx].send(ts_SNS_SIZE_ACK(g_nsconfig.nsei, cause));
}

/* perform outbound SNS-SIZE procedure */
function f_outgoing_sns_size(template (omit) NsCause cause := omit, integer idx:= 0)
runs on RAW_NS_CT {
	log("f_outgoing_sns_size(idx=", idx, ")");
	var PDU_NS rx;
	var NSVCConfiguration nsvc_cfg := g_nsconfig.nsvc[idx];

	if (nsvc_cfg.provider.ip.address_family == AF_INET) {
		NSCP[idx].send(ts_SNS_SIZE(g_nsconfig.nsei, rst_flag := true, max_nsvcs := 1,
								num_v4 := 1, num_v6 := omit)
					);
	} else {
		NSCP[idx].send(ts_SNS_SIZE(g_nsconfig.nsei, rst_flag := true, max_nsvcs := 1,
								num_v4 := omit, num_v6 := 1)
					);
	}
	/* expect one single SNS-SIZE with RESET flag; 4x v4 EP; no v6 EP */
	rx := f_ns_exp(tr_SNS_SIZE_ACK(g_nsconfig.nsei, cause), idx);
}

/* perform inbound SNS-CONFIG procedure */
function f_incoming_sns_config(template (omit) NsCause cause := omit, integer idx := 0)
runs on RAW_NS_CT {
	log("f_incoming_sns_config(idx=", idx, ")");
	var PDU_NS rx;
	var NSVCConfiguration nsvc_cfg := g_nsconfig.nsvc[idx];

	if (nsvc_cfg.provider.ip.address_family == AF_INET) {
		var template IP4_Elements v4_elem := { tr_SNS_IPv4(nsvc_cfg.provider.ip.remote_ip,
								   nsvc_cfg.provider.ip.remote_udp_port) };
		rx := f_ns_exp(tr_SNS_CONFIG(g_nsconfig.nsei, end_flag := true, v4 := v4_elem), idx);
	} else {
		var template IP6_Elements v6_elem := { tr_SNS_IPv6(nsvc_cfg.provider.ip.remote_ip,
								   nsvc_cfg.provider.ip.remote_udp_port) };
		rx := f_ns_exp(tr_SNS_CONFIG(g_nsconfig.nsei, end_flag := true, v6 := v6_elem), idx);
	}
	NSCP[idx].send(ts_SNS_CONFIG_ACK(g_nsconfig.nsei, cause));
}

/* perform outbound SNS-CONFIG procedure */
function f_outgoing_sns_config(template (omit) NsCause cause := omit, integer idx := 0)
runs on RAW_NS_CT {
	log("f_outgoing_sns_config(idx=", idx, ")");
	var PDU_NS rx;
	var NSVCConfiguration nsvc_cfg := g_nsconfig.nsvc[idx];

	if (nsvc_cfg.provider.ip.address_family == AF_INET) {
		var template (omit) IP4_Elements v4 := { ts_SNS_IPv4(nsvc_cfg.provider.ip.local_ip,
								     nsvc_cfg.provider.ip.local_udp_port) }
		NSCP[idx].send(ts_SNS_CONFIG(g_nsconfig.nsei, true, v4));
	} else {
		var template (omit) IP6_Elements v6 := { ts_SNS_IPv6(nsvc_cfg.provider.ip.local_ip,
								     nsvc_cfg.provider.ip.local_udp_port) }
		NSCP[idx].send(ts_SNS_CONFIG(g_nsconfig.nsei, true, omit, v6));
	}
	rx := f_ns_exp(tr_SNS_CONFIG_ACK(g_nsconfig.nsei, cause), idx);
}

/* perform outbound SNS-CONFIG procedure (separate endpoints: 1 for control, 1 for user */
function f_outgoing_sns_config_1c1u(template (omit) NsCause cause := omit, integer idx := 0)
runs on RAW_NS_CT {
	log("f_outgoing_sns_config_1c1u(idx=", idx, ")");
	var PDU_NS rx;

	if (g_nsconfig.nsvc[0].provider.ip.address_family == AF_INET) {
		var template (omit) IP4_Elements v4 := { ts_SNS_IPv4(g_nsconfig.nsvc[0].provider.ip.local_ip,
								     g_nsconfig.nsvc[0].provider.ip.local_udp_port, 1, 0),
							 ts_SNS_IPv4(g_nsconfig.nsvc[1].provider.ip.local_ip,
								     g_nsconfig.nsvc[1].provider.ip.local_udp_port, 0, 1) };
		NSCP[idx].send(ts_SNS_CONFIG(g_nsconfig.nsei, true, v4));
	} else {
		var template (omit) IP6_Elements v6 := { ts_SNS_IPv6(g_nsconfig.nsvc[0].provider.ip.local_ip,
								     g_nsconfig.nsvc[0].provider.ip.local_udp_port, 1, 0),
							 ts_SNS_IPv6(g_nsconfig.nsvc[1].provider.ip.local_ip,
								     g_nsconfig.nsvc[1].provider.ip.local_udp_port, 0, 1) };
		NSCP[idx].send(ts_SNS_CONFIG(g_nsconfig.nsei, true, omit, v6));
	}
	rx := f_ns_exp(tr_SNS_CONFIG_ACK(g_nsconfig.nsei, cause), idx);
}

/* perform outbound SNS-CONFIG procedure (separate endpoints: 1 for control, 1 for user */
function f_outgoing_sns_config_1c1u_separate(template (omit) NsCause cause := omit, integer idx := 0)
runs on RAW_NS_CT {
	log("f_outgoing_sns_config_1c1u_separate(idx=", idx, ")");
	var PDU_NS rx;
	if (g_nsconfig.nsvc[0].provider.ip.address_family == AF_INET) {
		var template (omit) IP4_Elements v4 := { ts_SNS_IPv4(g_nsconfig.nsvc[1].provider.ip.local_ip,
								     g_nsconfig.nsvc[1].provider.ip.local_udp_port, 1, 0),
							 ts_SNS_IPv4(g_nsconfig.nsvc[2].provider.ip.local_ip,
								     g_nsconfig.nsvc[2].provider.ip.local_udp_port, 0, 1) };
		NSCP[idx].send(ts_SNS_CONFIG(g_nsconfig.nsei, true, v4));
	} else {
		var template (omit) IP6_Elements v6 := { ts_SNS_IPv6(g_nsconfig.nsvc[1].provider.ip.local_ip,
								     g_nsconfig.nsvc[1].provider.ip.local_udp_port, 1, 0),
							 ts_SNS_IPv6(g_nsconfig.nsvc[2].provider.ip.local_ip,
								     g_nsconfig.nsvc[2].provider.ip.local_udp_port, 0, 1) };
		NSCP[idx].send(ts_SNS_CONFIG(g_nsconfig.nsei, true, omit, v6));
	}
	rx := f_ns_exp(tr_SNS_CONFIG_ACK(g_nsconfig.nsei, cause), idx);
}

/* perform inbound SNS-CHANGE-WEIGHT procedure */
function f_incoming_sns_chg_weight(template (omit) NsCause cause := omit, integer idx := 0)
runs on RAW_NS_CT {
	log("f_incoming_sns_chg_weight(idx=", idx, ")");
	var PDU_NS rx;
	var NSVCConfiguration nsvc_cfg := g_nsconfig.nsvc[idx];

	if (nsvc_cfg.provider.ip.address_family == AF_INET) {
		var template IP4_Elements v4_elem := { tr_SNS_IPv4(nsvc_cfg.provider.ip.remote_ip,
								   nsvc_cfg.provider.ip.remote_udp_port) };
		rx := f_ns_exp(tr_SNS_CHG_WEIGHT(g_nsconfig.nsei, ?, v4 := v4_elem), idx);
	} else {
		var template IP6_Elements v6_elem := { tr_SNS_IPv6(nsvc_cfg.provider.ip.remote_ip,
								   nsvc_cfg.provider.ip.remote_udp_port) };
		rx := f_ns_exp(tr_SNS_CHG_WEIGHT(g_nsconfig.nsei, ?, v4 := omit, v6 := v6_elem), idx);
	}
	NSCP[idx].send(ts_SNS_ACK(g_nsconfig.nsei, rx.pDU_SNS_ChangeWeight.transactionID));
}


function f_outgoing_sns_add(integer idx_add, uint8_t w_sig := 1, uint8_t w_user := 1, integer idx := 0, template (omit) NsCause cause := omit)
runs on RAW_NS_CT {
	log("f_outgoing_sns_add(idx_add=", idx_add, ")");
	var PDU_NS rx;
	var NSVCConfiguration nsvc_cfg := g_nsconfig.nsvc[idx_add];
	if (nsvc_cfg.provider.ip.address_family == AF_INET) {
		var template (omit) IP4_Elements v4 := { ts_SNS_IPv4(nsvc_cfg.provider.ip.local_ip,
								     nsvc_cfg.provider.ip.local_udp_port,
								     w_sig, w_user) };
		NSCP[idx].send(ts_SNS_ADD(g_nsconfig.nsei, 23, v4));
		rx := f_ns_exp(tr_SNS_ACK(g_nsconfig.nsei, 23, cause, v4));
	} else {
		var template (omit) IP6_Elements v6 := { ts_SNS_IPv6(nsvc_cfg.provider.ip.local_ip,
								     nsvc_cfg.provider.ip.local_udp_port,
								     w_sig, w_user) };
		NSCP[idx].send(ts_SNS_ADD(g_nsconfig.nsei, 23, omit, v6));
		rx := f_ns_exp(tr_SNS_ACK(g_nsconfig.nsei, 23, cause, omit, v6));
	}
}

function f_outgoing_sns_del(integer idx_del, uint8_t w_sig := 1, uint8_t w_user := 1, integer idx := 0)
runs on RAW_NS_CT {
	log("f_outgoing_sns_del(idx_del=", idx_del, ")");
	var PDU_NS rx;
	var NSVCConfiguration nsvc_cfg := g_nsconfig.nsvc[idx_del];
	if (nsvc_cfg.provider.ip.address_family == AF_INET) {
		var template (omit) IP4_Elements v4 := { ts_SNS_IPv4(nsvc_cfg.provider.ip.local_ip,
								     nsvc_cfg.provider.ip.local_udp_port,
								     w_sig, w_user) };
		NSCP[idx].send(ts_SNS_DEL(g_nsconfig.nsei, 24, omit, v4));
		rx := f_ns_exp(tr_SNS_ACK(g_nsconfig.nsei, 24, omit, v4));
	} else {
		var template (omit) IP6_Elements v6 := { ts_SNS_IPv6(nsvc_cfg.provider.ip.local_ip,
								     nsvc_cfg.provider.ip.local_udp_port,
								     w_sig, w_user) };
		NSCP[idx].send(ts_SNS_DEL(g_nsconfig.nsei, 24, omit, omit, v6));
		rx := f_ns_exp(tr_SNS_ACK(g_nsconfig.nsei, 24, omit, omit, v6));
	}
}

function f_outgoing_sns_chg_weight(integer idx_chg, uint8_t w_sig, uint8_t w_user, integer idx := 0)
runs on RAW_NS_CT {
	log("f_outgoing_sns_chg_weight(idx_chg=", idx_chg, ")");
	var PDU_NS rx;
	var NSVCConfiguration nsvc_cfg := g_nsconfig.nsvc[idx_chg];
	if (nsvc_cfg.provider.ip.address_family == AF_INET) {
		var template (omit) IP4_Elements v4 := { ts_SNS_IPv4(nsvc_cfg.provider.ip.local_ip,
								     nsvc_cfg.provider.ip.local_udp_port,
								     w_sig, w_user) };
		NSCP[idx].send(ts_SNS_CHG_WEIGHT(g_nsconfig.nsei, 25, v4));
		rx := f_ns_exp(tr_SNS_ACK(g_nsconfig.nsei, 25, omit, v4));
	} else {
		var template (omit) IP6_Elements v6 := { ts_SNS_IPv6(nsvc_cfg.provider.ip.local_ip,
								     nsvc_cfg.provider.ip.local_udp_port,
								     w_sig, w_user) };
		NSCP[idx].send(ts_SNS_CHG_WEIGHT(g_nsconfig.nsei, 25, omit, v6));
		rx := f_ns_exp(tr_SNS_ACK(g_nsconfig.nsei, 25, omit, omit, v6));
	}
}

}
