Skip to content

Commit d02e71e

Browse files
committed
Allow user to set custom DHCP name
1 parent 042ea53 commit d02e71e

File tree

4 files changed

+40
-6
lines changed

4 files changed

+40
-6
lines changed

mongoose.c

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4557,14 +4557,22 @@ static void rx_dhcp_server(struct mg_tcpip_if *ifp, struct pkt *pkt) {
45574557
53, 1, msg, // Message type
45584558
1, 4, 0, 0, 0, 0, // Subnet mask
45594559
54, 4, 0, 0, 0, 0, // Server ID
4560-
12, 3, 'm', 'i', 'p', // Host name: "mip"
45614560
51, 4, 255, 255, 255, 255, // Lease time
4562-
255 // End of options
45634561
};
4562+
// DHCP hostname: guarantee to limit its length by sizeof(ifp->dhcp_name)
4563+
size_t name_len = strlen(ifp->dhcp_name) % sizeof(ifp->dhcp_name);
4564+
45644565
memcpy(&res.hwaddr, pkt->dhcp->hwaddr, 6);
45654566
memcpy(opts + 5, &ifp->mask, sizeof(ifp->mask));
45664567
memcpy(opts + 11, &ifp->ip, sizeof(ifp->ip));
45674568
memcpy(&res.options, opts, sizeof(opts));
4569+
4570+
// Copy over host name
4571+
res.options[sizeof(opts)] = 12;
4572+
res.options[sizeof(opts) + 1] = (uint8_t) (name_len & 255);
4573+
memcpy(&res.options[sizeof(opts) + 2], ifp->dhcp_name, name_len);
4574+
res.options[sizeof(opts) + 2 + name_len] = 255; // End of options
4575+
45684576
res.magic = pkt->dhcp->magic;
45694577
res.xid = pkt->dhcp->xid;
45704578
if (ifp->enable_get_gateway) {
@@ -4732,7 +4740,8 @@ static void handle_tls_recv(struct mg_connection *c) {
47324740
mg_error(c, "oom");
47334741
} else {
47344742
// Decrypt data directly into c->recv
4735-
long n = mg_tls_recv(c, io->buf != NULL ? &io->buf[io->len] : io->buf, io->size - io->len);
4743+
long n = mg_tls_recv(c, io->buf != NULL ? &io->buf[io->len] : io->buf,
4744+
io->size - io->len);
47364745
if (n == MG_IO_ERR) {
47374746
mg_error(c, "TLS recv error");
47384747
} else if (n > 0) {
@@ -5113,6 +5122,11 @@ void mg_tcpip_init(struct mg_mgr *mgr, struct mg_tcpip_if *ifp) {
51135122
MG_INFO(("MAC not set. Generated random: %M", mg_print_mac, ifp->mac));
51145123
}
51155124

5125+
// Uf DHCP name is not set, use "mip"
5126+
if (ifp->dhcp_name[0] == '\0') {
5127+
mg_snprintf(ifp->dhcp_name, sizeof(ifp->dhcp_name), "%s", "mip");
5128+
}
5129+
51165130
if (ifp->driver->init && !ifp->driver->init(ifp)) {
51175131
MG_ERROR(("driver init failed"));
51185132
} else {

mongoose.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2751,6 +2751,10 @@ bool mg_ota_flash_end(struct mg_flash *flash);
27512751
#endif
27522752

27532753

2754+
2755+
2756+
2757+
27542758
struct mg_wifi_scan_bss_data {
27552759
struct mg_str SSID;
27562760
char *BSSID;
@@ -2823,6 +2827,7 @@ struct mg_tcpip_if {
28232827
mg_tcpip_event_handler_t fn; // User-specified event handler function
28242828
struct mg_mgr *mgr; // Mongoose event manager
28252829
struct mg_queue recv_queue; // Receive queue
2830+
char dhcp_name[12]; // Name reported to DHCP, "mip" if unset
28262831
uint16_t mtu; // Interface MTU
28272832
#define MG_TCPIP_MTU_DEFAULT 1500
28282833

src/net_builtin.c

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -476,14 +476,22 @@ static void rx_dhcp_server(struct mg_tcpip_if *ifp, struct pkt *pkt) {
476476
53, 1, msg, // Message type
477477
1, 4, 0, 0, 0, 0, // Subnet mask
478478
54, 4, 0, 0, 0, 0, // Server ID
479-
12, 3, 'm', 'i', 'p', // Host name: "mip"
480479
51, 4, 255, 255, 255, 255, // Lease time
481-
255 // End of options
482480
};
481+
// DHCP hostname: guarantee to limit its length by sizeof(ifp->dhcp_name)
482+
size_t name_len = strlen(ifp->dhcp_name) % sizeof(ifp->dhcp_name);
483+
483484
memcpy(&res.hwaddr, pkt->dhcp->hwaddr, 6);
484485
memcpy(opts + 5, &ifp->mask, sizeof(ifp->mask));
485486
memcpy(opts + 11, &ifp->ip, sizeof(ifp->ip));
486487
memcpy(&res.options, opts, sizeof(opts));
488+
489+
// Copy over host name
490+
res.options[sizeof(opts)] = 12;
491+
res.options[sizeof(opts) + 1] = (uint8_t) (name_len & 255);
492+
memcpy(&res.options[sizeof(opts) + 2], ifp->dhcp_name, name_len);
493+
res.options[sizeof(opts) + 2 + name_len] = 255; // End of options
494+
487495
res.magic = pkt->dhcp->magic;
488496
res.xid = pkt->dhcp->xid;
489497
if (ifp->enable_get_gateway) {
@@ -651,7 +659,8 @@ static void handle_tls_recv(struct mg_connection *c) {
651659
mg_error(c, "oom");
652660
} else {
653661
// Decrypt data directly into c->recv
654-
long n = mg_tls_recv(c, io->buf != NULL ? &io->buf[io->len] : io->buf, io->size - io->len);
662+
long n = mg_tls_recv(c, io->buf != NULL ? &io->buf[io->len] : io->buf,
663+
io->size - io->len);
655664
if (n == MG_IO_ERR) {
656665
mg_error(c, "TLS recv error");
657666
} else if (n > 0) {
@@ -1032,6 +1041,11 @@ void mg_tcpip_init(struct mg_mgr *mgr, struct mg_tcpip_if *ifp) {
10321041
MG_INFO(("MAC not set. Generated random: %M", mg_print_mac, ifp->mac));
10331042
}
10341043

1044+
// Uf DHCP name is not set, use "mip"
1045+
if (ifp->dhcp_name[0] == '\0') {
1046+
mg_snprintf(ifp->dhcp_name, sizeof(ifp->dhcp_name), "%s", "mip");
1047+
}
1048+
10351049
if (ifp->driver->init && !ifp->driver->init(ifp)) {
10361050
MG_ERROR(("driver init failed"));
10371051
} else {

src/net_builtin.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ struct mg_tcpip_if {
4747
mg_tcpip_event_handler_t fn; // User-specified event handler function
4848
struct mg_mgr *mgr; // Mongoose event manager
4949
struct mg_queue recv_queue; // Receive queue
50+
char dhcp_name[12]; // Name reported to DHCP, "mip" if unset
5051
uint16_t mtu; // Interface MTU
5152
#define MG_TCPIP_MTU_DEFAULT 1500
5253

0 commit comments

Comments
 (0)