Project

General

Profile

Bug #6123 » 0003-tools-gtp-tunnel-add-IPv6-support.patch

pablo, 10/06/2023 10:07 AM

View differences:

tools/gtp-tunnel.c
43 43

  
44 44
static void add_usage(const char *name)
45 45
{
46
	printf("%s add <gtp device> <v0> <tid> <ms-addr> <sgsn-addr>\n",
46
	printf("%s add <gtp device> <v0> <tid> <family> <ms-addr> <sgsn-addr>\n",
47 47
	       name);
48
	printf("%s add <gtp device> <v1> <i_tei> <o_tei> <ms-addr> <sgsn-addr>\n",
48
	printf("%s add <gtp device> <v1> <i_tei> <o_tei> <family> <ms-addr> <sgsn-addr>\n",
49 49
	       name);
50 50
}
51 51

  
52 52
static int
53 53
add_tunnel(int argc, char *argv[], int genl_id, struct mnl_socket *nl)
54 54
{
55
	union {
56
		struct in_addr addr;
57
		struct in6_addr addr6;
58
	} ms;
59
	union {
60
		struct in_addr addr;
61
		struct in6_addr addr6;
62
	} sgsn;
55 63
	struct gtp_tunnel *t;
56
	uint32_t gtp_ifidx;
57
	struct in_addr ms, sgsn;
58 64
	uint32_t gtp_version;
59
	int optidx;
65
	uint32_t gtp_ifidx;
66
	int optidx, family;
60 67

  
61
	if (argc < 7 || argc > 8) {
68
	if (argc < 8 || argc > 9) {
62 69
		add_usage(argv[0]);
63 70
		return EXIT_FAILURE;
64 71
	}
......
95 102
		gtp_tunnel_set_o_tei(t, atoi(argv[optidx++]));
96 103
	}
97 104

  
98
	if (inet_aton(argv[optidx++], &ms) < 0) {
99
		perror("bad address for ms");
105
	if (!strcmp(argv[optidx], "ip")) {
106
		family = AF_INET;
107
	} else if (!strcmp(argv[optidx], "ip6")) {
108
		family = AF_INET6;
109
	} else {
110
		fprintf(stderr, "wrong family `%s', expecting `ip' or `ip6'\n", argv[optidx]);
111
		return EXIT_FAILURE;
112
	}
113

  
114
	gtp_tunnel_set_family(t, family);
115

  
116
	optidx++;
117

  
118
	if (inet_pton(family, argv[optidx++], &ms) <= 0) {
119
		fprintf(stderr, "bad address for ms\n");
100 120
		exit(EXIT_FAILURE);
101 121
	}
102
	gtp_tunnel_set_ms_ip4(t, &ms);
103 122

  
104
	if (inet_aton(argv[optidx++], &sgsn) < 0) {
105
		perror("bad address for sgsn");
123
	switch (family) {
124
	case AF_INET:
125
		gtp_tunnel_set_ms_ip4(t, &ms.addr);
126
		break;
127
	case AF_INET6:
128
		gtp_tunnel_set_ms_ip6(t, &ms.addr6);
129
		break;
130
	}
131

  
132
	if (inet_pton(family, argv[optidx++], &sgsn) <= 0) {
133
		fprintf(stderr, "bad address for sgsn\n");
106 134
		exit(EXIT_FAILURE);
107 135
	}
108
	gtp_tunnel_set_sgsn_ip4(t, &sgsn);
136

  
137
	switch (family) {
138
	case AF_INET:
139
		gtp_tunnel_set_sgsn_ip4(t, &sgsn.addr);
140
		break;
141
	case AF_INET6:
142
		gtp_tunnel_set_sgsn_ip6(t, &sgsn.addr6);
143
		break;
144
	}
109 145

  
110 146
	gtp_add_tunnel(genl_id, nl, t);
111 147

  
(5-5/7)
Add picture from clipboard (Maximum size: 48.8 MB)