Do not use %I %A in MIP

This commit is contained in:
Sergio R. Caprile 2023-01-31 12:10:57 -03:00
parent 4dd51cc889
commit 99dbbc7f39
5 changed files with 90 additions and 58 deletions

View File

@ -222,7 +222,7 @@ static void arp_cache_init(uint8_t *p, int n, int size) {
static inline void arp_cache_dump(const uint8_t *p) { static inline void arp_cache_dump(const uint8_t *p) {
MG_INFO(("ARP cache:")); MG_INFO(("ARP cache:"));
for (uint8_t i = 0, j = p[1]; i < MIP_ARP_ENTRIES; i++, j = p[j + 1]) { for (uint8_t i = 0, j = p[1]; i < MIP_ARP_ENTRIES; i++, j = p[j + 1]) {
MG_INFO((" %I -> %A", 4, &p[j + 2], &p[j + 6])); MG_INFO((" %M -> %M", mg_print_ip4, &p[j + 2], mg_print_mac, &p[j + 6]));
} }
} }
#endif #endif
@ -238,7 +238,8 @@ static uint8_t *arp_cache_find(struct mip_if *ifp, uint32_t ip) {
for (uint8_t i = 0, j = p[1]; i < MIP_ARP_ENTRIES; i++, j = p[j + 1]) { for (uint8_t i = 0, j = p[1]; i < MIP_ARP_ENTRIES; i++, j = p[j + 1]) {
if (memcmp(p + j + 2, &ip, sizeof(ip)) == 0) { if (memcmp(p + j + 2, &ip, sizeof(ip)) == 0) {
p[1] = j, p[0] = p[j]; // Found entry! Point list head to us p[1] = j, p[0] = p[j]; // Found entry! Point list head to us
// MG_DEBUG(("ARP find: %I @ %A", 4, &ip, &p[j + 6])); // MG_DEBUG(("ARP find: %M @ %M", mg_print_ip4, &ip, mg_print_mac, &p[j +
// 6]));
return p + j + 6; // And return MAC address return p + j + 6; // And return MAC address
} }
} }
@ -252,7 +253,7 @@ static void arp_cache_add(struct mip_if *ifp, uint32_t ip, uint8_t mac[6]) {
memcpy(p + p[0] + 2, &ip, sizeof(ip)); // Replace last entry: IP address memcpy(p + p[0] + 2, &ip, sizeof(ip)); // Replace last entry: IP address
memcpy(p + p[0] + 6, mac, 6); // And MAC address memcpy(p + p[0] + 6, mac, 6); // And MAC address
p[1] = p[0], p[0] = p[p[1]]; // Point list head to us p[1] = p[0], p[0] = p[p[1]]; // Point list head to us
MG_DEBUG(("ARP cache: added %I @ %A", 4, &ip, mac)); MG_DEBUG(("ARP cache: added %M @ %M", mg_print_ip4, &ip, mg_print_mac, mac));
} }
static size_t ether_output(struct mip_if *ifp, size_t len) { static size_t ether_output(struct mip_if *ifp, size_t len) {
@ -278,8 +279,8 @@ static void arp_ask(struct mip_if *ifp, uint32_t ip) {
static void onstatechange(struct mip_if *ifp) { static void onstatechange(struct mip_if *ifp) {
if (ifp->state == MIP_STATE_READY) { if (ifp->state == MIP_STATE_READY) {
MG_INFO(("READY, IP: %I", 4, &ifp->ip)); MG_INFO(("READY, IP: %M", mg_print_ip4, &ifp->ip));
MG_INFO((" GW: %I", 4, &ifp->gw)); MG_INFO((" GW: %M", mg_print_ip4, &ifp->gw));
if (ifp->lease_expire > ifp->now) { if (ifp->lease_expire > ifp->now) {
MG_INFO( MG_INFO(
(" Lease: %lld sec", (ifp->lease_expire - ifp->now) / 1000)); (" Lease: %lld sec", (ifp->lease_expire - ifp->now) / 1000));
@ -375,8 +376,8 @@ static void tx_dhcp_discover(struct mip_if *ifp) {
static void rx_arp(struct mip_if *ifp, struct pkt *pkt) { static void rx_arp(struct mip_if *ifp, struct pkt *pkt) {
if (pkt->arp->op == mg_htons(1) && pkt->arp->tpa == ifp->ip) { if (pkt->arp->op == mg_htons(1) && pkt->arp->tpa == ifp->ip) {
// ARP request. Make a response, then send // ARP request. Make a response, then send
MG_DEBUG(("ARP op %d %I: %I?", mg_ntohs(pkt->arp->op), 4, &pkt->arp->spa, 4, MG_DEBUG(("ARP op %d %M: %M?", mg_ntohs(pkt->arp->op), mg_print_ip4,
&pkt->arp->tpa)); &pkt->arp->spa, mg_print_ip4, &pkt->arp->tpa));
struct eth *eth = (struct eth *) ifp->tx.ptr; struct eth *eth = (struct eth *) ifp->tx.ptr;
struct arp *arp = (struct arp *) (eth + 1); struct arp *arp = (struct arp *) (eth + 1);
memcpy(eth->dst, pkt->eth->src, sizeof(eth->dst)); memcpy(eth->dst, pkt->eth->src, sizeof(eth->dst));
@ -388,7 +389,7 @@ static void rx_arp(struct mip_if *ifp, struct pkt *pkt) {
memcpy(arp->sha, ifp->mac, sizeof(pkt->arp->sha)); memcpy(arp->sha, ifp->mac, sizeof(pkt->arp->sha));
arp->tpa = pkt->arp->spa; arp->tpa = pkt->arp->spa;
arp->spa = ifp->ip; arp->spa = ifp->ip;
MG_DEBUG(("ARP response: we're %I", 4, &ifp->ip)); MG_DEBUG(("ARP response: we're %M", mg_print_ip4, &ifp->ip));
ether_output(ifp, PDIFF(eth, arp + 1)); ether_output(ifp, PDIFF(eth, arp + 1));
} else if (pkt->arp->op == mg_htons(2)) { } else if (pkt->arp->op == mg_htons(2)) {
if (memcmp(pkt->arp->tha, ifp->mac, sizeof(pkt->arp->tha)) != 0) return; if (memcmp(pkt->arp->tha, ifp->mac, sizeof(pkt->arp->tha)) != 0) return;
@ -558,8 +559,7 @@ static struct mg_connection *accept_conn(struct mg_connection *lsn,
settmout(c, MIP_TTYPE_KEEPALIVE); settmout(c, MIP_TTYPE_KEEPALIVE);
c->rem.ip = pkt->ip->src; c->rem.ip = pkt->ip->src;
c->rem.port = pkt->tcp->sport; c->rem.port = pkt->tcp->sport;
MG_DEBUG( MG_DEBUG(("%lu accepted %M", c->id, mg_print_ip_port, &c->rem));
("%lu accepted %I:%hu", c->id, 4, &c->rem.ip, mg_ntohs(c->rem.port)));
LIST_ADD_HEAD(struct mg_connection, &lsn->mgr->conns, c); LIST_ADD_HEAD(struct mg_connection, &lsn->mgr->conns, c);
c->is_accepted = 1; c->is_accepted = 1;
c->is_hexdumping = lsn->is_hexdumping; c->is_hexdumping = lsn->is_hexdumping;
@ -675,7 +675,7 @@ static void rx_tcp(struct mip_if *ifp, struct pkt *pkt) {
if (c != NULL && c->is_connecting && pkt->tcp->flags & (TH_SYN | TH_ACK)) { if (c != NULL && c->is_connecting && pkt->tcp->flags & (TH_SYN | TH_ACK)) {
s->seq = mg_ntohl(pkt->tcp->ack), s->ack = mg_ntohl(pkt->tcp->seq) + 1; s->seq = mg_ntohl(pkt->tcp->ack), s->ack = mg_ntohl(pkt->tcp->seq) + 1;
tx_tcp_pkt(ifp, pkt, TH_ACK, pkt->tcp->ack, NULL, 0); tx_tcp_pkt(ifp, pkt, TH_ACK, pkt->tcp->ack, NULL, 0);
c->is_connecting = 0; // Client connected c->is_connecting = 0; // Client connected
settmout(c, MIP_TTYPE_KEEPALIVE); settmout(c, MIP_TTYPE_KEEPALIVE);
mg_call(c, MG_EV_CONNECT, NULL); // Let user know mg_call(c, MG_EV_CONNECT, NULL); // Let user know
} else if (c != NULL && c->is_connecting) { } else if (c != NULL && c->is_connecting) {
@ -684,15 +684,16 @@ static void rx_tcp(struct mip_if *ifp, struct pkt *pkt) {
mg_error(c, "peer RST"); // RFC-1122 4.2.2.13 mg_error(c, "peer RST"); // RFC-1122 4.2.2.13
} else if (c != NULL) { } else if (c != NULL) {
#if 0 #if 0
MG_DEBUG(("%lu %d %I:%hu -> %I:%hu", c->id, (int) pkt->raw.len, MG_DEBUG(("%lu %d %M:%hu -> %M:%hu", c->id, (int) pkt->raw.len,
4, &pkt->ip->src, mg_ntohs(pkt->tcp->sport), mg_print_ip4, &pkt->ip->src, mg_ntohs(pkt->tcp->sport),
4, &pkt->ip->dst, mg_ntohs(pkt->tcp->dport))); mg_print_ip4, &pkt->ip->dst, mg_ntohs(pkt->tcp->dport)));
mg_hexdump(pkt->pay.buf, pkt->pay.len); mg_hexdump(pkt->pay.buf, pkt->pay.len);
#endif #endif
s->tmiss = 0; // Reset missed keep-alive counter s->tmiss = 0; // Reset missed keep-alive counter
if (s->ttype == MIP_TTYPE_KEEPALIVE) // Advance keep-alive timer if (s->ttype == MIP_TTYPE_KEEPALIVE) // Advance keep-alive timer
settmout(c, MIP_TTYPE_KEEPALIVE); // unless a former ACK timeout is pending settmout(c,
read_conn(c, pkt); // Override timer with ACK timeout if needed MIP_TTYPE_KEEPALIVE); // unless a former ACK timeout is pending
read_conn(c, pkt); // Override timer with ACK timeout if needed
} else if ((c = getpeer(ifp->mgr, pkt, true)) == NULL) { } else if ((c = getpeer(ifp->mgr, pkt, true)) == NULL) {
tx_tcp_pkt(ifp, pkt, TH_RST | TH_ACK, pkt->tcp->ack, NULL, 0); tx_tcp_pkt(ifp, pkt, TH_RST | TH_ACK, pkt->tcp->ack, NULL, 0);
} else if (pkt->tcp->flags & TH_RST) { } else if (pkt->tcp->flags & TH_RST) {
@ -706,7 +707,7 @@ static void rx_tcp(struct mip_if *ifp, struct pkt *pkt) {
tx_tcp_pkt(ifp, pkt, TH_FIN | TH_ACK, pkt->tcp->ack, NULL, 0); tx_tcp_pkt(ifp, pkt, TH_FIN | TH_ACK, pkt->tcp->ack, NULL, 0);
} else if (mg_htonl(pkt->tcp->ack) == mg_htons(pkt->tcp->sport) + 1U) { } else if (mg_htonl(pkt->tcp->ack) == mg_htons(pkt->tcp->sport) + 1U) {
accept_conn(c, pkt); accept_conn(c, pkt);
} else if (!c->is_accepted ) { // no peer } else if (!c->is_accepted) { // no peer
tx_tcp_pkt(ifp, pkt, TH_RST | TH_ACK, pkt->tcp->ack, NULL, 0); tx_tcp_pkt(ifp, pkt, TH_RST | TH_ACK, pkt->tcp->ack, NULL, 0);
} else { } else {
// MG_DEBUG(("dropped silently..")); // MG_DEBUG(("dropped silently.."));
@ -928,8 +929,8 @@ void mg_connect_resolved(struct mg_connection *c) {
if (ifp->eport < MIP_ETHEMERAL_PORT) ifp->eport = MIP_ETHEMERAL_PORT; if (ifp->eport < MIP_ETHEMERAL_PORT) ifp->eport = MIP_ETHEMERAL_PORT;
c->loc.ip = ifp->ip; c->loc.ip = ifp->ip;
c->loc.port = mg_htons(ifp->eport++); c->loc.port = mg_htons(ifp->eport++);
MG_DEBUG(("%lu %I:%hu->%I:%hu", c->id, 4, &c->loc.ip, mg_ntohs(c->loc.port), MG_DEBUG(("%lu %M -> %M", c->id, mg_print_ip_port, &c->loc, mg_print_ip_port,
4, &c->rem.ip, mg_ntohs(c->rem.port))); &c->rem));
mg_call(c, MG_EV_RESOLVE, NULL); mg_call(c, MG_EV_RESOLVE, NULL);
if (c->is_udp) { if (c->is_udp) {
mg_call(c, MG_EV_CONNECT, NULL); mg_call(c, MG_EV_CONNECT, NULL);

View File

@ -5577,18 +5577,31 @@ int mg_check_ip_acl(struct mg_str acl, uint32_t remote_ip) {
return allowed == '+'; return allowed == '+';
} }
size_t mg_print_ip(void (*out)(char, void *), void *arg, va_list *ap) { static size_t print_ip4(void (*out)(char, void *), void *arg, uint8_t *p) {
struct mg_addr *addr = va_arg(*ap, struct mg_addr *); return mg_xprintf(out, arg, "%d.%d.%d.%d", p[0], p[1], p[2], p[3]);
if (addr->is_ip6) { }
uint16_t *p = (uint16_t *) addr->ip6;
static size_t print_ip6(void (*out)(char, void *), void *arg, uint16_t *p) {
return mg_xprintf(out, arg, "[%x:%x:%x:%x:%x:%x:%x:%x]", mg_ntohs(p[0]), return mg_xprintf(out, arg, "[%x:%x:%x:%x:%x:%x:%x:%x]", mg_ntohs(p[0]),
mg_ntohs(p[1]), mg_ntohs(p[2]), mg_ntohs(p[3]), mg_ntohs(p[1]), mg_ntohs(p[2]), mg_ntohs(p[3]),
mg_ntohs(p[4]), mg_ntohs(p[5]), mg_ntohs(p[6]), mg_ntohs(p[4]), mg_ntohs(p[5]), mg_ntohs(p[6]),
mg_ntohs(p[7])); mg_ntohs(p[7]));
} else { }
uint8_t *p = (uint8_t *) &addr->ip;
return mg_xprintf(out, arg, "%d.%d.%d.%d", p[0], p[1], p[2], p[3]); size_t mg_print_ip4(void (*out)(char, void *), void *arg, va_list *ap) {
} uint8_t *p = va_arg(*ap, uint8_t *);
return print_ip4(out, arg, p);
}
size_t mg_print_ip6(void (*out)(char, void *), void *arg, va_list *ap) {
uint16_t *p = va_arg(*ap, uint16_t *);
return print_ip6(out, arg, p);
}
size_t mg_print_ip(void (*out)(char, void *), void *arg, va_list *ap) {
struct mg_addr *addr = va_arg(*ap, struct mg_addr *);
if (addr->is_ip6) return print_ip6(out, arg, (uint16_t *) addr->ip6);
return print_ip4(out, arg, (uint8_t *) &addr->ip);
} }
size_t mg_print_ip_port(void (*out)(char, void *), void *arg, va_list *ap) { size_t mg_print_ip_port(void (*out)(char, void *), void *arg, va_list *ap) {
@ -6716,7 +6729,7 @@ static void arp_cache_init(uint8_t *p, int n, int size) {
static inline void arp_cache_dump(const uint8_t *p) { static inline void arp_cache_dump(const uint8_t *p) {
MG_INFO(("ARP cache:")); MG_INFO(("ARP cache:"));
for (uint8_t i = 0, j = p[1]; i < MIP_ARP_ENTRIES; i++, j = p[j + 1]) { for (uint8_t i = 0, j = p[1]; i < MIP_ARP_ENTRIES; i++, j = p[j + 1]) {
MG_INFO((" %I -> %A", 4, &p[j + 2], &p[j + 6])); MG_INFO((" %M -> %M", mg_print_ip4, &p[j + 2], mg_print_mac, &p[j + 6]));
} }
} }
#endif #endif
@ -6732,7 +6745,8 @@ static uint8_t *arp_cache_find(struct mip_if *ifp, uint32_t ip) {
for (uint8_t i = 0, j = p[1]; i < MIP_ARP_ENTRIES; i++, j = p[j + 1]) { for (uint8_t i = 0, j = p[1]; i < MIP_ARP_ENTRIES; i++, j = p[j + 1]) {
if (memcmp(p + j + 2, &ip, sizeof(ip)) == 0) { if (memcmp(p + j + 2, &ip, sizeof(ip)) == 0) {
p[1] = j, p[0] = p[j]; // Found entry! Point list head to us p[1] = j, p[0] = p[j]; // Found entry! Point list head to us
// MG_DEBUG(("ARP find: %I @ %A", 4, &ip, &p[j + 6])); // MG_DEBUG(("ARP find: %M @ %M", mg_print_ip4, &ip, mg_print_mac, &p[j +
// 6]));
return p + j + 6; // And return MAC address return p + j + 6; // And return MAC address
} }
} }
@ -6746,7 +6760,7 @@ static void arp_cache_add(struct mip_if *ifp, uint32_t ip, uint8_t mac[6]) {
memcpy(p + p[0] + 2, &ip, sizeof(ip)); // Replace last entry: IP address memcpy(p + p[0] + 2, &ip, sizeof(ip)); // Replace last entry: IP address
memcpy(p + p[0] + 6, mac, 6); // And MAC address memcpy(p + p[0] + 6, mac, 6); // And MAC address
p[1] = p[0], p[0] = p[p[1]]; // Point list head to us p[1] = p[0], p[0] = p[p[1]]; // Point list head to us
MG_DEBUG(("ARP cache: added %I @ %A", 4, &ip, mac)); MG_DEBUG(("ARP cache: added %M @ %M", mg_print_ip4, &ip, mg_print_mac, mac));
} }
static size_t ether_output(struct mip_if *ifp, size_t len) { static size_t ether_output(struct mip_if *ifp, size_t len) {
@ -6772,8 +6786,8 @@ static void arp_ask(struct mip_if *ifp, uint32_t ip) {
static void onstatechange(struct mip_if *ifp) { static void onstatechange(struct mip_if *ifp) {
if (ifp->state == MIP_STATE_READY) { if (ifp->state == MIP_STATE_READY) {
MG_INFO(("READY, IP: %I", 4, &ifp->ip)); MG_INFO(("READY, IP: %M", mg_print_ip4, &ifp->ip));
MG_INFO((" GW: %I", 4, &ifp->gw)); MG_INFO((" GW: %M", mg_print_ip4, &ifp->gw));
if (ifp->lease_expire > ifp->now) { if (ifp->lease_expire > ifp->now) {
MG_INFO( MG_INFO(
(" Lease: %lld sec", (ifp->lease_expire - ifp->now) / 1000)); (" Lease: %lld sec", (ifp->lease_expire - ifp->now) / 1000));
@ -6869,8 +6883,8 @@ static void tx_dhcp_discover(struct mip_if *ifp) {
static void rx_arp(struct mip_if *ifp, struct pkt *pkt) { static void rx_arp(struct mip_if *ifp, struct pkt *pkt) {
if (pkt->arp->op == mg_htons(1) && pkt->arp->tpa == ifp->ip) { if (pkt->arp->op == mg_htons(1) && pkt->arp->tpa == ifp->ip) {
// ARP request. Make a response, then send // ARP request. Make a response, then send
MG_DEBUG(("ARP op %d %I: %I?", mg_ntohs(pkt->arp->op), 4, &pkt->arp->spa, 4, MG_DEBUG(("ARP op %d %M: %M?", mg_ntohs(pkt->arp->op), mg_print_ip4,
&pkt->arp->tpa)); &pkt->arp->spa, mg_print_ip4, &pkt->arp->tpa));
struct eth *eth = (struct eth *) ifp->tx.ptr; struct eth *eth = (struct eth *) ifp->tx.ptr;
struct arp *arp = (struct arp *) (eth + 1); struct arp *arp = (struct arp *) (eth + 1);
memcpy(eth->dst, pkt->eth->src, sizeof(eth->dst)); memcpy(eth->dst, pkt->eth->src, sizeof(eth->dst));
@ -6882,7 +6896,7 @@ static void rx_arp(struct mip_if *ifp, struct pkt *pkt) {
memcpy(arp->sha, ifp->mac, sizeof(pkt->arp->sha)); memcpy(arp->sha, ifp->mac, sizeof(pkt->arp->sha));
arp->tpa = pkt->arp->spa; arp->tpa = pkt->arp->spa;
arp->spa = ifp->ip; arp->spa = ifp->ip;
MG_DEBUG(("ARP response: we're %I", 4, &ifp->ip)); MG_DEBUG(("ARP response: we're %M", mg_print_ip4, &ifp->ip));
ether_output(ifp, PDIFF(eth, arp + 1)); ether_output(ifp, PDIFF(eth, arp + 1));
} else if (pkt->arp->op == mg_htons(2)) { } else if (pkt->arp->op == mg_htons(2)) {
if (memcmp(pkt->arp->tha, ifp->mac, sizeof(pkt->arp->tha)) != 0) return; if (memcmp(pkt->arp->tha, ifp->mac, sizeof(pkt->arp->tha)) != 0) return;
@ -7052,8 +7066,7 @@ static struct mg_connection *accept_conn(struct mg_connection *lsn,
settmout(c, MIP_TTYPE_KEEPALIVE); settmout(c, MIP_TTYPE_KEEPALIVE);
c->rem.ip = pkt->ip->src; c->rem.ip = pkt->ip->src;
c->rem.port = pkt->tcp->sport; c->rem.port = pkt->tcp->sport;
MG_DEBUG( MG_DEBUG(("%lu accepted %M", c->id, mg_print_ip_port, &c->rem));
("%lu accepted %I:%hu", c->id, 4, &c->rem.ip, mg_ntohs(c->rem.port)));
LIST_ADD_HEAD(struct mg_connection, &lsn->mgr->conns, c); LIST_ADD_HEAD(struct mg_connection, &lsn->mgr->conns, c);
c->is_accepted = 1; c->is_accepted = 1;
c->is_hexdumping = lsn->is_hexdumping; c->is_hexdumping = lsn->is_hexdumping;
@ -7169,7 +7182,7 @@ static void rx_tcp(struct mip_if *ifp, struct pkt *pkt) {
if (c != NULL && c->is_connecting && pkt->tcp->flags & (TH_SYN | TH_ACK)) { if (c != NULL && c->is_connecting && pkt->tcp->flags & (TH_SYN | TH_ACK)) {
s->seq = mg_ntohl(pkt->tcp->ack), s->ack = mg_ntohl(pkt->tcp->seq) + 1; s->seq = mg_ntohl(pkt->tcp->ack), s->ack = mg_ntohl(pkt->tcp->seq) + 1;
tx_tcp_pkt(ifp, pkt, TH_ACK, pkt->tcp->ack, NULL, 0); tx_tcp_pkt(ifp, pkt, TH_ACK, pkt->tcp->ack, NULL, 0);
c->is_connecting = 0; // Client connected c->is_connecting = 0; // Client connected
settmout(c, MIP_TTYPE_KEEPALIVE); settmout(c, MIP_TTYPE_KEEPALIVE);
mg_call(c, MG_EV_CONNECT, NULL); // Let user know mg_call(c, MG_EV_CONNECT, NULL); // Let user know
} else if (c != NULL && c->is_connecting) { } else if (c != NULL && c->is_connecting) {
@ -7178,15 +7191,16 @@ static void rx_tcp(struct mip_if *ifp, struct pkt *pkt) {
mg_error(c, "peer RST"); // RFC-1122 4.2.2.13 mg_error(c, "peer RST"); // RFC-1122 4.2.2.13
} else if (c != NULL) { } else if (c != NULL) {
#if 0 #if 0
MG_DEBUG(("%lu %d %I:%hu -> %I:%hu", c->id, (int) pkt->raw.len, MG_DEBUG(("%lu %d %M:%hu -> %M:%hu", c->id, (int) pkt->raw.len,
4, &pkt->ip->src, mg_ntohs(pkt->tcp->sport), mg_print_ip4, &pkt->ip->src, mg_ntohs(pkt->tcp->sport),
4, &pkt->ip->dst, mg_ntohs(pkt->tcp->dport))); mg_print_ip4, &pkt->ip->dst, mg_ntohs(pkt->tcp->dport)));
mg_hexdump(pkt->pay.buf, pkt->pay.len); mg_hexdump(pkt->pay.buf, pkt->pay.len);
#endif #endif
s->tmiss = 0; // Reset missed keep-alive counter s->tmiss = 0; // Reset missed keep-alive counter
if (s->ttype == MIP_TTYPE_KEEPALIVE) // Advance keep-alive timer if (s->ttype == MIP_TTYPE_KEEPALIVE) // Advance keep-alive timer
settmout(c, MIP_TTYPE_KEEPALIVE); // unless a former ACK timeout is pending settmout(c,
read_conn(c, pkt); // Override timer with ACK timeout if needed MIP_TTYPE_KEEPALIVE); // unless a former ACK timeout is pending
read_conn(c, pkt); // Override timer with ACK timeout if needed
} else if ((c = getpeer(ifp->mgr, pkt, true)) == NULL) { } else if ((c = getpeer(ifp->mgr, pkt, true)) == NULL) {
tx_tcp_pkt(ifp, pkt, TH_RST | TH_ACK, pkt->tcp->ack, NULL, 0); tx_tcp_pkt(ifp, pkt, TH_RST | TH_ACK, pkt->tcp->ack, NULL, 0);
} else if (pkt->tcp->flags & TH_RST) { } else if (pkt->tcp->flags & TH_RST) {
@ -7200,7 +7214,7 @@ static void rx_tcp(struct mip_if *ifp, struct pkt *pkt) {
tx_tcp_pkt(ifp, pkt, TH_FIN | TH_ACK, pkt->tcp->ack, NULL, 0); tx_tcp_pkt(ifp, pkt, TH_FIN | TH_ACK, pkt->tcp->ack, NULL, 0);
} else if (mg_htonl(pkt->tcp->ack) == mg_htons(pkt->tcp->sport) + 1U) { } else if (mg_htonl(pkt->tcp->ack) == mg_htons(pkt->tcp->sport) + 1U) {
accept_conn(c, pkt); accept_conn(c, pkt);
} else if (!c->is_accepted ) { // no peer } else if (!c->is_accepted) { // no peer
tx_tcp_pkt(ifp, pkt, TH_RST | TH_ACK, pkt->tcp->ack, NULL, 0); tx_tcp_pkt(ifp, pkt, TH_RST | TH_ACK, pkt->tcp->ack, NULL, 0);
} else { } else {
// MG_DEBUG(("dropped silently..")); // MG_DEBUG(("dropped silently.."));
@ -7422,8 +7436,8 @@ void mg_connect_resolved(struct mg_connection *c) {
if (ifp->eport < MIP_ETHEMERAL_PORT) ifp->eport = MIP_ETHEMERAL_PORT; if (ifp->eport < MIP_ETHEMERAL_PORT) ifp->eport = MIP_ETHEMERAL_PORT;
c->loc.ip = ifp->ip; c->loc.ip = ifp->ip;
c->loc.port = mg_htons(ifp->eport++); c->loc.port = mg_htons(ifp->eport++);
MG_DEBUG(("%lu %I:%hu->%I:%hu", c->id, 4, &c->loc.ip, mg_ntohs(c->loc.port), MG_DEBUG(("%lu %M -> %M", c->id, mg_print_ip_port, &c->loc, mg_print_ip_port,
4, &c->rem.ip, mg_ntohs(c->rem.port))); &c->rem));
mg_call(c, MG_EV_RESOLVE, NULL); mg_call(c, MG_EV_RESOLVE, NULL);
if (c->is_udp) { if (c->is_udp) {
mg_call(c, MG_EV_CONNECT, NULL); mg_call(c, MG_EV_CONNECT, NULL);

View File

@ -909,6 +909,8 @@ uint64_t mg_millis(void);
size_t mg_print_ip(void (*out)(char, void *), void *arg, va_list *ap); size_t mg_print_ip(void (*out)(char, void *), void *arg, va_list *ap);
size_t mg_print_ip_port(void (*out)(char, void *), void *arg, va_list *ap); size_t mg_print_ip_port(void (*out)(char, void *), void *arg, va_list *ap);
size_t mg_print_ip4(void (*out)(char, void *), void *arg, va_list *ap);
size_t mg_print_ip6(void (*out)(char, void *), void *arg, va_list *ap);
size_t mg_print_mac(void (*out)(char, void *), void *arg, va_list *ap); size_t mg_print_mac(void (*out)(char, void *), void *arg, va_list *ap);
// Linked list management macros // Linked list management macros

View File

@ -87,18 +87,31 @@ int mg_check_ip_acl(struct mg_str acl, uint32_t remote_ip) {
return allowed == '+'; return allowed == '+';
} }
size_t mg_print_ip(void (*out)(char, void *), void *arg, va_list *ap) { static size_t print_ip4(void (*out)(char, void *), void *arg, uint8_t *p) {
struct mg_addr *addr = va_arg(*ap, struct mg_addr *); return mg_xprintf(out, arg, "%d.%d.%d.%d", p[0], p[1], p[2], p[3]);
if (addr->is_ip6) { }
uint16_t *p = (uint16_t *) addr->ip6;
static size_t print_ip6(void (*out)(char, void *), void *arg, uint16_t *p) {
return mg_xprintf(out, arg, "[%x:%x:%x:%x:%x:%x:%x:%x]", mg_ntohs(p[0]), return mg_xprintf(out, arg, "[%x:%x:%x:%x:%x:%x:%x:%x]", mg_ntohs(p[0]),
mg_ntohs(p[1]), mg_ntohs(p[2]), mg_ntohs(p[3]), mg_ntohs(p[1]), mg_ntohs(p[2]), mg_ntohs(p[3]),
mg_ntohs(p[4]), mg_ntohs(p[5]), mg_ntohs(p[6]), mg_ntohs(p[4]), mg_ntohs(p[5]), mg_ntohs(p[6]),
mg_ntohs(p[7])); mg_ntohs(p[7]));
} else { }
uint8_t *p = (uint8_t *) &addr->ip;
return mg_xprintf(out, arg, "%d.%d.%d.%d", p[0], p[1], p[2], p[3]); size_t mg_print_ip4(void (*out)(char, void *), void *arg, va_list *ap) {
} uint8_t *p = va_arg(*ap, uint8_t *);
return print_ip4(out, arg, p);
}
size_t mg_print_ip6(void (*out)(char, void *), void *arg, va_list *ap) {
uint16_t *p = va_arg(*ap, uint16_t *);
return print_ip6(out, arg, p);
}
size_t mg_print_ip(void (*out)(char, void *), void *arg, va_list *ap) {
struct mg_addr *addr = va_arg(*ap, struct mg_addr *);
if (addr->is_ip6) return print_ip6(out, arg, (uint16_t *) addr->ip6);
return print_ip4(out, arg, (uint8_t *) &addr->ip);
} }
size_t mg_print_ip_port(void (*out)(char, void *), void *arg, va_list *ap) { size_t mg_print_ip_port(void (*out)(char, void *), void *arg, va_list *ap) {

View File

@ -27,6 +27,8 @@ uint64_t mg_millis(void);
size_t mg_print_ip(void (*out)(char, void *), void *arg, va_list *ap); size_t mg_print_ip(void (*out)(char, void *), void *arg, va_list *ap);
size_t mg_print_ip_port(void (*out)(char, void *), void *arg, va_list *ap); size_t mg_print_ip_port(void (*out)(char, void *), void *arg, va_list *ap);
size_t mg_print_ip4(void (*out)(char, void *), void *arg, va_list *ap);
size_t mg_print_ip6(void (*out)(char, void *), void *arg, va_list *ap);
size_t mg_print_mac(void (*out)(char, void *), void *arg, va_list *ap); size_t mg_print_mac(void (*out)(char, void *), void *arg, va_list *ap);
// Linked list management macros // Linked list management macros