8000 cc3200/mods: Implement network.ipconfig and network.WLAN.ipconfig. · micropython/micropython@e138baf · GitHub
[go: up one dir, main page]

Skip to content

Commit e138baf

Browse files
robert-hhdpgeorge
authored andcommitted
cc3200/mods: Implement network.ipconfig and network.WLAN.ipconfig.
Signed-off-by: robert-hh <robert@hammelrath.com>
1 parent 9ece9f9 commit e138baf

File tree

2 files changed

+161
-0
lines changed

2 files changed

+161
-0
lines changed

ports/cc3200/mods/modnetwork.c

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
#include "py/runtime.h"
2929
#include "py/mperrno.h"
3030
#include "py/mphal.h"
31+
#include "shared/netutils/netutils.h"
3132
#include "modnetwork.h"
3233
#include "serverstask.h"
3334
#include "simplelink.h"
@@ -53,6 +54,53 @@ static const mp_obj_type_t network_server_type;
5354
void mod_network_init0(void) {
5455
}
5556

57+
static mp_obj_t mod_network_ipconfig(size_t n_args, const mp_obj_t *args, mp_map_t *kwargs) {
58+
unsigned char len = sizeof(SlNetCfgIpV4Args_t);
59+
unsigned char dhcpIsOn;
60+
SlNetCfgIpV4Args_t ipV4;
61+
sl_NetCfgGet(SL_IPV4_STA_P2P_CL_GET_INFO, &dhcpIsOn, &len, (uint8_t *)&ipV4);
62+
63+
if (kwargs->used == 0) {
64+
// Get config value
65+
if (n_args != 1) {
66+
mp_raise_TypeError(MP_ERROR_TEXT("must query one param"));
67+
}
68+
switch (mp_obj_str_get_qstr(args[0])) {
69+
case MP_QSTR_dns: {
70+
return netutils_format_ipv4_addr((uint8_t *)&ipV4.ipV4DnsServer, NETUTILS_LITTLE);
71+
}
72+
default: {
73+
mp_raise_ValueError(MP_ERROR_TEXT("unexpected key"));
74+
break;
75+
}
76+
}
77+
} else {
78+
// Set config value(s)
79+
if (n_args != 0) {
80+
mp_raise_TypeError(MP_ERROR_TEXT("can't specify pos and kw args"));
81+
}
82+
83+
for (size_t i = 0; i < kwargs->alloc; ++i) {
84+
if (MP_MAP_SLOT_IS_FILLED(kwargs, i)) {
85+
mp_map_elem_t *e = &kwargs->table[i];
86+
switch (mp_obj_str_get_qstr(e->key)) {
87+
case MP_QSTR_dns: {
88+
netutils_parse_ipv4_addr(e->value, (uint8_t *)&ipV4.ipV4DnsServer, NETUTILS_LITTLE);
89+
sl_NetCfgSet(SL_IPV4_STA_P2P_CL_STATIC_ENABLE, IPCONFIG_MODE_ENABLE_IPV4, sizeof(SlNetCfgIpV4Args_t), (_u8 *)&ipV4);
90+
break;
91+
}
92+
default: {
93+
mp_raise_ValueError(MP_ERROR_TEXT("unexpected key"));
94+
break;
95+
}
96+
}
97+
}
98+
}
99+
}
100+
return mp_const_none;
101+
}
102+
static MP_DEFINE_CONST_FUN_OBJ_KW(mod_network_ipconfig_obj, 0, mod_network_ipconfig);
103+
56104
#if (MICROPY_PORT_HAS_TELNET || MICROPY_PORT_HAS_FTP)
57105
static mp_obj_t network_server_init_helper(mp_obj_t self, const mp_arg_val_t *args) {
58106
const char *user = SERVERS_DEF_USER;
@@ -145,6 +193,7 @@ static MP_DEFINE_CONST_FUN_OBJ_1(network_server_deinit_obj, network_server_deini
145193

146194
static const mp_rom_map_elem_t mp_module_network_globals_table[] = {
147195
{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_network) },
196+
{ MP_ROM_QSTR(MP_QSTR_ipconfig), MP_ROM_PTR(&mod_network_ipconfig_obj) },
148197
{ MP_ROM_QSTR(MP_QSTR_WLAN), MP_ROM_PTR(&mod_network_nic_type_wlan) },
149198

150199
#if (MICROPY_PORT_HAS_TELNET || MICROPY_PORT_HAS_FTP)

ports/cc3200/mods/modwlan.c

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
#include "py/mpconfig.h"
3333
#include "py/obj.h"
3434
#include "py/objstr.h"
35+
#include "py/parsenum.h"
3536
#include "py/runtime.h"
3637
#include "py/stream.h"
3738
#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
10571058
}
10581059
static MP_DEFINE_CONST_FUN_OBJ_KW(wlan_ifconfig_obj, 1, wlan_ifconfig);
10591060

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+
10601171
static mp_obj_t wlan_mode(size_t n_args, const mp_obj_t *args) {
10611172
wlan_obj_t *self = args[0];
10621173
if (n_args == 1) {
@@ -1260,6 +1371,7 @@ static const mp_rom_map_elem_t wlan_locals_dict_table[] = {
12601371
{ MP_ROM_QSTR(MP_QSTR_disconnect), MP_ROM_PTR(&wlan_disconnect_obj) },
12611372
{ MP_ROM_QSTR(MP_QSTR_isconnected), MP_ROM_PTR(&wlan_isconnected_obj) },
12621373
{ 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) },
12631375
{ MP_ROM_QSTR(MP_QSTR_mode), MP_ROM_PTR(&wlan_mode_obj) },
12641376
{ MP_ROM_QSTR(MP_QSTR_ssid), MP_ROM_PTR(&wlan_ssid_obj) },
12651377
{ MP_ROM_QSTR(MP_QSTR_auth), MP_ROM_PTR(&wlan_auth_obj) },

0 commit comments

Comments
 (0)
0