11d68314aSopenharmony_cidiff -urN libnl-3.7.0/include/linux-private/linux/if_bridge.h libnl-3.7.0_new/include/linux-private/linux/if_bridge.h
21d68314aSopenharmony_ci--- libnl-3.7.0/include/linux-private/linux/if_bridge.h	2022-05-04 00:50:34.000000000 +0800
31d68314aSopenharmony_ci+++ libnl-3.7.0_new/include/linux-private/linux/if_bridge.h	2024-06-03 17:46:47.872030900 +0800
41d68314aSopenharmony_ci@@ -16,7 +16,7 @@
51d68314aSopenharmony_ci 
61d68314aSopenharmony_ci #include <linux/types.h>
71d68314aSopenharmony_ci #include <linux/if_ether.h>
81d68314aSopenharmony_ci-#include <linux/in6.h>
91d68314aSopenharmony_ci+#include <netinet/in.h>
101d68314aSopenharmony_ci 
111d68314aSopenharmony_ci #define SYSFS_BRIDGE_ATTR	"bridge"
121d68314aSopenharmony_ci #define SYSFS_BRIDGE_FDB	"brforward"
131d68314aSopenharmony_cidiff -urN libnl-3.7.0/include/netlink-private/nl-auto.h libnl-3.7.0_new/include/netlink-private/nl-auto.h
141d68314aSopenharmony_ci--- libnl-3.7.0/include/netlink-private/nl-auto.h	2022-05-24 16:55:12.000000000 +0800
151d68314aSopenharmony_ci+++ libnl-3.7.0_new/include/netlink-private/nl-auto.h	2024-06-03 17:37:51.785691800 +0800
161d68314aSopenharmony_ci@@ -99,4 +99,11 @@
171d68314aSopenharmony_ci #define _nl_auto_nl_socket _nl_auto(_nl_auto_nl_socket_fcn)
181d68314aSopenharmony_ci _NL_AUTO_DEFINE_FCN_TYPED0(struct nl_sock *, _nl_auto_nl_socket_fcn, nl_socket_free);
191d68314aSopenharmony_ci 
201d68314aSopenharmony_ci+struct xfrmnl_user_tmpl;
211d68314aSopenharmony_ci+void xfrmnl_user_tmpl_free(struct xfrmnl_user_tmpl *utmpl);
221d68314aSopenharmony_ci+#define _nl_auto_xfrmnl_user_tmpl _nl_auto(_nl_auto_xfrmnl_user_tmpl_fcn)
231d68314aSopenharmony_ci+_NL_AUTO_DEFINE_FCN_TYPED0(struct xfrmnl_user_tmpl *,
241d68314aSopenharmony_ci+			   _nl_auto_xfrmnl_user_tmpl_fcn,
251d68314aSopenharmony_ci+			   xfrmnl_user_tmpl_free);
261d68314aSopenharmony_ci+
271d68314aSopenharmony_ci #endif /* NETLINK_NL_AUTO_H_ */
281d68314aSopenharmony_cidiff -urN libnl-3.7.0/include/netlink-private/utils.h libnl-3.7.0_new/include/netlink-private/utils.h
291d68314aSopenharmony_ci--- libnl-3.7.0/include/netlink-private/utils.h	2022-05-24 16:55:12.000000000 +0800
301d68314aSopenharmony_ci+++ libnl-3.7.0_new/include/netlink-private/utils.h	2024-06-03 17:36:49.655447000 +0800
311d68314aSopenharmony_ci@@ -361,8 +361,7 @@
321d68314aSopenharmony_ci 	struct in6_addr a6;
331d68314aSopenharmony_ci } _NLIPAddr;
341d68314aSopenharmony_ci 
351d68314aSopenharmony_ci-static inline char *_nl_inet_ntop(int addr_family, const void *addr,
361d68314aSopenharmony_ci-				  char buf[static INET_ADDRSTRLEN])
371d68314aSopenharmony_ci+static inline char *_nl_inet_ntop(int addr_family, const void *addr, char *buf)
381d68314aSopenharmony_ci {
391d68314aSopenharmony_ci 	char *r;
401d68314aSopenharmony_ci 
411d68314aSopenharmony_cidiff -urN libnl-3.7.0/lib/attr.c libnl-3.7.0_new/lib/attr.c
421d68314aSopenharmony_ci--- libnl-3.7.0/lib/attr.c	2022-07-06 23:01:59.000000000 +0800
431d68314aSopenharmony_ci+++ libnl-3.7.0_new/lib/attr.c	2024-06-03 17:39:30.549111300 +0800
441d68314aSopenharmony_ci@@ -349,10 +349,13 @@
451d68314aSopenharmony_ci 
461d68314aSopenharmony_ci 	if (!src)
471d68314aSopenharmony_ci 		return 0;
481d68314aSopenharmony_ci-	
491d68314aSopenharmony_ci+
501d68314aSopenharmony_ci 	minlen = min_t(int, count, nla_len(src));
511d68314aSopenharmony_ci-	memcpy(dest, nla_data(src), minlen);
521d68314aSopenharmony_ci 
531d68314aSopenharmony_ci+	if (minlen <= 0)
541d68314aSopenharmony_ci+		return 0;
551d68314aSopenharmony_ci+
561d68314aSopenharmony_ci+	memcpy(dest, nla_data(src), minlen);
571d68314aSopenharmony_ci 	return minlen;
581d68314aSopenharmony_ci }
591d68314aSopenharmony_ci 
601d68314aSopenharmony_ci@@ -988,6 +991,15 @@
611d68314aSopenharmony_ci {
621d68314aSopenharmony_ci 	ssize_t len;
631d68314aSopenharmony_ci 
641d68314aSopenharmony_ci+	if (!attr) {
651d68314aSopenharmony_ci+		/* For robustness, allow a NULL attr to do nothing. NULL is also
661d68314aSopenharmony_ci+		 * what nla_nest_start() when out of buffer space.
671d68314aSopenharmony_ci+		 *
681d68314aSopenharmony_ci+		 * Warning, before libnl-3.8, the function did not accept NULL!
691d68314aSopenharmony_ci+		 * If you care, catch NULL yourself. */
701d68314aSopenharmony_ci+		return;
711d68314aSopenharmony_ci+	}
721d68314aSopenharmony_ci+
731d68314aSopenharmony_ci 	len = (char *) nlmsg_tail(msg->nm_nlh) - (char *) attr;
741d68314aSopenharmony_ci 	if (len < 0)
751d68314aSopenharmony_ci 		BUG();
761d68314aSopenharmony_cidiff -urN libnl-3.7.0/lib/object.c libnl-3.7.0_new/lib/object.c
771d68314aSopenharmony_ci--- libnl-3.7.0/lib/object.c	2022-07-06 22:13:48.000000000 +0800
781d68314aSopenharmony_ci+++ libnl-3.7.0_new/lib/object.c	2024-06-03 17:41:15.060021200 +0800
791d68314aSopenharmony_ci@@ -392,7 +392,7 @@
801d68314aSopenharmony_ci 	diff = nl_object_diff64(a, b);
811d68314aSopenharmony_ci 
821d68314aSopenharmony_ci 	return (diff & ~((uint64_t) 0xFFFFFFFF))
831d68314aSopenharmony_ci-		? (uint32_t) diff | (1 << 31)
841d68314aSopenharmony_ci+		? (uint32_t) diff | (((uint32_t ) 1u) << 31)
851d68314aSopenharmony_ci 		: (uint32_t) diff;
861d68314aSopenharmony_ci }
871d68314aSopenharmony_ci 
881d68314aSopenharmony_cidiff -urN libnl-3.7.0/lib/route/cls/flower.c libnl-3.7.0_new/lib/route/cls/flower.c
891d68314aSopenharmony_ci--- libnl-3.7.0/lib/route/cls/flower.c	2022-07-06 23:02:41.000000000 +0800
901d68314aSopenharmony_ci+++ libnl-3.7.0_new/lib/route/cls/flower.c	2024-06-03 18:28:20.501852400 +0800
911d68314aSopenharmony_ci@@ -787,6 +787,7 @@
921d68314aSopenharmony_ci int rtnl_flower_append_action(struct rtnl_cls *cls, struct rtnl_act *act)
931d68314aSopenharmony_ci {
941d68314aSopenharmony_ci 	struct rtnl_flower *f;
951d68314aSopenharmony_ci+	int err;
961d68314aSopenharmony_ci 
971d68314aSopenharmony_ci 	if (!act)
981d68314aSopenharmony_ci 		return 0;
991d68314aSopenharmony_ci@@ -796,8 +797,11 @@
1001d68314aSopenharmony_ci 
1011d68314aSopenharmony_ci 	f->cf_mask |= FLOWER_ATTR_ACTION;
1021d68314aSopenharmony_ci 
1031d68314aSopenharmony_ci+	if ((err = rtnl_act_append(&f->cf_act, act)) < 0)
1041d68314aSopenharmony_ci+		return err;
1051d68314aSopenharmony_ci+
1061d68314aSopenharmony_ci 	rtnl_act_get(act);
1071d68314aSopenharmony_ci-	return rtnl_act_append(&f->cf_act, act);
1081d68314aSopenharmony_ci+	return 0;
1091d68314aSopenharmony_ci }
1101d68314aSopenharmony_ci 
1111d68314aSopenharmony_ci /**
1121d68314aSopenharmony_cidiff -urN libnl-3.7.0/lib/route/link/bridge.c libnl-3.7.0_new/lib/route/link/bridge.c
1131d68314aSopenharmony_ci--- libnl-3.7.0/lib/route/link/bridge.c	2022-05-24 16:55:12.000000000 +0800
1141d68314aSopenharmony_ci+++ libnl-3.7.0_new/lib/route/link/bridge.c	2024-06-03 16:55:11.850716100 +0800
1151d68314aSopenharmony_ci@@ -189,6 +189,7 @@
1161d68314aSopenharmony_ci 		if (nla_type(attr) == IFLA_BRIDGE_MODE) {
1171d68314aSopenharmony_ci 			bd->b_hwmode = nla_get_u16(attr);
1181d68314aSopenharmony_ci 			bd->ce_mask |= BRIDGE_ATTR_HWMODE;
1191d68314aSopenharmony_ci+			continue;
1201d68314aSopenharmony_ci 		} else if (nla_type(attr) != IFLA_BRIDGE_VLAN_INFO)
1211d68314aSopenharmony_ci 			continue;
1221d68314aSopenharmony_ci 
1231d68314aSopenharmony_cidiff -urN libnl-3.7.0/lib/route/link.c libnl-3.7.0_new/lib/route/link.c
1241d68314aSopenharmony_ci--- libnl-3.7.0/lib/route/link.c	2022-05-24 16:55:12.000000000 +0800
1251d68314aSopenharmony_ci+++ libnl-3.7.0_new/lib/route/link.c	2024-06-03 17:44:18.163118300 +0800
1261d68314aSopenharmony_ci@@ -115,7 +115,7 @@
1271d68314aSopenharmony_ci 	struct rtnl_link_af_ops *ops;
1281d68314aSopenharmony_ci 
1291d68314aSopenharmony_ci 	ops = rtnl_link_af_ops_lookup(af_type);
1301d68314aSopenharmony_ci-	if (ops && ops->ao_override_rtm(changes))
1311d68314aSopenharmony_ci+	if (ops && ops->ao_override_rtm && ops->ao_override_rtm(changes))
1321d68314aSopenharmony_ci 		return RTM_SETLINK;
1331d68314aSopenharmony_ci 
1341d68314aSopenharmony_ci 	return RTM_NEWLINK;
1351d68314aSopenharmony_cidiff -urN libnl-3.7.0/lib/route/tc.c libnl-3.7.0_new/lib/route/tc.c
1361d68314aSopenharmony_ci--- libnl-3.7.0/lib/route/tc.c	2022-05-24 16:55:12.000000000 +0800
1371d68314aSopenharmony_ci+++ libnl-3.7.0_new/lib/route/tc.c	2024-06-03 17:36:24.831904500 +0800
1381d68314aSopenharmony_ci@@ -666,14 +666,14 @@
1391d68314aSopenharmony_ci /**
1401d68314aSopenharmony_ci  * Calculate the binary logarithm for a specific cell size
1411d68314aSopenharmony_ci  * @arg cell_size	Size of cell, must be a power of two.
1421d68314aSopenharmony_ci- * @return Binary logirhtm of cell size or a negative error code.
1431d68314aSopenharmony_ci+ * @return Binary logarithm of cell size or a negative error code.
1441d68314aSopenharmony_ci  */
1451d68314aSopenharmony_ci int rtnl_tc_calc_cell_log(int cell_size)
1461d68314aSopenharmony_ci {
1471d68314aSopenharmony_ci 	int i;
1481d68314aSopenharmony_ci 
1491d68314aSopenharmony_ci 	for (i = 0; i < 32; i++)
1501d68314aSopenharmony_ci-		if ((1 << i) == cell_size)
1511d68314aSopenharmony_ci+		if ((((uint32_t)1u) << i) == cell_size)
1521d68314aSopenharmony_ci 			return i;
1531d68314aSopenharmony_ci 
1541d68314aSopenharmony_ci 	return -NLE_INVAL;
1551d68314aSopenharmony_cidiff -urN libnl-3.7.0/lib/socket.c libnl-3.7.0_new/lib/socket.c
1561d68314aSopenharmony_ci--- libnl-3.7.0/lib/socket.c	2022-05-24 16:55:12.000000000 +0800
1571d68314aSopenharmony_ci+++ libnl-3.7.0_new/lib/socket.c	2024-06-03 17:45:33.823477800 +0800
1581d68314aSopenharmony_ci@@ -54,6 +54,24 @@
1591d68314aSopenharmony_ci 	}
1601d68314aSopenharmony_ci }
1611d68314aSopenharmony_ci 
1621d68314aSopenharmony_ci+static uint32_t _badrandom_from_time(void)
1631d68314aSopenharmony_ci+{
1641d68314aSopenharmony_ci+	uint32_t result;
1651d68314aSopenharmony_ci+	uint64_t v64;
1661d68314aSopenharmony_ci+	time_t t;
1671d68314aSopenharmony_ci+
1681d68314aSopenharmony_ci+	t = time(NULL);
1691d68314aSopenharmony_ci+	v64 = (uint64_t)t;
1701d68314aSopenharmony_ci+	result = (uint32_t)v64;
1711d68314aSopenharmony_ci+
1721d68314aSopenharmony_ci+	/* XOR with the upper bits. Otherwise, coverity warns about only
1731d68314aSopenharmony_ci+	 * considering 32 bit from time_t.  Use the inverse, so that for the
1741d68314aSopenharmony_ci+	 * most part the bits don't change.  */
1751d68314aSopenharmony_ci+	result ^= (~(v64 >> 32));
1761d68314aSopenharmony_ci+
1771d68314aSopenharmony_ci+	return result;
1781d68314aSopenharmony_ci+}
1791d68314aSopenharmony_ci+
1801d68314aSopenharmony_ci static uint32_t used_ports_map[32];
1811d68314aSopenharmony_ci static NL_RW_LOCK(port_map_lock);
1821d68314aSopenharmony_ci 
1831d68314aSopenharmony_ci@@ -67,7 +85,7 @@
1841d68314aSopenharmony_ci 	nl_write_lock(&port_map_lock);
1851d68314aSopenharmony_ci 
1861d68314aSopenharmony_ci 	if (idx_state == 0) {
1871d68314aSopenharmony_ci-		uint32_t t = time(NULL);
1881d68314aSopenharmony_ci+		uint32_t t = _badrandom_from_time();
1891d68314aSopenharmony_ci 
1901d68314aSopenharmony_ci 		/* from time to time (on average each 2^15 calls), the idx_state will
1911d68314aSopenharmony_ci 		 * be zero again. No problem, just "seed" anew with time(). */
1921d68314aSopenharmony_ci@@ -184,7 +202,8 @@
1931d68314aSopenharmony_ci 	sk->s_cb = nl_cb_get(cb);
1941d68314aSopenharmony_ci 	sk->s_local.nl_family = AF_NETLINK;
1951d68314aSopenharmony_ci 	sk->s_peer.nl_family = AF_NETLINK;
1961d68314aSopenharmony_ci-	sk->s_seq_expect = sk->s_seq_next = time(NULL);
1971d68314aSopenharmony_ci+	sk->s_seq_next = _badrandom_from_time();
1981d68314aSopenharmony_ci+	sk->s_seq_expect = sk->s_seq_next;
1991d68314aSopenharmony_ci 
2001d68314aSopenharmony_ci 	/* the port is 0 (unspecified), meaning NL_OWN_PORT */
2011d68314aSopenharmony_ci 	sk->s_flags = NL_OWN_PORT;
2021d68314aSopenharmony_cidiff -urN libnl-3.7.0/lib/utils.c libnl-3.7.0_new/lib/utils.c
2031d68314aSopenharmony_ci--- libnl-3.7.0/lib/utils.c	2022-07-06 23:21:11.000000000 +0800
2041d68314aSopenharmony_ci+++ libnl-3.7.0_new/lib/utils.c	2024-06-03 17:37:18.340704700 +0800
2051d68314aSopenharmony_ci@@ -880,7 +880,7 @@
2061d68314aSopenharmony_ci 		return p->p_proto;
2071d68314aSopenharmony_ci 
2081d68314aSopenharmony_ci 	l = strtoul(name, &end, 0);
2091d68314aSopenharmony_ci-	if (l == ULONG_MAX || *end != '\0')
2101d68314aSopenharmony_ci+	if (name == end || *end != '\0' || l > (unsigned long)INT_MAX)
2111d68314aSopenharmony_ci 		return -NLE_OBJ_NOTFOUND;
2121d68314aSopenharmony_ci 
2131d68314aSopenharmony_ci 	return (int) l;
2141d68314aSopenharmony_cidiff -urN libnl-3.7.0/lib/xfrm/ae.c libnl-3.7.0_new/lib/xfrm/ae.c
2151d68314aSopenharmony_ci--- libnl-3.7.0/lib/xfrm/ae.c	2022-05-24 16:55:12.000000000 +0800
2161d68314aSopenharmony_ci+++ libnl-3.7.0_new/lib/xfrm/ae.c	2024-06-03 17:42:21.017726700 +0800
2171d68314aSopenharmony_ci@@ -301,6 +301,7 @@
2181d68314aSopenharmony_ci 	char                flags[128], buf[128];
2191d68314aSopenharmony_ci 	time_t              add_time, use_time;
2201d68314aSopenharmony_ci 	struct tm           *add_time_tm, *use_time_tm;
2211d68314aSopenharmony_ci+	struct tm           tm_buf;
2221d68314aSopenharmony_ci 
2231d68314aSopenharmony_ci 	nl_dump_line(p, "src %s dst %s \n", nl_addr2str(ae->saddr, src, sizeof(src)),
2241d68314aSopenharmony_ci 				nl_addr2str(ae->sa_id.daddr, dst, sizeof(dst)));
2251d68314aSopenharmony_ci@@ -320,7 +321,7 @@
2261d68314aSopenharmony_ci 	if (ae->lifetime_cur.add_time != 0)
2271d68314aSopenharmony_ci 	{
2281d68314aSopenharmony_ci 		add_time = ae->lifetime_cur.add_time;
2291d68314aSopenharmony_ci-		add_time_tm = gmtime (&add_time);
2301d68314aSopenharmony_ci+		add_time_tm = gmtime_r (&add_time, &tm_buf);
2311d68314aSopenharmony_ci 		strftime (flags, 128, "%Y-%m-%d %H-%M-%S", add_time_tm);
2321d68314aSopenharmony_ci 	}
2331d68314aSopenharmony_ci 	else
2341d68314aSopenharmony_ci@@ -331,7 +332,7 @@
2351d68314aSopenharmony_ci 	if (ae->lifetime_cur.use_time != 0)
2361d68314aSopenharmony_ci 	{
2371d68314aSopenharmony_ci 		use_time = ae->lifetime_cur.use_time;
2381d68314aSopenharmony_ci-		use_time_tm = gmtime (&use_time);
2391d68314aSopenharmony_ci+		use_time_tm = gmtime_r (&use_time, &tm_buf);
2401d68314aSopenharmony_ci 		strftime (buf, 128, "%Y-%m-%d %H-%M-%S", use_time_tm);
2411d68314aSopenharmony_ci 	}
2421d68314aSopenharmony_ci 	else
2431d68314aSopenharmony_ci@@ -505,11 +506,18 @@
2441d68314aSopenharmony_ci 	if (err < 0)
2451d68314aSopenharmony_ci 		goto errout;
2461d68314aSopenharmony_ci 
2471d68314aSopenharmony_ci-	ae->sa_id.daddr = nl_addr_build(ae_id->sa_id.family, &ae_id->sa_id.daddr, sizeof (ae_id->sa_id.daddr));
2481d68314aSopenharmony_ci+	if (!(ae->sa_id.daddr = nl_addr_build(ae_id->sa_id.family, &ae_id->sa_id.daddr,
2491d68314aSopenharmony_ci+					       sizeof (ae_id->sa_id.daddr)))) {
2501d68314aSopenharmony_ci+		err = -NLE_NOMEM;
2511d68314aSopenharmony_ci+		goto errout;
2521d68314aSopenharmony_ci+	}
2531d68314aSopenharmony_ci 	ae->sa_id.family= ae_id->sa_id.family;
2541d68314aSopenharmony_ci 	ae->sa_id.spi   = ntohl(ae_id->sa_id.spi);
2551d68314aSopenharmony_ci 	ae->sa_id.proto = ae_id->sa_id.proto;
2561d68314aSopenharmony_ci-	ae->saddr       = nl_addr_build(ae_id->sa_id.family, &ae_id->saddr, sizeof (ae_id->saddr));
2571d68314aSopenharmony_ci+	if (!(ae->saddr = nl_addr_build(ae_id->sa_id.family, &ae_id->saddr, sizeof (ae_id->saddr)))) {
2581d68314aSopenharmony_ci+		err = -NLE_NOMEM;
2591d68314aSopenharmony_ci+		goto errout;
2601d68314aSopenharmony_ci+	}
2611d68314aSopenharmony_ci 	ae->reqid       = ae_id->reqid;
2621d68314aSopenharmony_ci 	ae->flags       = ae_id->flags;
2631d68314aSopenharmony_ci 	ae->ce_mask |= (XFRM_AE_ATTR_DADDR | XFRM_AE_ATTR_FAMILY | XFRM_AE_ATTR_SPI |
2641d68314aSopenharmony_cidiff -urN libnl-3.7.0/lib/xfrm/sa.c libnl-3.7.0_new/lib/xfrm/sa.c
2651d68314aSopenharmony_ci--- libnl-3.7.0/lib/xfrm/sa.c	2022-05-24 16:55:12.000000000 +0800
2661d68314aSopenharmony_ci+++ libnl-3.7.0_new/lib/xfrm/sa.c	2024-06-03 18:32:07.233173600 +0800
2671d68314aSopenharmony_ci@@ -415,6 +415,7 @@
2681d68314aSopenharmony_ci 	char                flags[128], mode[128];
2691d68314aSopenharmony_ci 	time_t              add_time, use_time;
2701d68314aSopenharmony_ci 	struct tm           *add_time_tm, *use_time_tm;
2711d68314aSopenharmony_ci+	struct tm           tm_buf;
2721d68314aSopenharmony_ci 
2731d68314aSopenharmony_ci 	nl_dump_line(p, "src %s dst %s family: %s\n", nl_addr2str(sa->saddr, src, sizeof(src)),
2741d68314aSopenharmony_ci 	             nl_addr2str(sa->id.daddr, dst, sizeof(dst)),
2751d68314aSopenharmony_ci@@ -467,7 +468,7 @@
2761d68314aSopenharmony_ci 	if (sa->curlft.add_time != 0)
2771d68314aSopenharmony_ci 	{
2781d68314aSopenharmony_ci 		add_time = sa->curlft.add_time;
2791d68314aSopenharmony_ci-		add_time_tm = gmtime (&add_time);
2801d68314aSopenharmony_ci+		add_time_tm = gmtime_r (&add_time, &tm_buf);
2811d68314aSopenharmony_ci 		strftime (flags, 128, "%Y-%m-%d %H-%M-%S", add_time_tm);
2821d68314aSopenharmony_ci 	}
2831d68314aSopenharmony_ci 	else
2841d68314aSopenharmony_ci@@ -478,7 +479,7 @@
2851d68314aSopenharmony_ci 	if (sa->curlft.use_time != 0)
2861d68314aSopenharmony_ci 	{
2871d68314aSopenharmony_ci 		use_time = sa->curlft.use_time;
2881d68314aSopenharmony_ci-		use_time_tm = gmtime (&use_time);
2891d68314aSopenharmony_ci+		use_time_tm = gmtime_r (&use_time, &tm_buf);
2901d68314aSopenharmony_ci 		strftime (mode, 128, "%Y-%m-%d %H-%M-%S", use_time_tm);
2911d68314aSopenharmony_ci 	}
2921d68314aSopenharmony_ci 	else
2931d68314aSopenharmony_ci@@ -717,9 +718,19 @@
2941d68314aSopenharmony_ci 		goto errout;
2951d68314aSopenharmony_ci 
2961d68314aSopenharmony_ci 	if (sa_info->sel.family == AF_INET)
2971d68314aSopenharmony_ci-		addr    = nl_addr_build (sa_info->sel.family, &sa_info->sel.daddr.a4, sizeof (sa_info->sel.daddr.a4));
2981d68314aSopenharmony_ci+	{
2991d68314aSopenharmony_ci+		if (!(addr = nl_addr_build (sa_info->sel.family, &sa_info->sel.daddr.a4, sizeof (sa_info->sel.daddr.a4)))) {
3001d68314aSopenharmony_ci+			err = -NLE_NOMEM;
3011d68314aSopenharmony_ci+			goto errout;
3021d68314aSopenharmony_ci+		}
3031d68314aSopenharmony_ci+	}
3041d68314aSopenharmony_ci 	else
3051d68314aSopenharmony_ci-		addr    = nl_addr_build (sa_info->sel.family, &sa_info->sel.daddr.a6, sizeof (sa_info->sel.daddr.a6));
3061d68314aSopenharmony_ci+	{
3071d68314aSopenharmony_ci+		if (!(addr = nl_addr_build (sa_info->sel.family, &sa_info->sel.daddr.a6, sizeof (sa_info->sel.daddr.a6)))) {
3081d68314aSopenharmony_ci+			err = -NLE_NOMEM;
3091d68314aSopenharmony_ci+			goto errout;
3101d68314aSopenharmony_ci+		}
3111d68314aSopenharmony_ci+	}
3121d68314aSopenharmony_ci 	nl_addr_set_prefixlen (addr, sa_info->sel.prefixlen_d);
3131d68314aSopenharmony_ci 	xfrmnl_sel_set_daddr (sa->sel, addr);
3141d68314aSopenharmony_ci 	/* Drop the reference count from the above set operation */
3151d68314aSopenharmony_ci@@ -727,9 +738,19 @@
3161d68314aSopenharmony_ci 	xfrmnl_sel_set_prefixlen_d (sa->sel, sa_info->sel.prefixlen_d);
3171d68314aSopenharmony_ci 
3181d68314aSopenharmony_ci 	if (sa_info->sel.family == AF_INET)
3191d68314aSopenharmony_ci-		addr    = nl_addr_build (sa_info->sel.family, &sa_info->sel.saddr.a4, sizeof (sa_info->sel.saddr.a4));
3201d68314aSopenharmony_ci+	{
3211d68314aSopenharmony_ci+		if (!(addr = nl_addr_build (sa_info->sel.family, &sa_info->sel.saddr.a4, sizeof (sa_info->sel.saddr.a4)))) {
3221d68314aSopenharmony_ci+			err = -NLE_NOMEM;
3231d68314aSopenharmony_ci+			goto errout;
3241d68314aSopenharmony_ci+		}
3251d68314aSopenharmony_ci+	}
3261d68314aSopenharmony_ci 	else
3271d68314aSopenharmony_ci-		addr    = nl_addr_build (sa_info->sel.family, &sa_info->sel.saddr.a6, sizeof (sa_info->sel.saddr.a6));
3281d68314aSopenharmony_ci+	{
3291d68314aSopenharmony_ci+		if (!(addr = nl_addr_build (sa_info->sel.family, &sa_info->sel.saddr.a6, sizeof (sa_info->sel.saddr.a6)))) {
3301d68314aSopenharmony_ci+			err = -NLE_NOMEM;
3311d68314aSopenharmony_ci+			goto errout;
3321d68314aSopenharmony_ci+		}
3331d68314aSopenharmony_ci+	}
3341d68314aSopenharmony_ci 	nl_addr_set_prefixlen (addr, sa_info->sel.prefixlen_s);
3351d68314aSopenharmony_ci 	xfrmnl_sel_set_saddr (sa->sel, addr);
3361d68314aSopenharmony_ci 	/* Drop the reference count from the above set operation */
3371d68314aSopenharmony_ci@@ -747,17 +768,37 @@
3381d68314aSopenharmony_ci 	sa->ce_mask             |= XFRM_SA_ATTR_SEL;
3391d68314aSopenharmony_ci 
3401d68314aSopenharmony_ci 	if (sa_info->family == AF_INET)
3411d68314aSopenharmony_ci-		sa->id.daddr        = nl_addr_build (sa_info->family, &sa_info->id.daddr.a4, sizeof (sa_info->id.daddr.a4));
3421d68314aSopenharmony_ci+	{
3431d68314aSopenharmony_ci+		if (!(sa->id.daddr = nl_addr_build (sa_info->family, &sa_info->id.daddr.a4, sizeof (sa_info->id.daddr.a4)))) {
3441d68314aSopenharmony_ci+			err = -NLE_NOMEM;
3451d68314aSopenharmony_ci+			goto errout;
3461d68314aSopenharmony_ci+		}
3471d68314aSopenharmony_ci+	}
3481d68314aSopenharmony_ci 	else
3491d68314aSopenharmony_ci-		sa->id.daddr        = nl_addr_build (sa_info->family, &sa_info->id.daddr.a6, sizeof (sa_info->id.daddr.a6));
3501d68314aSopenharmony_ci+	{
3511d68314aSopenharmony_ci+		if (!(sa->id.daddr = nl_addr_build (sa_info->family, &sa_info->id.daddr.a6, sizeof (sa_info->id.daddr.a6)))) {
3521d68314aSopenharmony_ci+			err = -NLE_NOMEM;
3531d68314aSopenharmony_ci+			goto errout;
3541d68314aSopenharmony_ci+		}
3551d68314aSopenharmony_ci+	}
3561d68314aSopenharmony_ci 	sa->id.spi              = ntohl(sa_info->id.spi);
3571d68314aSopenharmony_ci 	sa->id.proto            = sa_info->id.proto;
3581d68314aSopenharmony_ci 	sa->ce_mask             |= (XFRM_SA_ATTR_DADDR | XFRM_SA_ATTR_SPI | XFRM_SA_ATTR_PROTO);
3591d68314aSopenharmony_ci 
3601d68314aSopenharmony_ci 	if (sa_info->family == AF_INET)
3611d68314aSopenharmony_ci-		sa->saddr           = nl_addr_build (sa_info->family, &sa_info->saddr.a4, sizeof (sa_info->saddr.a4));
3621d68314aSopenharmony_ci+	{
3631d68314aSopenharmony_ci+		if (!(sa->saddr = nl_addr_build (sa_info->family, &sa_info->saddr.a4, sizeof (sa_info->saddr.a4)))) {
3641d68314aSopenharmony_ci+			err = -NLE_NOMEM;
3651d68314aSopenharmony_ci+			goto errout;
3661d68314aSopenharmony_ci+		}
3671d68314aSopenharmony_ci+	}
3681d68314aSopenharmony_ci 	else
3691d68314aSopenharmony_ci-		sa->saddr           = nl_addr_build (sa_info->family, &sa_info->saddr.a6, sizeof (sa_info->saddr.a6));
3701d68314aSopenharmony_ci+	{
3711d68314aSopenharmony_ci+		if (!(sa->saddr = nl_addr_build (sa_info->family, &sa_info->saddr.a6, sizeof (sa_info->saddr.a6)))) {
3721d68314aSopenharmony_ci+			err = -NLE_NOMEM;
3731d68314aSopenharmony_ci+			goto errout;
3741d68314aSopenharmony_ci+		}
3751d68314aSopenharmony_ci+	}
3761d68314aSopenharmony_ci 	sa->ce_mask             |= XFRM_SA_ATTR_SADDR;
3771d68314aSopenharmony_ci 
3781d68314aSopenharmony_ci 	sa->lft->soft_byte_limit    =   sa_info->lft.soft_byte_limit;
3791d68314aSopenharmony_ci@@ -865,9 +906,19 @@
3801d68314aSopenharmony_ci 		sa->encap->encap_sport  =   ntohs(encap->encap_sport);
3811d68314aSopenharmony_ci 		sa->encap->encap_dport  =   ntohs(encap->encap_dport);
3821d68314aSopenharmony_ci 		if (sa_info->family == AF_INET)
3831d68314aSopenharmony_ci-			sa->encap->encap_oa =   nl_addr_build (sa_info->family, &encap->encap_oa.a4, sizeof (encap->encap_oa.a4));
3841d68314aSopenharmony_ci+		{
3851d68314aSopenharmony_ci+			if (!(sa->encap->encap_oa = nl_addr_build (sa_info->family, &encap->encap_oa.a4, sizeof (encap->encap_oa.a4)))) {
3861d68314aSopenharmony_ci+				err = -NLE_NOMEM;
3871d68314aSopenharmony_ci+				goto errout;
3881d68314aSopenharmony_ci+			}
3891d68314aSopenharmony_ci+		}
3901d68314aSopenharmony_ci 		else
3911d68314aSopenharmony_ci-			sa->encap->encap_oa =   nl_addr_build (sa_info->family, &encap->encap_oa.a6, sizeof (encap->encap_oa.a6));
3921d68314aSopenharmony_ci+		{
3931d68314aSopenharmony_ci+			if (!(sa->encap->encap_oa = nl_addr_build (sa_info->family, &encap->encap_oa.a6, sizeof (encap->encap_oa.a6)))) {
3941d68314aSopenharmony_ci+				err = -NLE_NOMEM;
3951d68314aSopenharmony_ci+				goto errout;
3961d68314aSopenharmony_ci+			}
3971d68314aSopenharmony_ci+		}
3981d68314aSopenharmony_ci 		sa->ce_mask     |= XFRM_SA_ATTR_ENCAP;
3991d68314aSopenharmony_ci 	}
4001d68314aSopenharmony_ci 
4011d68314aSopenharmony_ci@@ -879,13 +930,19 @@
4021d68314aSopenharmony_ci 	if (tb[XFRMA_COADDR]) {
4031d68314aSopenharmony_ci 		if (sa_info->family == AF_INET)
4041d68314aSopenharmony_ci 		{
4051d68314aSopenharmony_ci-			sa->coaddr  = nl_addr_build(sa_info->family, nla_data(tb[XFRMA_COADDR]),
4061d68314aSopenharmony_ci-			                            sizeof (uint32_t));
4071d68314aSopenharmony_ci+			if (!(sa->coaddr = nl_addr_build(
4081d68314aSopenharmony_ci+					sa_info->family, nla_data(tb[XFRMA_COADDR]), sizeof (uint32_t)))) {
4091d68314aSopenharmony_ci+				err = -NLE_NOMEM;
4101d68314aSopenharmony_ci+				goto errout;
4111d68314aSopenharmony_ci+			}	
4121d68314aSopenharmony_ci 		}
4131d68314aSopenharmony_ci 		else
4141d68314aSopenharmony_ci 		{
4151d68314aSopenharmony_ci-			sa->coaddr  = nl_addr_build(sa_info->family, nla_data(tb[XFRMA_COADDR]),
4161d68314aSopenharmony_ci-			                            sizeof (uint32_t) * 4);
4171d68314aSopenharmony_ci+			if (!(sa->coaddr = nl_addr_build(
4181d68314aSopenharmony_ci+					sa_info->family, nla_data(tb[XFRMA_COADDR]), sizeof (uint32_t) * 4))) {
4191d68314aSopenharmony_ci+				err = -NLE_NOMEM;
4201d68314aSopenharmony_ci+				goto errout;
4211d68314aSopenharmony_ci+			}
4221d68314aSopenharmony_ci 		}
4231d68314aSopenharmony_ci 		sa->ce_mask         |= XFRM_SA_ATTR_COADDR;
4241d68314aSopenharmony_ci 	}
4251d68314aSopenharmony_cidiff -urN libnl-3.7.0/lib/xfrm/sp.c libnl-3.7.0_new/lib/xfrm/sp.c
4261d68314aSopenharmony_ci--- libnl-3.7.0/lib/xfrm/sp.c	2022-05-24 16:55:12.000000000 +0800
4271d68314aSopenharmony_ci+++ libnl-3.7.0_new/lib/xfrm/sp.c	2024-06-03 17:43:31.464119900 +0800
4281d68314aSopenharmony_ci@@ -324,6 +324,7 @@
4291d68314aSopenharmony_ci 	char                dst[INET6_ADDRSTRLEN+5], src[INET6_ADDRSTRLEN+5];
4301d68314aSopenharmony_ci 	time_t              add_time, use_time;
4311d68314aSopenharmony_ci 	struct tm           *add_time_tm, *use_time_tm;
4321d68314aSopenharmony_ci+	struct tm           tm_buf;
4331d68314aSopenharmony_ci 
4341d68314aSopenharmony_ci 	nl_addr2str(xfrmnl_sel_get_saddr (sp->sel), src, sizeof(src));
4351d68314aSopenharmony_ci 	nl_addr2str (xfrmnl_sel_get_daddr (sp->sel), dst, sizeof (dst));
4361d68314aSopenharmony_ci@@ -384,7 +385,7 @@
4371d68314aSopenharmony_ci 	if (sp->curlft.add_time != 0)
4381d68314aSopenharmony_ci 	{
4391d68314aSopenharmony_ci 		add_time = sp->curlft.add_time;
4401d68314aSopenharmony_ci-		add_time_tm = gmtime (&add_time);
4411d68314aSopenharmony_ci+		add_time_tm = gmtime_r (&add_time, &tm_buf);
4421d68314aSopenharmony_ci 		strftime (dst, INET6_ADDRSTRLEN+5, "%Y-%m-%d %H-%M-%S", add_time_tm);
4431d68314aSopenharmony_ci 	}
4441d68314aSopenharmony_ci 	else
4451d68314aSopenharmony_ci@@ -395,7 +396,7 @@
4461d68314aSopenharmony_ci 	if (sp->curlft.use_time != 0)
4471d68314aSopenharmony_ci 	{
4481d68314aSopenharmony_ci 		use_time = sp->curlft.use_time;
4491d68314aSopenharmony_ci-		use_time_tm = gmtime (&use_time);
4501d68314aSopenharmony_ci+		use_time_tm = gmtime_r (&use_time, &tm_buf);
4511d68314aSopenharmony_ci 		strftime (src, INET6_ADDRSTRLEN+5, "%Y-%m-%d %H-%M-%S", use_time_tm);
4521d68314aSopenharmony_ci 	}
4531d68314aSopenharmony_ci 	else
4541d68314aSopenharmony_ci@@ -557,19 +558,43 @@
4551d68314aSopenharmony_ci 	}
4561d68314aSopenharmony_ci 
4571d68314aSopenharmony_ci 	if (sp_info->sel.family == AF_INET)
4581d68314aSopenharmony_ci-		addr    = nl_addr_build (sp_info->sel.family, &sp_info->sel.daddr.a4, sizeof (sp_info->sel.daddr.a4));
4591d68314aSopenharmony_ci+	{
4601d68314aSopenharmony_ci+		if (!(addr = nl_addr_build (sp_info->sel.family, &sp_info->sel.daddr.a4, sizeof (sp_info->sel.daddr.a4)))) {
4611d68314aSopenharmony_ci+			err = -NLE_NOMEM;
4621d68314aSopenharmony_ci+			goto errout;
4631d68314aSopenharmony_ci+		}
4641d68314aSopenharmony_ci+	}
4651d68314aSopenharmony_ci 	else
4661d68314aSopenharmony_ci-		addr    = nl_addr_build (sp_info->sel.family, &sp_info->sel.daddr.a6, sizeof (sp_info->sel.daddr.a6));
4671d68314aSopenharmony_ci+	{
4681d68314aSopenharmony_ci+		if (!(addr = nl_addr_build (sp_info->sel.family, &sp_info->sel.daddr.a6, sizeof (sp_info->sel.daddr.a6)))) {
4691d68314aSopenharmony_ci+			err = -NLE_NOMEM;
4701d68314aSopenharmony_ci+			goto errout;
4711d68314aSopenharmony_ci+		}
4721d68314aSopenharmony_ci+	}
4731d68314aSopenharmony_ci 	nl_addr_set_prefixlen (addr, sp_info->sel.prefixlen_d);
4741d68314aSopenharmony_ci 	xfrmnl_sel_set_daddr (sp->sel, addr);
4751d68314aSopenharmony_ci+	/* Drop the reference count from the above set operation */
4761d68314aSopenharmony_ci+	nl_addr_put(addr);
4771d68314aSopenharmony_ci 	xfrmnl_sel_set_prefixlen_d (sp->sel, sp_info->sel.prefixlen_d);
4781d68314aSopenharmony_ci 
4791d68314aSopenharmony_ci 	if (sp_info->sel.family == AF_INET)
4801d68314aSopenharmony_ci-		addr    = nl_addr_build (sp_info->sel.family, &sp_info->sel.saddr.a4, sizeof (sp_info->sel.saddr.a4));
4811d68314aSopenharmony_ci+	{
4821d68314aSopenharmony_ci+		if (!(addr = nl_addr_build (sp_info->sel.family, &sp_info->sel.saddr.a4, sizeof (sp_info->sel.saddr.a4)))) {
4831d68314aSopenharmony_ci+			err = -NLE_NOMEM;
4841d68314aSopenharmony_ci+			goto errout;
4851d68314aSopenharmony_ci+		}
4861d68314aSopenharmony_ci+	}
4871d68314aSopenharmony_ci 	else
4881d68314aSopenharmony_ci-		addr    = nl_addr_build (sp_info->sel.family, &sp_info->sel.saddr.a6, sizeof (sp_info->sel.saddr.a6));
4891d68314aSopenharmony_ci+	{
4901d68314aSopenharmony_ci+		if (!(addr = nl_addr_build (sp_info->sel.family, &sp_info->sel.saddr.a6, sizeof (sp_info->sel.saddr.a6)))) {
4911d68314aSopenharmony_ci+			err = -NLE_NOMEM;
4921d68314aSopenharmony_ci+			goto errout;
4931d68314aSopenharmony_ci+		}
4941d68314aSopenharmony_ci+	}
4951d68314aSopenharmony_ci 	nl_addr_set_prefixlen (addr, sp_info->sel.prefixlen_s);
4961d68314aSopenharmony_ci 	xfrmnl_sel_set_saddr (sp->sel, addr);
4971d68314aSopenharmony_ci+	/* Drop the reference count from the above set operation */
4981d68314aSopenharmony_ci+	nl_addr_put(addr);
4991d68314aSopenharmony_ci 	xfrmnl_sel_set_prefixlen_s (sp->sel, sp_info->sel.prefixlen_s);
5001d68314aSopenharmony_ci 
5011d68314aSopenharmony_ci 	xfrmnl_sel_set_dport (sp->sel, ntohs (sp_info->sel.dport));
5021d68314aSopenharmony_ci@@ -628,13 +653,13 @@
5031d68314aSopenharmony_ci 
5041d68314aSopenharmony_ci 	if (tb[XFRMA_TMPL]) {
5051d68314aSopenharmony_ci 		struct xfrm_user_tmpl*      tmpl = nla_data(tb[XFRMA_TMPL]);
5061d68314aSopenharmony_ci-		struct xfrmnl_user_tmpl*    sputmpl;
5071d68314aSopenharmony_ci 		uint32_t                    i;
5081d68314aSopenharmony_ci 		uint32_t                    num_tmpls = nla_len(tb[XFRMA_TMPL]) / sizeof (*tmpl);
5091d68314aSopenharmony_ci 		struct  nl_addr*            addr;
5101d68314aSopenharmony_ci 
5111d68314aSopenharmony_ci 		for (i = 0; (i < num_tmpls) && (tmpl); i ++, tmpl++)
5121d68314aSopenharmony_ci 		{
5131d68314aSopenharmony_ci+			_nl_auto_xfrmnl_user_tmpl struct xfrmnl_user_tmpl *sputmpl = NULL;
5141d68314aSopenharmony_ci 			if ((sputmpl = xfrmnl_user_tmpl_alloc ()) == NULL)
5151d68314aSopenharmony_ci 			{
5161d68314aSopenharmony_ci 				err = -NLE_NOMEM;
5171d68314aSopenharmony_ci@@ -642,19 +667,43 @@
5181d68314aSopenharmony_ci 			}
5191d68314aSopenharmony_ci 
5201d68314aSopenharmony_ci 			if (tmpl->family == AF_INET)
5211d68314aSopenharmony_ci-				addr = nl_addr_build(tmpl->family, &tmpl->id.daddr.a4, sizeof (tmpl->id.daddr.a4));
5221d68314aSopenharmony_ci+			{
5231d68314aSopenharmony_ci+				if (!(addr = nl_addr_build(tmpl->family, &tmpl->id.daddr.a4, sizeof (tmpl->id.daddr.a4)))) {
5241d68314aSopenharmony_ci+					err = -NLE_NOMEM;
5251d68314aSopenharmony_ci+					goto errout;
5261d68314aSopenharmony_ci+				}
5271d68314aSopenharmony_ci+			}
5281d68314aSopenharmony_ci 			else
5291d68314aSopenharmony_ci-				addr = nl_addr_build(tmpl->family, &tmpl->id.daddr.a6, sizeof (tmpl->id.daddr.a6));
5301d68314aSopenharmony_ci+			{
5311d68314aSopenharmony_ci+				if (!(addr = nl_addr_build(tmpl->family, &tmpl->id.daddr.a6, sizeof (tmpl->id.daddr.a6)))) {
5321d68314aSopenharmony_ci+					err = -NLE_NOMEM;
5331d68314aSopenharmony_ci+					goto errout;
5341d68314aSopenharmony_ci+				}
5351d68314aSopenharmony_ci+			}
5361d68314aSopenharmony_ci 			xfrmnl_user_tmpl_set_daddr (sputmpl, addr);
5371d68314aSopenharmony_ci+			/* Drop the reference count from the above set operation */
5381d68314aSopenharmony_ci+			nl_addr_put(addr);
5391d68314aSopenharmony_ci 			xfrmnl_user_tmpl_set_spi (sputmpl, ntohl(tmpl->id.spi));
5401d68314aSopenharmony_ci 			xfrmnl_user_tmpl_set_proto (sputmpl, tmpl->id.proto);
5411d68314aSopenharmony_ci 			xfrmnl_user_tmpl_set_family (sputmpl, tmpl->family);
5421d68314aSopenharmony_ci 
5431d68314aSopenharmony_ci 			if (tmpl->family == AF_INET)
5441d68314aSopenharmony_ci-				addr = nl_addr_build(tmpl->family, &tmpl->saddr.a4, sizeof (tmpl->saddr.a4));
5451d68314aSopenharmony_ci+			{
5461d68314aSopenharmony_ci+				if (!(addr = nl_addr_build(tmpl->family, &tmpl->saddr.a4, sizeof (tmpl->saddr.a4)))) {
5471d68314aSopenharmony_ci+					err = -NLE_NOMEM;
5481d68314aSopenharmony_ci+					goto errout;
5491d68314aSopenharmony_ci+				}
5501d68314aSopenharmony_ci+			}
5511d68314aSopenharmony_ci 			else
5521d68314aSopenharmony_ci-				addr = nl_addr_build(tmpl->family, &tmpl->saddr.a6, sizeof (tmpl->saddr.a6));
5531d68314aSopenharmony_ci+			{
5541d68314aSopenharmony_ci+				if (!(addr = nl_addr_build(tmpl->family, &tmpl->saddr.a6, sizeof (tmpl->saddr.a6)))) {
5551d68314aSopenharmony_ci+					err = -NLE_NOMEM;
5561d68314aSopenharmony_ci+					goto errout;
5571d68314aSopenharmony_ci+				}
5581d68314aSopenharmony_ci+			}
5591d68314aSopenharmony_ci 			xfrmnl_user_tmpl_set_saddr (sputmpl, addr);
5601d68314aSopenharmony_ci+			/* Drop the reference count from the above set operation */
5611d68314aSopenharmony_ci+			nl_addr_put(addr);
5621d68314aSopenharmony_ci 
5631d68314aSopenharmony_ci 			xfrmnl_user_tmpl_set_reqid (sputmpl, tmpl->reqid);
5641d68314aSopenharmony_ci 			xfrmnl_user_tmpl_set_mode (sputmpl, tmpl->mode);
5651d68314aSopenharmony_ci@@ -663,7 +712,7 @@
5661d68314aSopenharmony_ci 			xfrmnl_user_tmpl_set_aalgos (sputmpl, tmpl->aalgos);
5671d68314aSopenharmony_ci 			xfrmnl_user_tmpl_set_ealgos (sputmpl, tmpl->ealgos);
5681d68314aSopenharmony_ci 			xfrmnl_user_tmpl_set_calgos (sputmpl, tmpl->calgos);
5691d68314aSopenharmony_ci-			xfrmnl_sp_add_usertemplate (sp, sputmpl);
5701d68314aSopenharmony_ci+			xfrmnl_sp_add_usertemplate (sp, _nl_steal_pointer(&sputmpl));
5711d68314aSopenharmony_ci 
5721d68314aSopenharmony_ci 			sp->ce_mask     |=  XFRM_SP_ATTR_TMPL;
5731d68314aSopenharmony_ci 		}
5741d68314aSopenharmony_ci@@ -1316,6 +1365,8 @@
5751d68314aSopenharmony_ci 	if (sp->ce_mask & XFRM_SP_ATTR_TMPL) {
5761d68314aSopenharmony_ci 		sp->nr_user_tmpl--;
5771d68314aSopenharmony_ci 		nl_list_del(&utmpl->utmpl_list);
5781d68314aSopenharmony_ci+		if (sp->nr_user_tmpl == 0)
5791d68314aSopenharmony_ci+			sp->ce_mask &= ~XFRM_SP_ATTR_TMPL;
5801d68314aSopenharmony_ci 	}
5811d68314aSopenharmony_ci }
5821d68314aSopenharmony_ci 
5831d68314aSopenharmony_cidiff -urN libnl-3.7.0/tests/params.h libnl-3.7.0_new/tests/params.h
5841d68314aSopenharmony_ci--- libnl-3.7.0/tests/params.h	1970-01-01 08:00:00.000000000 +0800
5851d68314aSopenharmony_ci+++ libnl-3.7.0_new/tests/params.h	2024-06-03 16:23:13.861244200 +0800
5861d68314aSopenharmony_ci@@ -0,0 +1,5 @@
5871d68314aSopenharmony_ci+#define DST_ADDR "addr"
5881d68314aSopenharmony_ci+#define IP "ip"
5891d68314aSopenharmony_ci+#define NEXTHOP "dev=1,via=2"
5901d68314aSopenharmony_ci+#define DEV_NAME "dev_name"
5911d68314aSopenharmony_ci+
5921d68314aSopenharmony_cidiff -urN libnl-3.7.0/tests/test-add-delete-addr.c libnl-3.7.0_new/tests/test-add-delete-addr.c
5931d68314aSopenharmony_ci--- libnl-3.7.0/tests/test-add-delete-addr.c	1970-01-01 08:00:00.000000000 +0800
5941d68314aSopenharmony_ci+++ libnl-3.7.0_new/tests/test-add-delete-addr.c	2024-06-03 16:23:13.861244200 +0800
5951d68314aSopenharmony_ci@@ -0,0 +1,39 @@
5961d68314aSopenharmony_ci+#include <netlink/cli/utils.h>
5971d68314aSopenharmony_ci+#include <netlink/cli/addr.h>
5981d68314aSopenharmony_ci+#include <netlink/cli/link.h>
5991d68314aSopenharmony_ci+#include <linux/netlink.h>
6001d68314aSopenharmony_ci+#include <stdio.h>
6011d68314aSopenharmony_ci+#include <params.h>
6021d68314aSopenharmony_ci+
6031d68314aSopenharmony_ci+
6041d68314aSopenharmony_ci+int main(int argc, char *argv[])
6051d68314aSopenharmony_ci+{
6061d68314aSopenharmony_ci+    struct nl_sock *sock;
6071d68314aSopenharmony_ci+    struct rtnl_addr *addr;
6081d68314aSopenharmony_ci+    struct nl_cache *link_cache;
6091d68314aSopenharmony_ci+    int err = 0, nlflags = NLM_F_CREATE;
6101d68314aSopenharmony_ci+
6111d68314aSopenharmony_ci+    sock = nl_cli_alloc_socket();
6121d68314aSopenharmony_ci+    nl_cli_connect(sock, NETLINK_ROUTE);
6131d68314aSopenharmony_ci+    link_cache = nl_cli_link_alloc_cache(sock);
6141d68314aSopenharmony_ci+    addr = nl_cli_addr_alloc();
6151d68314aSopenharmony_ci+
6161d68314aSopenharmony_ci+    nl_cli_addr_parse_local(addr, IP);
6171d68314aSopenharmony_ci+    nl_cli_addr_parse_dev(addr, link_cache, DEV_NAME);
6181d68314aSopenharmony_ci+    
6191d68314aSopenharmony_ci+    if ((err = rtnl_addr_add(sock, addr, nlflags)) < 0) {
6201d68314aSopenharmony_ci+        printf("Unable to add route: %s", nl_geterror(err));
6211d68314aSopenharmony_ci+        goto END;
6221d68314aSopenharmony_ci+    }
6231d68314aSopenharmony_ci+
6241d68314aSopenharmony_ci+    if ((err = rtnl_addr_delete(sock, addr, nlflags)) < 0) {
6251d68314aSopenharmony_ci+        printf("Unable to add route: %s", nl_geterror(err));
6261d68314aSopenharmony_ci+        goto END;
6271d68314aSopenharmony_ci+    }
6281d68314aSopenharmony_ci+
6291d68314aSopenharmony_ci+END:
6301d68314aSopenharmony_ci+    rtnl_addr_put(addr);
6311d68314aSopenharmony_ci+    nl_cache_put(link_cache);
6321d68314aSopenharmony_ci+    nl_socket_free(sock);
6331d68314aSopenharmony_ci+    return err;
6341d68314aSopenharmony_ci+}
6351d68314aSopenharmony_cidiff -urN libnl-3.7.0/tests/test-add-delete-class.c libnl-3.7.0_new/tests/test-add-delete-class.c
6361d68314aSopenharmony_ci--- libnl-3.7.0/tests/test-add-delete-class.c	1970-01-01 08:00:00.000000000 +0800
6371d68314aSopenharmony_ci+++ libnl-3.7.0_new/tests/test-add-delete-class.c	2024-06-03 16:23:13.876242300 +0800
6381d68314aSopenharmony_ci@@ -0,0 +1,142 @@
6391d68314aSopenharmony_ci+#include <netlink/cli/utils.h>
6401d68314aSopenharmony_ci+#include <netlink/cli/tc.h>
6411d68314aSopenharmony_ci+#include <netlink/cli/class.h>
6421d68314aSopenharmony_ci+#include <netlink/cli/link.h>
6431d68314aSopenharmony_ci+#include <netlink-private/route/tc-api.h>
6441d68314aSopenharmony_ci+#include <linux/netlink.h>
6451d68314aSopenharmony_ci+#include <stdio.h>
6461d68314aSopenharmony_ci+#include <params.h>
6471d68314aSopenharmony_ci+
6481d68314aSopenharmony_ci+static int default_yes = 0, deleted = 0, interactive = 0;
6491d68314aSopenharmony_ci+static struct nl_sock *sk;
6501d68314aSopenharmony_ci+
6511d68314aSopenharmony_ci+static int test_add_class()
6521d68314aSopenharmony_ci+{
6531d68314aSopenharmony_ci+    struct rtnl_class *class;
6541d68314aSopenharmony_ci+    struct rtnl_tc *tc;
6551d68314aSopenharmony_ci+    struct nl_cache *link_cache;
6561d68314aSopenharmony_ci+    struct nl_cli_tc_module *tm;
6571d68314aSopenharmony_ci+    struct rtnl_tc_ops *ops;
6581d68314aSopenharmony_ci+    int err = 0, flags = NLM_F_CREATE | NLM_F_EXCL;
6591d68314aSopenharmony_ci+    char kind[] = "htb";
6601d68314aSopenharmony_ci+    char *rate[] = {DEV_NAME, "root", "htb", "--rate=100mbit"};
6611d68314aSopenharmony_ci+
6621d68314aSopenharmony_ci+    sk = nl_cli_alloc_socket();
6631d68314aSopenharmony_ci+    nl_cli_connect(sk, NETLINK_ROUTE);
6641d68314aSopenharmony_ci+    link_cache = nl_cli_link_alloc_cache(sk);
6651d68314aSopenharmony_ci+    class = nl_cli_class_alloc();
6661d68314aSopenharmony_ci+    tc = (struct rtnl_tc *) class;
6671d68314aSopenharmony_ci+
6681d68314aSopenharmony_ci+    nl_cli_tc_parse_dev(tc, link_cache, DEV_NAME);
6691d68314aSopenharmony_ci+    nl_cli_tc_parse_parent(tc, "root");
6701d68314aSopenharmony_ci+    if (!rtnl_tc_get_ifindex(tc)) {
6711d68314aSopenharmony_ci+        printf("You must specify a network device (--dev=XXX)\n");
6721d68314aSopenharmony_ci+        err = -1;
6731d68314aSopenharmony_ci+        goto END;
6741d68314aSopenharmony_ci+    }
6751d68314aSopenharmony_ci+    if (!rtnl_tc_get_parent(tc)) {
6761d68314aSopenharmony_ci+        printf("You must specify a parent (--parent=XXX)\n");
6771d68314aSopenharmony_ci+        err = -1;
6781d68314aSopenharmony_ci+        goto END;
6791d68314aSopenharmony_ci+    }
6801d68314aSopenharmony_ci+
6811d68314aSopenharmony_ci+    rtnl_tc_set_kind(tc, kind);
6821d68314aSopenharmony_ci+    if (!(ops = rtnl_tc_get_ops(tc))) {
6831d68314aSopenharmony_ci+        printf("Unknown class \"%s\"\n", kind);
6841d68314aSopenharmony_ci+        err = -1;
6851d68314aSopenharmony_ci+        goto END;
6861d68314aSopenharmony_ci+    }
6871d68314aSopenharmony_ci+    if (!(tm = nl_cli_tc_lookup(ops))) {
6881d68314aSopenharmony_ci+        printf("class type \"%s\" not supported.\n", kind);
6891d68314aSopenharmony_ci+        err = -1;
6901d68314aSopenharmony_ci+        goto END;
6911d68314aSopenharmony_ci+    }
6921d68314aSopenharmony_ci+    tm->tm_parse_argv(tc, 4, rate);
6931d68314aSopenharmony_ci+
6941d68314aSopenharmony_ci+    if ((err = rtnl_class_add(sk, class, flags)) < 0) {
6951d68314aSopenharmony_ci+        printf("Unable to add class: %s\n", nl_geterror(err));
6961d68314aSopenharmony_ci+        goto END;
6971d68314aSopenharmony_ci+    }
6981d68314aSopenharmony_ci+
6991d68314aSopenharmony_ci+END:
7001d68314aSopenharmony_ci+    nl_cache_mngt_unprovide(link_cache);
7011d68314aSopenharmony_ci+    nl_cache_put(link_cache);
7021d68314aSopenharmony_ci+    rtnl_class_put(class);
7031d68314aSopenharmony_ci+    nl_socket_free(sk);
7041d68314aSopenharmony_ci+    return err;
7051d68314aSopenharmony_ci+}
7061d68314aSopenharmony_ci+
7071d68314aSopenharmony_ci+
7081d68314aSopenharmony_ci+static void delete_cb(struct nl_object *obj, void *arg)
7091d68314aSopenharmony_ci+{
7101d68314aSopenharmony_ci+    struct rtnl_class *class = nl_object_priv(obj);
7111d68314aSopenharmony_ci+    struct nl_dump_params params = {
7121d68314aSopenharmony_ci+        .dp_type = NL_DUMP_LINE,
7131d68314aSopenharmony_ci+        .dp_fd = stdout,
7141d68314aSopenharmony_ci+	};
7151d68314aSopenharmony_ci+    int err;
7161d68314aSopenharmony_ci+
7171d68314aSopenharmony_ci+    if (interactive && !nl_cli_confirm(obj, &params, default_yes))
7181d68314aSopenharmony_ci+        return;
7191d68314aSopenharmony_ci+
7201d68314aSopenharmony_ci+    if ((err = rtnl_class_delete(sk, class)) < 0)
7211d68314aSopenharmony_ci+        nl_cli_fatal(err, "Unable to delete class: %s\n", nl_geterror(err));
7221d68314aSopenharmony_ci+
7231d68314aSopenharmony_ci+    deleted++;
7241d68314aSopenharmony_ci+}
7251d68314aSopenharmony_ci+
7261d68314aSopenharmony_ci+static int test_delete_class()
7271d68314aSopenharmony_ci+{
7281d68314aSopenharmony_ci+    struct rtnl_class *class;
7291d68314aSopenharmony_ci+    struct rtnl_tc *tc;
7301d68314aSopenharmony_ci+    struct nl_cache *link_cache, *class_cache;
7311d68314aSopenharmony_ci+    struct nl_cli_tc_module *tm;
7321d68314aSopenharmony_ci+    struct rtnl_tc_ops *ops;
7331d68314aSopenharmony_ci+    char kind[] = "htb";
7341d68314aSopenharmony_ci+    int err = 0;
7351d68314aSopenharmony_ci+    
7361d68314aSopenharmony_ci+    sk = nl_cli_alloc_socket();
7371d68314aSopenharmony_ci+    nl_cli_connect(sk, NETLINK_ROUTE);
7381d68314aSopenharmony_ci+    link_cache = nl_cli_link_alloc_cache(sk);
7391d68314aSopenharmony_ci+    class = nl_cli_class_alloc();
7401d68314aSopenharmony_ci+    tc = (struct rtnl_tc *) class;
7411d68314aSopenharmony_ci+
7421d68314aSopenharmony_ci+    nl_cli_tc_parse_dev(tc, link_cache, DEV_NAME);
7431d68314aSopenharmony_ci+    nl_cli_tc_parse_parent(tc, "root");
7441d68314aSopenharmony_ci+    if (!rtnl_tc_get_ifindex(tc)) {
7451d68314aSopenharmony_ci+        printf("You must specify a network device (--dev=XXX)\n");
7461d68314aSopenharmony_ci+        err = -1;
7471d68314aSopenharmony_ci+        goto END;
7481d68314aSopenharmony_ci+    }
7491d68314aSopenharmony_ci+    if (!rtnl_tc_get_parent(tc)) {
7501d68314aSopenharmony_ci+        printf("You must specify a parent (--parent=XXX)\n");
7511d68314aSopenharmony_ci+        err = -1;
7521d68314aSopenharmony_ci+        goto END;
7531d68314aSopenharmony_ci+    }
7541d68314aSopenharmony_ci+    rtnl_tc_set_kind(tc, kind);
7551d68314aSopenharmony_ci+    if (!(ops = rtnl_tc_get_ops(tc))) {
7561d68314aSopenharmony_ci+        printf("Unknown class \"%s\"\n", kind);
7571d68314aSopenharmony_ci+        err = -1;
7581d68314aSopenharmony_ci+        goto END;
7591d68314aSopenharmony_ci+    }
7601d68314aSopenharmony_ci+    class_cache = nl_cli_class_alloc_cache(sk, rtnl_tc_get_ifindex(tc));
7611d68314aSopenharmony_ci+    nl_cache_foreach_filter(class_cache, OBJ_CAST(class), delete_cb, NULL);
7621d68314aSopenharmony_ci+
7631d68314aSopenharmony_ci+END:
7641d68314aSopenharmony_ci+    nl_cache_put(link_cache);
7651d68314aSopenharmony_ci+    nl_socket_free(sk);
7661d68314aSopenharmony_ci+    rtnl_class_put(class);
7671d68314aSopenharmony_ci+    return err;
7681d68314aSopenharmony_ci+}
7691d68314aSopenharmony_ci+
7701d68314aSopenharmony_ci+int main(int argc, char *argv[])
7711d68314aSopenharmony_ci+{
7721d68314aSopenharmony_ci+    int err = 0;
7731d68314aSopenharmony_ci+    if ((err = test_add_class()) < 0) {
7741d68314aSopenharmony_ci+        printf("Unable to add class\n");
7751d68314aSopenharmony_ci+    }
7761d68314aSopenharmony_ci+    if ((err = test_delete_class()) < 0) {
7771d68314aSopenharmony_ci+        printf("Unable to delete class");
7781d68314aSopenharmony_ci+    }
7791d68314aSopenharmony_ci+    return err;
7801d68314aSopenharmony_ci+}
7811d68314aSopenharmony_cidiff -urN libnl-3.7.0/tests/test-add-delete-neigh.c libnl-3.7.0_new/tests/test-add-delete-neigh.c
7821d68314aSopenharmony_ci--- libnl-3.7.0/tests/test-add-delete-neigh.c	1970-01-01 08:00:00.000000000 +0800
7831d68314aSopenharmony_ci+++ libnl-3.7.0_new/tests/test-add-delete-neigh.c	2024-06-03 16:23:13.876242300 +0800
7841d68314aSopenharmony_ci@@ -0,0 +1,41 @@
7851d68314aSopenharmony_ci+#include <netlink/cli/utils.h>
7861d68314aSopenharmony_ci+#include <netlink/cli/neigh.h>
7871d68314aSopenharmony_ci+#include <netlink/cli/link.h>
7881d68314aSopenharmony_ci+#include <linux/netlink.h>
7891d68314aSopenharmony_ci+#include <stdio.h>
7901d68314aSopenharmony_ci+#include <params.h>
7911d68314aSopenharmony_ci+
7921d68314aSopenharmony_ci+
7931d68314aSopenharmony_ci+int main(int argc, char *argv[])
7941d68314aSopenharmony_ci+{
7951d68314aSopenharmony_ci+    struct nl_sock *sk;
7961d68314aSopenharmony_ci+    struct rtnl_neigh *neigh;
7971d68314aSopenharmony_ci+    struct nl_cache *link_cache;
7981d68314aSopenharmony_ci+    int err = 0, ok = 0, nlflags = NLM_F_REPLACE | NLM_F_CREATE;
7991d68314aSopenharmony_ci+    char lladdr[] = "AA:BB:CC:DD:EE:FF";
8001d68314aSopenharmony_ci+
8011d68314aSopenharmony_ci+    sk = nl_cli_alloc_socket();
8021d68314aSopenharmony_ci+    nl_cli_connect(sk, NETLINK_ROUTE);
8031d68314aSopenharmony_ci+    link_cache = nl_cli_link_alloc_cache(sk);
8041d68314aSopenharmony_ci+    neigh = nl_cli_neigh_alloc();
8051d68314aSopenharmony_ci+
8061d68314aSopenharmony_ci+    nl_cli_neigh_parse_dst(neigh, DST_ADDR);
8071d68314aSopenharmony_ci+    nl_cli_neigh_parse_lladdr(neigh, lladdr);
8081d68314aSopenharmony_ci+    nl_cli_neigh_parse_dev(neigh, link_cache, DEV_NAME);
8091d68314aSopenharmony_ci+
8101d68314aSopenharmony_ci+    if ((err = rtnl_neigh_add(sk, neigh, nlflags)) < 0){
8111d68314aSopenharmony_ci+        printf("Unable to add neighbour: %s\n",nl_geterror(err));
8121d68314aSopenharmony_ci+        goto END;
8131d68314aSopenharmony_ci+    } 
8141d68314aSopenharmony_ci+
8151d68314aSopenharmony_ci+    if ((err = rtnl_neigh_delete(sk, neigh, nlflags)) < 0){
8161d68314aSopenharmony_ci+        printf("Unable to add neighbour: %s\n",nl_geterror(err));
8171d68314aSopenharmony_ci+        goto END;
8181d68314aSopenharmony_ci+    }
8191d68314aSopenharmony_ci+
8201d68314aSopenharmony_ci+END:   
8211d68314aSopenharmony_ci+    nl_socket_free(sk);
8221d68314aSopenharmony_ci+    nl_cache_put(link_cache);
8231d68314aSopenharmony_ci+    rtnl_neigh_put(neigh);
8241d68314aSopenharmony_ci+    return err;
8251d68314aSopenharmony_ci+}
8261d68314aSopenharmony_cidiff -urN libnl-3.7.0/tests/test-add-delete-qdisc.c libnl-3.7.0_new/tests/test-add-delete-qdisc.c
8271d68314aSopenharmony_ci--- libnl-3.7.0/tests/test-add-delete-qdisc.c	1970-01-01 08:00:00.000000000 +0800
8281d68314aSopenharmony_ci+++ libnl-3.7.0_new/tests/test-add-delete-qdisc.c	2024-06-03 16:23:13.892190500 +0800
8291d68314aSopenharmony_ci@@ -0,0 +1,156 @@
8301d68314aSopenharmony_ci+#include <netlink/cli/utils.h>
8311d68314aSopenharmony_ci+#include <netlink/cli/tc.h>
8321d68314aSopenharmony_ci+#include <netlink/cli/qdisc.h>
8331d68314aSopenharmony_ci+#include <netlink/cli/link.h>
8341d68314aSopenharmony_ci+#include <netlink-private/route/tc-api.h>
8351d68314aSopenharmony_ci+#include <linux/netlink.h>
8361d68314aSopenharmony_ci+#include <stdio.h>
8371d68314aSopenharmony_ci+#include <params.h>
8381d68314aSopenharmony_ci+
8391d68314aSopenharmony_ci+
8401d68314aSopenharmony_ci+static int default_yes = 0, deleted = 0, interactive = 0;
8411d68314aSopenharmony_ci+static struct nl_sock *sk;
8421d68314aSopenharmony_ci+
8431d68314aSopenharmony_ci+static void delete_cb(struct nl_object *obj, void *arg)
8441d68314aSopenharmony_ci+{
8451d68314aSopenharmony_ci+    struct rtnl_qdisc *qdisc = nl_object_priv(obj);
8461d68314aSopenharmony_ci+    struct nl_dump_params params = {
8471d68314aSopenharmony_ci+        .dp_type = NL_DUMP_LINE,
8481d68314aSopenharmony_ci+        .dp_fd = stdout,
8491d68314aSopenharmony_ci+    };
8501d68314aSopenharmony_ci+    int err;
8511d68314aSopenharmony_ci+
8521d68314aSopenharmony_ci+        /* Ignore default qdiscs, unable to delete */
8531d68314aSopenharmony_ci+    if (rtnl_tc_get_handle((struct rtnl_tc *) qdisc) == 0)
8541d68314aSopenharmony_ci+         return;
8551d68314aSopenharmony_ci+
8561d68314aSopenharmony_ci+    if (interactive && !nl_cli_confirm(obj, &params, default_yes))
8571d68314aSopenharmony_ci+         return;
8581d68314aSopenharmony_ci+
8591d68314aSopenharmony_ci+    if ((err = rtnl_qdisc_delete(sk, qdisc)) < 0) {
8601d68314aSopenharmony_ci+         nl_cli_fatal(err, "Unable to delete qdisc: %s\n", nl_geterror(err));
8611d68314aSopenharmony_ci+    }
8621d68314aSopenharmony_ci+    deleted++;
8631d68314aSopenharmony_ci+}
8641d68314aSopenharmony_ci+
8651d68314aSopenharmony_ci+static int test_delete_qdisc()
8661d68314aSopenharmony_ci+{
8671d68314aSopenharmony_ci+    struct rtnl_qdisc *qdisc;
8681d68314aSopenharmony_ci+    struct rtnl_tc *tc;
8691d68314aSopenharmony_ci+    struct nl_cache *link_cache, *qdisc_cache;
8701d68314aSopenharmony_ci+    struct nl_cli_tc_module *tm;
8711d68314aSopenharmony_ci+    struct rtnl_tc_ops *ops;
8721d68314aSopenharmony_ci+    char kind[] = "htb";
8731d68314aSopenharmony_ci+    int err = 0;
8741d68314aSopenharmony_ci+
8751d68314aSopenharmony_ci+    sk = nl_cli_alloc_socket();
8761d68314aSopenharmony_ci+    nl_cli_connect(sk, NETLINK_ROUTE);
8771d68314aSopenharmony_ci+    link_cache = nl_cli_link_alloc_cache(sk);
8781d68314aSopenharmony_ci+    qdisc_cache = nl_cli_qdisc_alloc_cache(sk);
8791d68314aSopenharmony_ci+    qdisc = nl_cli_qdisc_alloc();
8801d68314aSopenharmony_ci+    tc = (struct rtnl_tc *) qdisc;
8811d68314aSopenharmony_ci+    nl_cli_tc_parse_dev(tc, link_cache, DEV_NAME);
8821d68314aSopenharmony_ci+    nl_cli_tc_parse_parent(tc, "root");
8831d68314aSopenharmony_ci+
8841d68314aSopenharmony_ci+    if (!rtnl_tc_get_ifindex(tc)) {
8851d68314aSopenharmony_ci+        printf("You must specify a network device (--dev=XXX)");
8861d68314aSopenharmony_ci+        goto END;
8871d68314aSopenharmony_ci+    }
8881d68314aSopenharmony_ci+
8891d68314aSopenharmony_ci+    if (!rtnl_tc_get_parent(tc)) {
8901d68314aSopenharmony_ci+        printf("You must specify a parent");
8911d68314aSopenharmony_ci+        goto END;
8921d68314aSopenharmony_ci+    }
8931d68314aSopenharmony_ci+
8941d68314aSopenharmony_ci+    rtnl_tc_set_kind(tc, kind);
8951d68314aSopenharmony_ci+    if (!(ops = rtnl_tc_get_ops(tc))) {
8961d68314aSopenharmony_ci+        printf("Unknown qdisc \"%s\"", kind);
8971d68314aSopenharmony_ci+        goto END;
8981d68314aSopenharmony_ci+    }
8991d68314aSopenharmony_ci+
9001d68314aSopenharmony_ci+    if (!(tm = nl_cli_tc_lookup(ops))) {
9011d68314aSopenharmony_ci+        nl_cli_fatal(ENOTSUP, "Qdisc type \"%s\" not supported.", kind);
9021d68314aSopenharmony_ci+        goto END;
9031d68314aSopenharmony_ci+    }
9041d68314aSopenharmony_ci+
9051d68314aSopenharmony_ci+
9061d68314aSopenharmony_ci+    nl_cache_foreach_filter(qdisc_cache, OBJ_CAST(qdisc), delete_cb, NULL);
9071d68314aSopenharmony_ci+
9081d68314aSopenharmony_ci+END:
9091d68314aSopenharmony_ci+    nl_cache_put(link_cache);
9101d68314aSopenharmony_ci+    nl_cache_put(qdisc_cache);
9111d68314aSopenharmony_ci+    rtnl_qdisc_put(qdisc);
9121d68314aSopenharmony_ci+    nl_socket_free(sk);
9131d68314aSopenharmony_ci+    return err;
9141d68314aSopenharmony_ci+}
9151d68314aSopenharmony_ci+
9161d68314aSopenharmony_ci+static int test_add_qdisc()
9171d68314aSopenharmony_ci+{
9181d68314aSopenharmony_ci+    struct rtnl_qdisc *qdisc;
9191d68314aSopenharmony_ci+    struct rtnl_tc *tc;
9201d68314aSopenharmony_ci+    struct nl_cache *link_cache;
9211d68314aSopenharmony_ci+    struct nl_cli_tc_module *tm;
9221d68314aSopenharmony_ci+    struct rtnl_tc_ops *ops;
9231d68314aSopenharmony_ci+    char kind[] = "htb";
9241d68314aSopenharmony_ci+    int err = 0, flags = NLM_F_CREATE | NLM_F_EXCL;
9251d68314aSopenharmony_ci+
9261d68314aSopenharmony_ci+    if (!(sk = nl_socket_alloc())){
9271d68314aSopenharmony_ci+        printf("Unable to allocate netlink socket\n");
9281d68314aSopenharmony_ci+        return -1;
9291d68314aSopenharmony_ci+    }
9301d68314aSopenharmony_ci+    if ((err = nl_connect(sk, NETLINK_ROUTE)) < 0) {
9311d68314aSopenharmony_ci+        printf("Unable to connect netlink socket: %s\n", nl_geterror(err));
9321d68314aSopenharmony_ci+        nl_socket_free(sk);
9331d68314aSopenharmony_ci+        return -1;
9341d68314aSopenharmony_ci+    }
9351d68314aSopenharmony_ci+    link_cache = nl_cli_link_alloc_cache(sk);
9361d68314aSopenharmony_ci+    qdisc = nl_cli_qdisc_alloc();
9371d68314aSopenharmony_ci+    tc = (struct rtnl_tc *) qdisc;
9381d68314aSopenharmony_ci+
9391d68314aSopenharmony_ci+    nl_cli_tc_parse_dev(tc, link_cache, DEV_NAME);
9401d68314aSopenharmony_ci+    nl_cli_tc_parse_parent(tc, "root");
9411d68314aSopenharmony_ci+
9421d68314aSopenharmony_ci+    if (!rtnl_tc_get_ifindex(tc)){
9431d68314aSopenharmony_ci+        printf("You must specify a network device (--dev=XXX)\n");
9441d68314aSopenharmony_ci+        goto END;
9451d68314aSopenharmony_ci+    }
9461d68314aSopenharmony_ci+
9471d68314aSopenharmony_ci+    if (!rtnl_tc_get_parent(tc)){
9481d68314aSopenharmony_ci+        printf("You must specify a parent\n");
9491d68314aSopenharmony_ci+        goto END;
9501d68314aSopenharmony_ci+    }
9511d68314aSopenharmony_ci+
9521d68314aSopenharmony_ci+    rtnl_tc_set_kind(tc, kind);
9531d68314aSopenharmony_ci+    if (!(ops = rtnl_tc_get_ops(tc))){
9541d68314aSopenharmony_ci+        printf("Unknown qdisc \"%s\"\n", kind);
9551d68314aSopenharmony_ci+        goto END;
9561d68314aSopenharmony_ci+    }
9571d68314aSopenharmony_ci+    if (!(tm = nl_cli_tc_lookup(ops))){
9581d68314aSopenharmony_ci+        nl_cli_fatal(ENOTSUP, "Qdisc type \"%s\" not supported.\n", kind);
9591d68314aSopenharmony_ci+        goto END;
9601d68314aSopenharmony_ci+    }
9611d68314aSopenharmony_ci+
9621d68314aSopenharmony_ci+    if ((err = rtnl_qdisc_add(sk, qdisc, flags)) < 0){
9631d68314aSopenharmony_ci+        printf("Unable to add qdisc: %s\n", nl_geterror(err));
9641d68314aSopenharmony_ci+        goto END;
9651d68314aSopenharmony_ci+    }
9661d68314aSopenharmony_ci+
9671d68314aSopenharmony_ci+END:
9681d68314aSopenharmony_ci+    nl_cache_mngt_unprovide(link_cache);
9691d68314aSopenharmony_ci+    nl_cache_put(link_cache);
9701d68314aSopenharmony_ci+    rtnl_qdisc_put(qdisc);
9711d68314aSopenharmony_ci+    nl_socket_free(sk);
9721d68314aSopenharmony_ci+    return err;
9731d68314aSopenharmony_ci+}
9741d68314aSopenharmony_ci+
9751d68314aSopenharmony_ci+int main(int args, char *argv[])
9761d68314aSopenharmony_ci+{
9771d68314aSopenharmony_ci+    int err = 0;
9781d68314aSopenharmony_ci+    if ((err = test_add_qdisc()) < 0) {
9791d68314aSopenharmony_ci+        printf("Unable to add qdisc:%s", nl_geterror(err));
9801d68314aSopenharmony_ci+    }
9811d68314aSopenharmony_ci+    if ((err = test_delete_qdisc()) < 0) {
9821d68314aSopenharmony_ci+        printf("Unable to delete qdisc:%s", nl_geterror(err));
9831d68314aSopenharmony_ci+    }
9841d68314aSopenharmony_ci+    return err;
9851d68314aSopenharmony_ci+}
9861d68314aSopenharmony_cidiff -urN libnl-3.7.0/tests/test-add-delete-route.c libnl-3.7.0_new/tests/test-add-delete-route.c
9871d68314aSopenharmony_ci--- libnl-3.7.0/tests/test-add-delete-route.c	1970-01-01 08:00:00.000000000 +0800
9881d68314aSopenharmony_ci+++ libnl-3.7.0_new/tests/test-add-delete-route.c	2024-06-03 16:23:13.892190500 +0800
9891d68314aSopenharmony_ci@@ -0,0 +1,43 @@
9901d68314aSopenharmony_ci+#include <netlink/cli/utils.h>
9911d68314aSopenharmony_ci+#include <netlink/cli/route.h>
9921d68314aSopenharmony_ci+#include <netlink/cli/link.h>
9931d68314aSopenharmony_ci+#include <linux/netlink.h>
9941d68314aSopenharmony_ci+#include <stdio.h>
9951d68314aSopenharmony_ci+#include <params.h>
9961d68314aSopenharmony_ci+
9971d68314aSopenharmony_ci+
9981d68314aSopenharmony_ci+int main(int argc, char argv[])
9991d68314aSopenharmony_ci+{
10001d68314aSopenharmony_ci+    struct nl_sock *sk;
10011d68314aSopenharmony_ci+    struct rtnl_route *route;
10021d68314aSopenharmony_ci+    struct nl_cache *link_cache, *route_cache;
10031d68314aSopenharmony_ci+    char dst_addr[] = DST_ADDR;
10041d68314aSopenharmony_ci+    char nexthop[] = NEXTHOP;
10051d68314aSopenharmony_ci+    int err = 0;
10061d68314aSopenharmony_ci+
10071d68314aSopenharmony_ci+    sk = nl_cli_alloc_socket();
10081d68314aSopenharmony_ci+    nl_cli_connect(sk, NETLINK_ROUTE);
10091d68314aSopenharmony_ci+    link_cache = nl_cli_link_alloc_cache(sk);
10101d68314aSopenharmony_ci+    route_cache = nl_cli_route_alloc_cache(sk, 0);
10111d68314aSopenharmony_ci+    route = nl_cli_route_alloc();
10121d68314aSopenharmony_ci+
10131d68314aSopenharmony_ci+    nl_cli_route_parse_dst(route, dst_addr);
10141d68314aSopenharmony_ci+    nl_cli_route_parse_nexthop(route, nexthop, link_cache);
10151d68314aSopenharmony_ci+
10161d68314aSopenharmony_ci+    if ((err = rtnl_route_add(sk, route, NLM_F_EXCL)) < 0) {
10171d68314aSopenharmony_ci+        printf("Unable to add route: %s", nl_geterror(err));
10181d68314aSopenharmony_ci+        goto END;
10191d68314aSopenharmony_ci+    }
10201d68314aSopenharmony_ci+
10211d68314aSopenharmony_ci+    if ((err = rtnl_route_delete(sk, route, NLM_F_EXCL)) < 0) {
10221d68314aSopenharmony_ci+        printf("Unable to delete route: %s", nl_geterror(err));
10231d68314aSopenharmony_ci+        goto END;
10241d68314aSopenharmony_ci+    }
10251d68314aSopenharmony_ci+
10261d68314aSopenharmony_ci+END:
10271d68314aSopenharmony_ci+    rtnl_route_put(route);
10281d68314aSopenharmony_ci+    nl_cache_put(link_cache);
10291d68314aSopenharmony_ci+    nl_cache_put(route_cache);
10301d68314aSopenharmony_ci+    nl_socket_free(sk);
10311d68314aSopenharmony_ci+    return err;
10321d68314aSopenharmony_ci+}
10331d68314aSopenharmony_cidiff -urN libnl-3.7.0/tests/test-genl-connect.c libnl-3.7.0_new/tests/test-genl-connect.c
10341d68314aSopenharmony_ci--- libnl-3.7.0/tests/test-genl-connect.c	1970-01-01 08:00:00.000000000 +0800
10351d68314aSopenharmony_ci+++ libnl-3.7.0_new/tests/test-genl-connect.c	2024-06-03 16:23:13.892190500 +0800
10361d68314aSopenharmony_ci@@ -0,0 +1,37 @@
10371d68314aSopenharmony_ci+#include <linux/genetlink.h>
10381d68314aSopenharmony_ci+#include <netlink/socket.h>
10391d68314aSopenharmony_ci+#include <netlink/cli/utils.h>
10401d68314aSopenharmony_ci+#include <stdio.h>
10411d68314aSopenharmony_ci+
10421d68314aSopenharmony_ci+
10431d68314aSopenharmony_ci+int main(int argc, char *argv[])
10441d68314aSopenharmony_ci+{
10451d68314aSopenharmony_ci+    struct nl_sock *sk;
10461d68314aSopenharmony_ci+    struct nl_cache *family_cache;
10471d68314aSopenharmony_ci+    struct nl_dump_params params = {
10481d68314aSopenharmony_ci+        .dp_type = NL_DUMP_LINE,
10491d68314aSopenharmony_ci+        .dp_fd = stdout,
10501d68314aSopenharmony_ci+	};
10511d68314aSopenharmony_ci+    int err = 0;
10521d68314aSopenharmony_ci+
10531d68314aSopenharmony_ci+    sk = nl_socket_alloc();
10541d68314aSopenharmony_ci+    if ((err = genl_connect(sk)) < 0) {
10551d68314aSopenharmony_ci+        printf("Unable create socket: %s\n", nl_geterror(err));
10561d68314aSopenharmony_ci+        goto END;
10571d68314aSopenharmony_ci+    }    
10581d68314aSopenharmony_ci+    nl_socket_enable_auto_ack(sk);
10591d68314aSopenharmony_ci+
10601d68314aSopenharmony_ci+    if (nl_socket_get_fd(sk) < 0) {
10611d68314aSopenharmony_ci+        printf("vaild socket\n");
10621d68314aSopenharmony_ci+	err = -1;
10631d68314aSopenharmony_ci+        goto END;
10641d68314aSopenharmony_ci+    }
10651d68314aSopenharmony_ci+    nl_socket_set_buffer_size(sk, 32655, 32655);
10661d68314aSopenharmony_ci+    family_cache = nl_cli_alloc_cache(sk, "generic netlink family", genl_ctrl_alloc_cache);
10671d68314aSopenharmony_ci+    nl_cache_dump(family_cache, &params);
10681d68314aSopenharmony_ci+
10691d68314aSopenharmony_ci+END:
10701d68314aSopenharmony_ci+    nl_socket_free(sk);
10711d68314aSopenharmony_ci+    nl_cache_put(family_cache);
10721d68314aSopenharmony_ci+    return err;
10731d68314aSopenharmony_ci+}
10741d68314aSopenharmony_cidiff -urN libnl-3.7.0/tests/test-link.c libnl-3.7.0_new/tests/test-link.c
10751d68314aSopenharmony_ci--- libnl-3.7.0/tests/test-link.c	1970-01-01 08:00:00.000000000 +0800
10761d68314aSopenharmony_ci+++ libnl-3.7.0_new/tests/test-link.c	2024-06-03 18:34:22.314718700 +0800
10771d68314aSopenharmony_ci@@ -0,0 +1,68 @@
10781d68314aSopenharmony_ci+#include <netlink/socket.h>
10791d68314aSopenharmony_ci+#include <netlink/netlink.h>
10801d68314aSopenharmony_ci+#include <netlink/cli/utils.h>
10811d68314aSopenharmony_ci+#include <netlink/cli/link.h>
10821d68314aSopenharmony_ci+#include <netlink/route/link.h>
10831d68314aSopenharmony_ci+#include <unistd.h>
10841d68314aSopenharmony_ci+
10851d68314aSopenharmony_ci+
10861d68314aSopenharmony_ci+static int self_def_cb = NL_CB_DEBUG;
10871d68314aSopenharmony_ci+
10881d68314aSopenharmony_ci+
10891d68314aSopenharmony_ci+int main(int argc, char *argv[])
10901d68314aSopenharmony_ci+{
10911d68314aSopenharmony_ci+    struct nl_sock *sk;
10921d68314aSopenharmony_ci+    struct nl_cache *link_cache;
10931d68314aSopenharmony_ci+    struct rtnl_link *link;
10941d68314aSopenharmony_ci+    struct nl_addr *addr;
10951d68314aSopenharmony_ci+    struct nl_cb *cb;
10961d68314aSopenharmony_ci+    int err = 0, ifindex, pid;
10971d68314aSopenharmony_ci+    char *buf;
10981d68314aSopenharmony_ci+
10991d68314aSopenharmony_ci+    cb = nl_cb_alloc(self_def_cb);
11001d68314aSopenharmony_ci+    pid = getpid();
11011d68314aSopenharmony_ci+
11021d68314aSopenharmony_ci+    if (!(sk = nl_socket_alloc_cb(cb))) {
11031d68314aSopenharmony_ci+        nl_cli_fatal(ENOBUFS, "Unable to allocate netlink socket\n");
11041d68314aSopenharmony_ci+    }
11051d68314aSopenharmony_ci+    nl_cli_connect(sk, NETLINK_ROUTE);
11061d68314aSopenharmony_ci+    nl_socket_disable_seq_check(sk);
11071d68314aSopenharmony_ci+    nl_socket_disable_auto_ack(sk);
11081d68314aSopenharmony_ci+    nl_socket_set_local_port(sk, pid);
11091d68314aSopenharmony_ci+    nl_join_groups(sk, pid);
11101d68314aSopenharmony_ci+    nl_socket_drop_membership(sk, pid);
11111d68314aSopenharmony_ci+    nl_socket_set_peer_port(sk, 0);
11121d68314aSopenharmony_ci+
11131d68314aSopenharmony_ci+    link_cache = nl_cli_link_alloc_cache(sk);
11141d68314aSopenharmony_ci+    link = nl_cli_link_alloc();
11151d68314aSopenharmony_ci+
11161d68314aSopenharmony_ci+    if (err = nl_socket_get_peer_port(sk)){
11171d68314aSopenharmony_ci+        printf("peer_port %d\n", err);
11181d68314aSopenharmony_ci+        goto END;
11191d68314aSopenharmony_ci+    }    
11201d68314aSopenharmony_ci+    if (err = nl_socket_use_seq(sk))
11211d68314aSopenharmony_ci+        printf("sk->s_seq_next %d\n", err);
11221d68314aSopenharmony_ci+    
11231d68314aSopenharmony_ci+    if ((ifindex = rtnl_link_get_ifindex(link)) == 0){
11241d68314aSopenharmony_ci+        printf("ifindex is not set, %d\n", ifindex);
11251d68314aSopenharmony_ci+        rtnl_link_set_ifindex(link, 1);
11261d68314aSopenharmony_ci+    };
11271d68314aSopenharmony_ci+
11281d68314aSopenharmony_ci+    if (rtnl_link_get(link_cache, 1)){
11291d68314aSopenharmony_ci+        printf("now link is cached\n");
11301d68314aSopenharmony_ci+    }else{
11311d68314aSopenharmony_ci+        nl_cache_add(link_cache, (struct nl_object *)link);
11321d68314aSopenharmony_ci+    };
11331d68314aSopenharmony_ci+
11341d68314aSopenharmony_ci+    if ((err = rtnl_link_add(sk, link, AF_INET)) < 0){
11351d68314aSopenharmony_ci+        printf("Unable to add link %s\n", nl_geterror(err));
11361d68314aSopenharmony_ci+        goto END;
11371d68314aSopenharmony_ci+    }
11381d68314aSopenharmony_ci+
11391d68314aSopenharmony_ci+END:
11401d68314aSopenharmony_ci+    nl_cb_put(cb);
11411d68314aSopenharmony_ci+    nl_socket_free(sk);
11421d68314aSopenharmony_ci+    nl_cache_put(link_cache);
11431d68314aSopenharmony_ci+    rtnl_link_put(link);
11441d68314aSopenharmony_ci+    return err;
11451d68314aSopenharmony_ci+}
1146