1 /*
2 * Copyright (C) 2015-2020 Alibaba Group Holding Limited
3 */
4
5 #include <string.h>
6 #include <stdlib.h>
7 #include <unistd.h>
8 #include "netmgr_wifi.h"
9 #include "netmgr_conn.h"
10 #include "ulog/ulog.h"
11
12 #define TAG "NETMGR_CONN"
13 #define NETMGR_CONN_LOGE(level, ...) LOGE(TAG, level, ##__VA_ARGS__)
14 #define NETMGR_CONN_LOGI(level, ...) LOGI(TAG, level, ##__VA_ARGS__)
15 #define NETMGR_CONN_LOGD(level, ...) LOGD(TAG, level, ##__VA_ARGS__)
16
17 static netmgr_conn_t * g_netmgr_conn_list = NULL;
18
netmgr_conn_init(netmgr_type_t type)19 netmgr_conn_t* netmgr_conn_init(netmgr_type_t type)
20 {
21 netmgr_conn_t* conn = (netmgr_conn_t *)malloc(sizeof(netmgr_conn_t));
22 if(conn == NULL) {
23 return NULL;
24 }
25 memset(conn, 0, sizeof(netmgr_conn_t));
26
27 conn->next = NULL;
28 conn->state = CONN_STATE_DISCONNECTED;
29 conn->type = type;
30
31 if(g_netmgr_conn_list == NULL) {
32 g_netmgr_conn_list = conn;
33 } else {
34 conn->next = g_netmgr_conn_list;
35 g_netmgr_conn_list = conn;
36 }
37
38 return conn;
39 }
40
netmgr_conn_deinit(netmgr_conn_t * conn)41 int netmgr_conn_deinit(netmgr_conn_t* conn)
42 {
43 netmgr_conn_t* current = g_netmgr_conn_list;
44 while(current != NULL) {
45 if(current == conn) {
46 break;
47 } else {
48 current = current->next;
49 }
50 }
51
52 if(current != NULL) {
53 free(conn);
54 }
55 else {
56 return -1;
57 }
58
59 return 0;
60 }
61
conn_disconnecting(netmgr_conn_t * conn)62 int conn_disconnecting(netmgr_conn_t* conn)
63 {
64 if((conn->state != CONN_STATE_DISCONNECTED)
65 &&(conn->state != CONN_STATE_DISCONNECTING)) {
66 NETMGR_CONN_LOGI("%s:%d old state=%d\n", __func__, __LINE__, conn->state);
67 conn->state = CONN_STATE_DISCONNECTING;
68 return conn->disconnecting_cb(conn);
69 }
70 return 0;
71 }
72
conn_disconnected(netmgr_conn_t * conn)73 int conn_disconnected(netmgr_conn_t* conn)
74 {
75 NETMGR_CONN_LOGI("%s:%d\n", __func__, __LINE__);
76 conn->state = CONN_STATE_DISCONNECTED;
77 return conn->disconnected_cb(conn);
78 }
79
conn_connecting(netmgr_conn_t * conn)80 int conn_connecting(netmgr_conn_t* conn)
81 {
82 NETMGR_CONN_LOGI("%s:%d\n", __func__, __LINE__);
83 if((conn->state != CONN_STATE_DISCONNECTED)
84 &&(conn->state != CONN_STATE_CONNECTING)) {
85 NETMGR_CONN_LOGE("%s:%d wrong state=%d\n", __func__, __LINE__, conn->state);
86 conn->state = CONN_STATE_FAILED;
87 return conn->failed_cb(conn);
88 } else {
89 NETMGR_CONN_LOGI("%s:%d\n", __func__, __LINE__);
90 conn->state = CONN_STATE_CONNECTING;
91 return 0;
92 }
93
94 }
95
conn_connected(netmgr_conn_t * conn)96 int conn_connected(netmgr_conn_t* conn)
97 {
98 NETMGR_CONN_LOGI("%s:%d old state=%d\n", __func__, __LINE__, conn->state);
99 if(conn->state != CONN_STATE_OBTAINING_IP) {
100 conn->state = CONN_STATE_CONNECTED;
101 }
102 return conn->connected_cb(conn);
103 }
104
conn_obtaining_ip(netmgr_conn_t * conn)105 int conn_obtaining_ip(netmgr_conn_t* conn)
106 {
107 NETMGR_CONN_LOGI("%s:%d\n", __func__, __LINE__);
108 if((conn->state != CONN_STATE_CONNECTED)
109 && (conn->state != CONN_STATE_OBTAINING_IP)
110 && (conn->state != CONN_STATE_NETWORK_CONNECTED)) {
111 NETMGR_CONN_LOGE("%s:%d wrong state=%d\n", __func__, __LINE__, conn->state);
112 conn->state = CONN_STATE_FAILED;
113 return conn->failed_cb(conn);
114 } else {
115 NETMGR_CONN_LOGI("%s:%d\n", __func__, __LINE__);
116 conn->state = CONN_STATE_OBTAINING_IP;
117 return conn->obtaining_ip_cb(conn);
118 }
119
120 }
121
conn_network_connected(netmgr_conn_t * conn)122 int conn_network_connected(netmgr_conn_t* conn)
123 {
124 if((conn->state != CONN_STATE_OBTAINING_IP)
125 &&(conn->state != CONN_STATE_NETWORK_CONNECTED)) {
126 NETMGR_CONN_LOGE("%s:%d wrong state=%d\n", __func__, __LINE__, conn->state);
127 conn->state = CONN_STATE_FAILED;
128 return conn->failed_cb(conn);
129 } else {
130 NETMGR_CONN_LOGI("%s:%d\n", __func__, __LINE__);
131 conn->state = CONN_STATE_NETWORK_CONNECTED;
132 return conn->network_connected_cb(conn);
133 }
134
135 }
136
conn_failed(netmgr_conn_t * conn)137 int conn_failed(netmgr_conn_t* conn)
138 {
139 if(conn == NULL) {
140 return -1;
141 }
142
143 if(conn->state != CONN_STATE_CONNECTED) {
144 NETMGR_CONN_LOGE("%s:%d wrong state=%d\n", __func__, __LINE__, conn->state);
145 conn->state = CONN_STATE_FAILED;
146 return conn->failed_cb(conn);
147 } else {
148 conn->state = CONN_STATE_DISCONNECTING;
149 return 0;
150 }
151 }
152
153 /* Netmgr Connection State Management */
netmgr_conn_state_change(netmgr_conn_t * conn,netmgr_conn_state_t new_state)154 int netmgr_conn_state_change(netmgr_conn_t *conn, netmgr_conn_state_t new_state)
155 {
156 if (conn == NULL) {
157 return -1;
158 }
159
160 NETMGR_CONN_LOGI("%s:%d new_state=%d old_state=%d\n", __func__, __LINE__, new_state, conn->state);
161 switch (new_state) {
162 case CONN_STATE_DISCONNECTING:
163 NETMGR_CONN_LOGD("%s:%d\n", __func__, __LINE__);
164 conn_disconnecting(conn);
165 break;
166 case CONN_STATE_DISCONNECTED:
167 NETMGR_CONN_LOGD("%s:%d\n", __func__, __LINE__);
168 conn_disconnected(conn);
169 break;
170 case CONN_STATE_CONNECTING:
171 NETMGR_CONN_LOGD("%s:%d\n", __func__, __LINE__);
172 conn_connecting(conn);
173 break;
174 case CONN_STATE_CONNECTED:
175 NETMGR_CONN_LOGD("%s:%d\n", __func__, __LINE__);
176 conn_connected(conn);
177 break;
178 case CONN_STATE_OBTAINING_IP:
179 NETMGR_CONN_LOGD("%s:%d\n", __func__, __LINE__);
180 conn_obtaining_ip(conn);
181 break;
182 case CONN_STATE_NETWORK_CONNECTED:
183 NETMGR_CONN_LOGD("%s:%d\n", __func__, __LINE__);
184 conn_network_connected(conn);
185 break;
186 case CONN_STATE_FAILED:
187 default:
188 NETMGR_CONN_LOGE("%s:%d old state=%d new state=%d\n", __func__, __LINE__, conn->state, new_state);
189 conn_failed(conn);
190 break;
191 }
192
193 return 0;
194 }
195