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_TypeError(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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy