summaryrefslogtreecommitdiff
path: root/pkg/iproute2/patch/0010-ip-Fix-get_link_kind-when-linked-statically.patch
blob: 251ae703e9648eb74152ef771cd9a55d2b499f3d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
From d01fedaf6124f77cee82d8023e8ed0aa1cec345a Mon Sep 17 00:00:00 2001
From: Michael Forney <mforney@mforney.org>
Date: Mon, 24 Jun 2019 16:03:55 -0700
Subject: [PATCH] ip: Fix get_link_kind when linked statically

---
 ip/iplink.c | 100 ++++++++++++++++++++++++++++++++++++++++++++++------
 1 file changed, 90 insertions(+), 10 deletions(-)

diff --git a/ip/iplink.c b/ip/iplink.c
index 10f6c2c6..de7f21d6 100644
--- a/ip/iplink.c
+++ b/ip/iplink.c
@@ -151,7 +151,6 @@ static int on_off(const char *msg, const char *realval)
 	return -1;
 }
 
-static void *BODY;		/* cached dlopen(NULL) handle */
 static struct link_util *linkutil_list;
 
 struct link_util *get_link_kind(const char *id)
@@ -160,21 +159,102 @@ struct link_util *get_link_kind(const char *id)
 	char buf[256];
 	struct link_util *l;
 
