xref: /aosp_15_r20/external/libwebsockets/minimal-examples/api-tests/api-test-dhcpc/main.c (revision 1c60b9aca93fdbc9b5f19b2d2194c91294b22281)
1*1c60b9acSAndroid Build Coastguard Worker /*
2*1c60b9acSAndroid Build Coastguard Worker  * lws-api-test-dhcpc
3*1c60b9acSAndroid Build Coastguard Worker  *
4*1c60b9acSAndroid Build Coastguard Worker  * Written in 2019 by Andy Green <[email protected]>
5*1c60b9acSAndroid Build Coastguard Worker  *
6*1c60b9acSAndroid Build Coastguard Worker  * This file is made available under the Creative Commons CC0 1.0
7*1c60b9acSAndroid Build Coastguard Worker  * Universal Public Domain Dedication.
8*1c60b9acSAndroid Build Coastguard Worker  */
9*1c60b9acSAndroid Build Coastguard Worker 
10*1c60b9acSAndroid Build Coastguard Worker #include <libwebsockets.h>
11*1c60b9acSAndroid Build Coastguard Worker #include <signal.h>
12*1c60b9acSAndroid Build Coastguard Worker 
13*1c60b9acSAndroid Build Coastguard Worker static int interrupted, ok, fail, exp = 1;
14*1c60b9acSAndroid Build Coastguard Worker struct lws_context *context;
15*1c60b9acSAndroid Build Coastguard Worker const char *nif;
16*1c60b9acSAndroid Build Coastguard Worker 
17*1c60b9acSAndroid Build Coastguard Worker static const char * const sa46_names[] = {
18*1c60b9acSAndroid Build Coastguard Worker 	"LWSDH_SA46_IP",
19*1c60b9acSAndroid Build Coastguard Worker 	"LWSDH_SA46_DNS_SRV_1",
20*1c60b9acSAndroid Build Coastguard Worker 	"LWSDH_SA46_DNS_SRV_2",
21*1c60b9acSAndroid Build Coastguard Worker 	"LWSDH_SA46_DNS_SRV_3",
22*1c60b9acSAndroid Build Coastguard Worker 	"LWSDH_SA46_DNS_SRV_4",
23*1c60b9acSAndroid Build Coastguard Worker 	"LWSDH_SA46_IPV4_ROUTER",
24*1c60b9acSAndroid Build Coastguard Worker 	"LWSDH_SA46_NTP_SERVER",
25*1c60b9acSAndroid Build Coastguard Worker 	"LWSDH_SA46_DHCP_SERVER",
26*1c60b9acSAndroid Build Coastguard Worker };
27*1c60b9acSAndroid Build Coastguard Worker 
28*1c60b9acSAndroid Build Coastguard Worker static int
lws_dhcpc_cb(void * opaque,lws_dhcpc_ifstate_t * is)29*1c60b9acSAndroid Build Coastguard Worker lws_dhcpc_cb(void *opaque, lws_dhcpc_ifstate_t *is)
30*1c60b9acSAndroid Build Coastguard Worker {
31*1c60b9acSAndroid Build Coastguard Worker 	unsigned int n;
32*1c60b9acSAndroid Build Coastguard Worker 	char buf[64];
33*1c60b9acSAndroid Build Coastguard Worker 
34*1c60b9acSAndroid Build Coastguard Worker 	lwsl_user("%s: dhcp set OK\n", __func__);
35*1c60b9acSAndroid Build Coastguard Worker 
36*1c60b9acSAndroid Build Coastguard Worker 	for (n = 0; n < LWS_ARRAY_SIZE(sa46_names); n++) {
37*1c60b9acSAndroid Build Coastguard Worker 		lws_sa46_write_numeric_address(&is->sa46[n], buf, sizeof(buf));
38*1c60b9acSAndroid Build Coastguard Worker 		lwsl_notice("%s: %s: %s\n", __func__, sa46_names[n], buf);
39*1c60b9acSAndroid Build Coastguard Worker 	}
40*1c60b9acSAndroid Build Coastguard Worker 
41*1c60b9acSAndroid Build Coastguard Worker 	ok = 1;
42*1c60b9acSAndroid Build Coastguard Worker 	interrupted = 1;
43*1c60b9acSAndroid Build Coastguard Worker 	return 0;
44*1c60b9acSAndroid Build Coastguard Worker }
45*1c60b9acSAndroid Build Coastguard Worker 
sigint_handler(int sig)46*1c60b9acSAndroid Build Coastguard Worker void sigint_handler(int sig)
47*1c60b9acSAndroid Build Coastguard Worker {
48*1c60b9acSAndroid Build Coastguard Worker 	interrupted = 1;
49*1c60b9acSAndroid Build Coastguard Worker }
50*1c60b9acSAndroid Build Coastguard Worker 
51*1c60b9acSAndroid Build Coastguard Worker int
main(int argc,const char ** argv)52*1c60b9acSAndroid Build Coastguard Worker main(int argc, const char **argv)
53*1c60b9acSAndroid Build Coastguard Worker {
54*1c60b9acSAndroid Build Coastguard Worker 	struct lws_context_creation_info info;
55*1c60b9acSAndroid Build Coastguard Worker 	const char *p;
56*1c60b9acSAndroid Build Coastguard Worker 	int n = 1;
57*1c60b9acSAndroid Build Coastguard Worker 
58*1c60b9acSAndroid Build Coastguard Worker 	signal(SIGINT, sigint_handler);
59*1c60b9acSAndroid Build Coastguard Worker 
60*1c60b9acSAndroid Build Coastguard Worker 	memset(&info, 0, sizeof info); /* otherwise uninitialized garbage */
61*1c60b9acSAndroid Build Coastguard Worker 	lws_cmdline_option_handle_builtin(argc, argv, &info);
62*1c60b9acSAndroid Build Coastguard Worker 	lwsl_user("LWS API selftest: DHCP Client\n");
63*1c60b9acSAndroid Build Coastguard Worker 
64*1c60b9acSAndroid Build Coastguard Worker 	info.port = CONTEXT_PORT_NO_LISTEN;
65*1c60b9acSAndroid Build Coastguard Worker 	info.options = LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;
66*1c60b9acSAndroid Build Coastguard Worker 
67*1c60b9acSAndroid Build Coastguard Worker 	if ((p = lws_cmdline_option(argc, argv, "-i")))
68*1c60b9acSAndroid Build Coastguard Worker 		nif = p;
69*1c60b9acSAndroid Build Coastguard Worker 
70*1c60b9acSAndroid Build Coastguard Worker 	context = lws_create_context(&info);
71*1c60b9acSAndroid Build Coastguard Worker 	if (!context) {
72*1c60b9acSAndroid Build Coastguard Worker 		lwsl_err("lws init failed\n");
73*1c60b9acSAndroid Build Coastguard Worker 		return 1;
74*1c60b9acSAndroid Build Coastguard Worker 	}
75*1c60b9acSAndroid Build Coastguard Worker 
76*1c60b9acSAndroid Build Coastguard Worker 	if (nif) {
77*1c60b9acSAndroid Build Coastguard Worker 		lwsl_user("%s: requesting DHCP for %s\n", __func__, nif);
78*1c60b9acSAndroid Build Coastguard Worker 		lws_dhcpc_request(context, nif, AF_INET, lws_dhcpc_cb, NULL);
79*1c60b9acSAndroid Build Coastguard Worker 	} else {
80*1c60b9acSAndroid Build Coastguard Worker 		lwsl_err("%s: use -i <network-interface> to select if\n", __func__);
81*1c60b9acSAndroid Build Coastguard Worker 		interrupted = 1;
82*1c60b9acSAndroid Build Coastguard Worker 	}
83*1c60b9acSAndroid Build Coastguard Worker 
84*1c60b9acSAndroid Build Coastguard Worker 	/* the usual lws event loop */
85*1c60b9acSAndroid Build Coastguard Worker 
86*1c60b9acSAndroid Build Coastguard Worker 	n = 1;
87*1c60b9acSAndroid Build Coastguard Worker 	while (n >= 0 && !interrupted)
88*1c60b9acSAndroid Build Coastguard Worker 		n = lws_service(context, 0);
89*1c60b9acSAndroid Build Coastguard Worker 
90*1c60b9acSAndroid Build Coastguard Worker 	lws_context_destroy(context);
91*1c60b9acSAndroid Build Coastguard Worker 
92*1c60b9acSAndroid Build Coastguard Worker 	if (fail || ok != exp)
93*1c60b9acSAndroid Build Coastguard Worker 		lwsl_user("Completed: PASS: %d / %d, FAIL: %d\n", ok, exp,
94*1c60b9acSAndroid Build Coastguard Worker 				fail);
95*1c60b9acSAndroid Build Coastguard Worker 	else
96*1c60b9acSAndroid Build Coastguard Worker 		lwsl_user("Completed: ALL PASS: %d / %d\n", ok, exp);
97*1c60b9acSAndroid Build Coastguard Worker 
98*1c60b9acSAndroid Build Coastguard Worker 	return !(ok == exp && !fail);
99*1c60b9acSAndroid Build Coastguard Worker }
100