Skip to content

Commit 90be682

Browse files
Add portmap feature to web Interface
1 parent 81ea6c5 commit 90be682

File tree

4 files changed

+105
-1
lines changed

4 files changed

+105
-1
lines changed

components/cmd_router/router_globals.h

+2
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ extern char* subnet_mask;
2424
extern char* gateway_addr;
2525
extern char* ap_ssid;
2626
extern char* ap_passwd;
27+
extern char* portmap_info;
2728

2829
extern uint16_t connect_count;
2930
extern bool ap_connect;
@@ -35,6 +36,7 @@ void preprocess_string(char* str);
3536
int set_sta(int argc, char **argv);
3637
int set_sta_static(int argc, char **argv);
3738
int set_ap(int argc, char **argv);
39+
int portmap(int argc, char **argv);
3840

3941
esp_err_t get_config_param_blob(char* name, uint8_t** blob, size_t blob_len);
4042
esp_err_t get_config_param_int(char* name, int* param);

main/esp32_nat_router.c

+40
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ const int WIFI_CONNECTED_BIT = BIT0;
6060

6161
#define DEFAULT_AP_IP "192.168.4.1"
6262
#define DEFAULT_DNS "8.8.8.8"
63+
#define MAX_PORTMAP_INFO_LENGTH 40
6364

6465
/* Global vars */
6566
uint16_t connect_count = 0;
@@ -236,6 +237,42 @@ esp_err_t del_portmap(u8_t proto, u16_t mport) {
236237
return ESP_OK;
237238
}
238239

240+
void concatenate_strings(char *str1, const char *str2) {
241+
while (*str1 != '\0')
242+
{
243+
str1++;
244+
}
245+
246+
// Copy characters from the second string to the end of
247+
// the first string
248+
while (*str2 != '\0')
249+
{
250+
*str1 = *str2;
251+
str1++;
252+
str2++;
253+
}
254+
255+
// Ensure the resulting string is null-terminated
256+
*str1 = '\0';
257+
}
258+
259+
void get_portmap_info(char **param) {
260+
*param = (char *)malloc(MAX_PORTMAP_INFO_LENGTH * IP_PORTMAP_MAX * sizeof(char));
261+
for (int i = 0; i < IP_PORTMAP_MAX; i++)
262+
{
263+
if (portmap_tab[i].valid)
264+
{
265+
ip4_addr_t addr;
266+
addr.addr = my_ip;
267+
addr.addr = portmap_tab[i].daddr;
268+
char* portmap = (char*)malloc(MAX_PORTMAP_INFO_LENGTH * sizeof(char));
269+
snprintf(portmap, MAX_PORTMAP_INFO_LENGTH * sizeof(char), "<br>%s:%d->" IPSTR ":%d", portmap_tab[i].proto == PROTO_TCP ? "TCP " : "UDP ", portmap_tab[i].mport, IP2STR(&addr), portmap_tab[i].dport);
270+
concatenate_strings(*param, portmap);
271+
free(portmap);
272+
}
273+
}
274+
}
275+
239276
static void initialize_console(void)
240277
{
241278
/* Disable buffering on stdin */
@@ -535,6 +572,7 @@ uint8_t* ap_mac = NULL;
535572
char* ap_ssid = NULL;
536573
char* ap_passwd = NULL;
537574
char* ap_ip = NULL;
575+
char* portmap_info = NULL;
538576

539577
char* param_set_default(const char* def_val) {
540578
char * retval = malloc(strlen(def_val)+1);
@@ -598,6 +636,8 @@ void app_main(void)
598636

599637
get_portmap_tab();
600638

639+
get_portmap_info(&portmap_info);
640+
601641
// Setup WIFI
602642
wifi_init(mac, ssid, ent_username, ent_identity, passwd, static_ip, subnet_mask, gateway_addr, ap_mac, ap_ssid, ap_passwd, ap_ip);
603643

main/http_server.c

+34-1
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,38 @@ static esp_err_t index_get_handler(httpd_req_t *req)
144144
}
145145
}
146146
}
147+
if (httpd_query_key_value(buf, "add", param1, sizeof(param1)) == ESP_OK) {
148+
ESP_LOGI(TAG, "Found URL query parameter => add=%s", param1);
149+
preprocess_string(param1);
150+
if (httpd_query_key_value(buf, "ex_port", param2, sizeof(param2)) == ESP_OK) {
151+
ESP_LOGI(TAG, "Found URL query parameter => ex_port=%s", param2);
152+
preprocess_string(param2);
153+
if (httpd_query_key_value(buf, "in_ip", param3, sizeof(param3)) == ESP_OK) {
154+
ESP_LOGI(TAG, "Found URL query parameter => in_ip=%s", param3);
155+
preprocess_string(param3);
156+
if (httpd_query_key_value(buf, "in_port", param4, sizeof(param4)) == ESP_OK) {
157+
ESP_LOGI(TAG, "Found URL query parameter => in_port=%s", param4);
158+
preprocess_string(param4);
159+
int argc = 6;
160+
char *argv[6];
161+
argv[0] = "portmap";
162+
argv[2] = param1;
163+
argv[3] = param2;
164+
if (strlen(param3)) {
165+
argv[4] = param3;
166+
argv[5] = param4;
167+
argv[1] = "add";
168+
} else {
169+
argv[1] = "del";
170+
argv[4] = "192.168.4.1";
171+
argv[5] = "80";
172+
}
173+
portmap(argc, argv);
174+
esp_timer_start_once(restart_timer, 500000);
175+
}
176+
}
177+
}
178+
}
147179
}
148180
free(buf);
149181
}
@@ -223,14 +255,15 @@ httpd_handle_t start_webserver(void)
223255
strlen(safe_passwd) +
224256
strlen(safe_ent_username) +
225257
strlen(safe_ent_identity) +
258+
strlen(portmap_info) +
226259
256;
227260
char* config_page = malloc(sizeof(char) * page_len);
228261

