|
32 | 32 | #include "py/mpconfig.h"
|
33 | 33 | #include "py/obj.h"
|
34 | 34 | #include "py/objstr.h"
|
| 35 | +#include "py/parsenum.h" |
35 | 36 | #include "py/runtime.h"
|
36 | 37 | #include "py/stream.h"
|
37 | 38 | #include "py/mphal.h"
|
@@ -1057,6 +1058,116 @@ static mp_obj_t wlan_ifconfig(size_t n_args, const mp_obj_t *pos_args, mp_map_t
|
1057 | 1058 | }
|
1058 | 1059 | static MP_DEFINE_CONST_FUN_OBJ_KW(wlan_ifconfig_obj, 1, wlan_ifconfig);
|
1059 | 1060 |
|
| 1061 | +static mp_obj_t wlan_ipconfig(size_t n_args, const mp_obj_t *args, mp_map_t *kwargs) { |
| 1062 | + unsigned char len = sizeof(SlNetCfgIpV4Args_t); |
| 1063 | + unsigned char dhcpIsOn; |
| 1064 | + SlNetCfgIpV4Args_t ipV4; |
| 1065 | + sl_NetCfgGet(SL_IPV4_STA_P2P_CL_GET_INFO, &dhcpIsOn, &len, (uint8_t *)&ipV4); |
| 1066 | + |
| 1067 | + if (kwargs->used == 0) { |
| 1068 | + // Get config value |
| 1069 | + if (n_args != 2) { |
| 1070 | + mp_raise_TypeError(MP_ERROR_TEXT("must query one param")); |
| 1071 | + } |
| 1072 | + |
| 1073 | + switch (mp_obj_str_get_qstr(args[1])) { |
| 1074 | + case MP_QSTR_dhcp4: { |
| 1075 | + return mp_obj_new_bool(dhcpIsOn); |
| 1076 | + } |
| 1077 | + case MP_QSTR_has_dhcp4: { |
| 1078 | + return mp_obj_new_bool(dhcpIsOn && ipV4.ipV4 != 0); |
| 1079 | + } |
| 1080 | + case MP_QSTR_addr4: { |
| 1081 | + mp_obj_t tuple[2] = { |
| 1082 | + netutils_format_ipv4_addr((uint8_t *)&ipV4.ipV4, NETUTILS_LITTLE), |
| 1083 | + netutils_format_ipv4_addr((uint8_t *)&ipV4.ipV4Mask, NETUTILS_LITTLE), |
| 1084 | + }; |
| 1085 | + return mp_obj_new_tuple(2, tuple); |
| 1086 | + } |
| 1087 | + case MP_QSTR_gw4: { |
| 1088 | + return netutils_format_ipv4_addr((uint8_t *)&ipV4.ipV4Gateway, NETUTILS_LITTLE); |
| 1089 | + } |
| 1090 | + default: { |
| 1091 | + mp_raise_ValueError(MP_ERROR_TEXT("unexpected key")); |
| 1092 | + break; |
| 1093 | + } |
| 1094 | + } |
| 1095 | + return mp_const_none; |
| 1096 | + } else { |
| 1097 | + // Set config value(s) |
| 1098 | + if (n_args != 1) { |
| 1099 | + mp_raise_TypeErr
F438
or(MP_ERROR_TEXT("can't specify pos and kw args")); |
| 1100 | + } |
| 1101 | + |
| 1102 | + for (size_t i = 0; i < kwargs->alloc; ++i) { |
| 1103 | + if (MP_MAP_SLOT_IS_FILLED(kwargs, i)) { |
| 1104 | + mp_map_elem_t *e = &kwargs->table[i]; |
| 1105 | + switch (mp_obj_str_get_qstr(e->key)) { |
| 1106 | + case MP_QSTR_dhcp4: { |
| 1107 | + if (wlan_obj.mode == ROLE_AP) { |
| 1108 | + if (mp_obj_is_true(e->value)) { |
| 1109 | + sl_NetCfgSet(SL_IPV4_AP_P2P_GO_STATIC_ENABLE, IPCONFIG_MODE_ENABLE_IPV4, |
| 1110 | + sizeof(SlNetCfgIpV4Args_t), (_u8 *)&ipV4); |
| 1111 | + SlNetAppDhcpServerBasicOpt_t dhcpParams; |
| 1112 | + dhcpParams.lease_time = 4096; // lease time (in seconds) of the IP Address |
| 1113 | + dhcpParams.ipv4_addr_start = ipV4.ipV4 + 1; // first IP Address for allocation. |
| 1114 | + dhcpParams.ipv4_addr_last = (ipV4.ipV4 & 0xFFFFFF00) + 254; // last IP Address for allocation. |
| 1115 | + sl_NetAppStop(SL_NET_APP_DHCP_SERVER_ID); // stop DHCP server before settings |
| 1116 | + sl_NetAppSet(SL_NET_APP_DHCP_SERVER_ID, NETAPP_SET_DHCP_SRV_BASIC_OPT, |
| 1117 | + sizeof(SlNetAppDhcpServerBasicOpt_t), (_u8* )&dhcpParams); // set parameters |
| 1118 | + sl_NetAppStart(SL_NET_APP_DHCP_SERVER_ID); // start DHCP server with new settings |
| 1119 | + } else { |
| 1120 | + sl_NetAppStop(SL_NET_APP_DHCP_SERVER_ID); // stop DHCP server before settings |
| 1121 | + } |
| 1122 | + } else { |
| 1123 | + _u8 val = 1; |
| 1124 | + if (mp_obj_is_true(e->value)) { |
| 1125 | + sl_NetCfgSet(SL_IPV4_STA_P2P_CL_DHCP_ENABLE, IPCONFIG_MODE_ENABLE_IPV4, 1, &val); |
| 1126 | + } else { |
| 1127 | + sl_NetCfgSet(SL_IPV4_STA_P2P_CL_STATIC_ENABLE, IPCONFIG_MODE_ENABLE_IPV4, |
| 1128 | + sizeof(SlNetCfgIpV4Args_t), (_u8 *)&ipV4); |
| 1129 | + } |
| 1130 | + } |
| 1131 | + break; |
| 1132 | + } |
| 1133 | + case MP_QSTR_addr4: { |
| 1134 | + int prefix_bits = 32; |
| 1135 | + if (e->value != mp_const_none && mp_obj_is_str(e->value)) { |
| 1136 | + size_t addr_len; |
| 1137 | + const char *input_str = mp_obj_str_get_data(e->value, &addr_len); |
| 1138 | + char *split = strchr(input_str, '/'); |
| 1139 | + if (split) { |
| 1140 | + mp_obj_t prefix_obj = mp_parse_num_integer(split + 1, strlen(split + 1), 10, NULL); |
| 1141 | + prefix_bits = mp_obj_get_int(prefix_obj); |
| 1142 | + ipV4.ipV4Mask = -(1u << (32 - prefix_bits)); |
| 1143 | + } |
| 1144 | + netutils_parse_ipv4_addr(e->value, (uint8_t *)&ipV4.ipV4, NETUTILS_LITTLE); |
| 1145 | + } else if (e->value != mp_const_none) { |
| 1146 | + mp_obj_t *items; |
| 1147 | + mp_obj_get_array_fixed_n(e->value, 2, &items); |
| 1148 | + netutils_parse_ipv4_addr(items[0], (uint8_t *)&ipV4.ipV4, NETUTILS_LITTLE); |
| 1149 | + netutils_parse_ipv4_addr(items[1], (uint8_t *)&ipV4.ipV4Mask, NETUTILS_LITTLE); |
| 1150 | + } |
| 1151 | + ASSERT_ON_ERROR(sl_NetCfgSet(SL_IPV4_STA_P2P_CL_STATIC_ENABLE, IPCONFIG_MODE_ENABLE_IPV4, sizeof(SlNetCfgIpV4Args_t), (_u8 *)&ipV4)); |
| 1152 | + break; |
| 1153 | + } |
| 1154 | + case MP_QSTR_gw4: { |
| 1155 | + netutils_parse_ipv4_addr(e->value, (uint8_t *)&ipV4.ipV4Gateway, NETUTILS_LITTLE); |
| 1156 | + sl_NetCfgSet(SL_IPV4_STA_P2P_CL_STATIC_ENABLE, IPCONFIG_MODE_ENABLE_IPV4, sizeof(SlNetCfgIpV4Args_t), (_u8 *)&ipV4); |
| 1157 | + break; |
| 1158 | + } |
| 1159 | + default: { |
| 1160 | + mp_raise_ValueError(MP_ERROR_TEXT("unexpected key")); |
| 1161 | + break; |
| 1162 | + } |
| 1163 | + } |
| 1164 | + } |
| 1165 | + } |
| 1166 | + } |
| 1167 | + return mp_const_none; |
| 1168 | +} |
| 1169 | +static MP_DEFINE_CONST_FUN_OBJ_KW(wlan_ipconfig_obj, 1, wlan_ipconfig); |
| 1170 | + |
1060 | 1171 | static mp_obj_t wlan_mode(size_t n_args, const mp_obj_t *args) {
|
1061 | 1172 | wlan_obj_t *self = args[0];
|
1062 | 1173 | if (n_args == 1) {
|
@@ -1260,6 +1371,7 @@ static const mp_rom_map_elem_t wlan_locals_dict_table[] = {
|
1260 | 1371 | { MP_ROM_QSTR(MP_QSTR_disconnect), MP_ROM_PTR(&wlan_disconnect_obj) },
|
1261 | 1372 | { MP_ROM_QSTR(MP_QSTR_isconnected), MP_ROM_PTR(&wlan_isconnected_obj) },
|
1262 | 1373 | { MP_ROM_QSTR(MP_QSTR_ifconfig), MP_ROM_PTR(&wlan_ifconfig_obj) },
|
| 1374 | + { MP_ROM_QSTR(MP_QSTR_ipconfig), MP_ROM_PTR(&wlan_ipconfig_obj) }, |
1263 | 1375 | { MP_ROM_QSTR(MP_QSTR_mode), MP_ROM_PTR(&wlan_mode_obj) },
|
1264 | 1376 | { MP_ROM_QSTR(MP_QSTR_ssid), MP_ROM_PTR(&wlan_ssid_obj) },
|
1265 | 1377 | { MP_ROM_QSTR(MP_QSTR_auth), MP_ROM_PTR(&wlan_auth_obj) },
|
|
0 commit comments