+	if (linkutil_list == NULL) {
+		// <sed -n 's/^\(struct link_util .*_link_util\) = {/		extern \1;/p' ip/*.c
+		extern struct link_util bareudp_link_util;
+		extern struct link_util bond_link_util;
+		extern struct link_util bond_slave_link_util;
+		extern struct link_util bridge_link_util;
+		extern struct link_util bridge_slave_link_util;
+		extern struct link_util can_link_util;
+		extern struct link_util dummy_link_util;
+		extern struct link_util geneve_link_util;
+		extern struct link_util hsr_link_util;
+		extern struct link_util ifb_link_util;
+		extern struct link_util ipoib_link_util;
+		extern struct link_util ipvlan_link_util;
+		extern struct link_util ipvtap_link_util;
+		extern struct link_util macvlan_link_util;
+		extern struct link_util macvtap_link_util;
+		extern struct link_util netdevsim_link_util;
+		extern struct link_util nlmon_link_util;
+		extern struct link_util rmnet_link_util;
+		extern struct link_util team_link_util;
+		extern struct link_util vcan_link_util;
+		extern struct link_util vlan_link_util;
+		extern struct link_util vrf_link_util;
+		extern struct link_util vrf_slave_link_util;
+		extern struct link_util vxcan_link_util;
+		extern struct link_util vxlan_link_util;
+		extern struct link_util wwan_link_util;
+		extern struct link_util macsec_link_util;
+		extern struct link_util tun_link_util;
+		extern struct link_util gre_link_util;
+		extern struct link_util gretap_link_util;
+		extern struct link_util erspan_link_util;
+		extern struct link_util ip6gre_link_util;
+		extern struct link_util ip6gretap_link_util;
+		extern struct link_util ip6erspan_link_util;
+		extern struct link_util ip6tnl_link_util;
+		extern struct link_util ipip_link_util;
+		extern struct link_util sit_link_util;
+		extern struct link_util veth_link_util;
+		extern struct link_util vti_link_util;
+		extern struct link_util vti6_link_util;
+		extern struct link_util xfrm_link_util;
+
+		// <sed -n 's/^struct link_util \(.*_link_util\) = {/		\1.next = linkutil_list, linkutil_list = \&\1;/p' ip/*.c
+		bareudp_link_util.next = linkutil_list, linkutil_list = &bareudp_link_util;
+		bond_link_util.next = linkutil_list, linkutil_list = &bond_link_util;
+		bond_slave_link_util.next = linkutil_list, linkutil_list = &bond_slave_link_util;
+		bridge_link_util.next = linkutil_list, linkutil_list = &bridge_link_util;
+		bridge_slave_link_util.next = linkutil_list, linkutil_list = &bridge_slave_link_util;
+		can_link_util.next = linkutil_list, linkutil_list = &can_link_util;
+		dummy_link_util.next = linkutil_list, linkutil_list = &dummy_link_util;
+		geneve_link_util.next = linkutil_list, linkutil_list = &geneve_link_util;
+		hsr_link_util.next = linkutil_list, linkutil_list = &hsr_link_util;
+		ifb_link_util.next = linkutil_list, linkutil_list = &ifb_link_util;
+		ipoib_link_util.next = linkutil_list, linkutil_list = &ipoib_link_util;
+		ipvlan_link_util.next = linkutil_list, linkutil_list = &ipvlan_link_util;
+		ipvtap_link_util.next = linkutil_list, linkutil_list = &ipvtap_link_util;
+		macvlan_link_util.next = linkutil_list, linkutil_list = &macvlan_link_util;
+		macvtap_link_util.next = linkutil_list, linkutil_list = &macvtap_link_util;
+		netdevsim_link_util.next = linkutil_list, linkutil_list = &netdevsim_link_util;
+		nlmon_link_util.next = linkutil_list, linkutil_list = &nlmon_link_util;
+		rmnet_link_util.next = linkutil_list, linkutil_list = &rmnet_link_util;
+		team_link_util.next = linkutil_list, linkutil_list = &team_link_util;
+		vcan_link_util.next = linkutil_list, linkutil_list = &vcan_link_util;
+		vlan_link_util.next = linkutil_list, linkutil_list = &vlan_link_util;
+		vrf_link_util.next = linkutil_list, linkutil_list = &vrf_link_util;
+		vrf_slave_link_util.next = linkutil_list, linkutil_list = &vrf_slave_link_util;
+		vxcan_link_util.next = linkutil_list, linkutil_list = &vxcan_link_util;
+		vxlan_link_util.next = linkutil_list, linkutil_list = &vxlan_link_util;
+		wwan_link_util.next = linkutil_list, linkutil_list = &wwan_link_util;
+		macsec_link_util.next = linkutil_list, linkutil_list = &macsec_link_util;
+		tun_link_util.next = linkutil_list, linkutil_list = &tun_link_util;
+		gre_link_util.next = linkutil_list, linkutil_list = &gre_link_util;
+		gretap_link_util.next = linkutil_list, linkutil_list = &gretap_link_util;
+		erspan_link_util.next = linkutil_list, linkutil_list = &erspan_link_util;
+		ip6gre_link_util.next = linkutil_list, linkutil_list = &ip6gre_link_util;
+		ip6gretap_link_util.next = linkutil_list, linkutil_list = &ip6gretap_link_util;
+		ip6erspan_link_util.next = linkutil_list, linkutil_list = &ip6erspan_link_util;
+		ip6tnl_link_util.next = linkutil_list, linkutil_list = &ip6tnl_link_util;
+		ipip_link_util.next = linkutil_list, linkutil_list = &ipip_link_util;
+		sit_link_util.next = linkutil_list, linkutil_list = &sit_link_util;
+		veth_link_util.next = linkutil_list, linkutil_list = &veth_link_util;
+		vti_link_util.next = linkutil_list, linkutil_list = &vti_link_util;
+		vti6_link_util.next = linkutil_list, linkutil_list = &vti6_link_util;
+		xfrm_link_util.next = linkutil_list, linkutil_list = &xfrm_link_util;
+	}
+
 	for (l = linkutil_list; l; l = l->next)
 		if (strcmp(l->id, id) == 0)
 			return l;
 
 	snprintf(buf, sizeof(buf), "%s/link_%s.so", get_ip_lib_dir(), id);
 	dlh = dlopen(buf, RTLD_LAZY);
-	if (dlh == NULL) {
-		/* look in current binary, only open once */
-		dlh = BODY;
-		if (dlh == NULL) {
-			dlh = BODY = dlopen(NULL, RTLD_LAZY);
-			if (dlh == NULL)
-				return NULL;
-		}
-	}
+	if (dlh == NULL)
+		return NULL;
 
 	snprintf(buf, sizeof(buf), "%s_link_util", id);
 	l = dlsym(dlh, buf);
-- 
2.34.1