229262
snprintf(
230263
config_page, page_len, config_page_template,
231264
safe_ap_ssid, safe_ap_passwd,
232265
safe_ssid, safe_passwd, safe_ent_username, safe_ent_identity,
233-
static_ip, subnet_mask, gateway_addr);
266+
static_ip, subnet_mask, gateway_addr, portmap_info);
234267
indexp.user_ctx = config_page;
235268

236269
free(safe_ap_ssid);

main/pages.h

+29
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,35 @@ setTimeout(\"location.href = '/'\",10000);\
150150
</small>\
151151
</form>\
152152
\
153+
<h2>Portmap</h2>\
154+
<p>%s</p>\
155+
<form action='' method='GET'>\
156+
<table>\
157+
<tr>\
158+
<td>TCP/UDP</td>\
159+
<td><input type='text' name='add' placeholder='TCP or UDP'/></td>\
160+
</tr>\
161+
<tr>\
162+
<td>External port</td>\
163+
<td><input type='text' name='ex_port' placeholder='External port'/></td>\
164+
</tr>\
165+
<tr>\
166+
<td colspan='2'>Leave blank for delete portmap</td>\
167+
</tr>\
168+
<tr>\
169+
<td>Internal IP</td>\
170+
<td><input type='text' name='in_ip' placeholder='Internal IP, blank to delete portmap'/></td>\
171+
</tr>\
172+
<tr>\
173+
<td>Internal port</td>\
174+
<td><input type='text' name='in_port' placeholder='Internal port, blank to delete portmap'/></td>\
175+
</tr>\
176+
<tr>\
177+
<td></td>\
178+
<td><input type='submit' value='Add/Del' class='ok-button'/></td>\
179+
</tr>\
180+
</table>\
181+
</form>\
153182
<h2>Device Management</h2>\
154183
<form action='' method='GET'>\
155184
<table>\

0 commit comments

Comments
 (0)