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