Skip to content

Commit 7bae985

Browse files
committed
lws_ipv4
1 parent 5a510c4 commit 7bae985

9 files changed

Lines changed: 186 additions & 15 deletions

File tree

lib/core-net/adopt.c

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -763,11 +763,13 @@ lws_create_adopt_udp2(struct lws *wsi, const char *ads,
763763
s->af = AF_INET6;
764764
} else
765765
#endif
766+
#if defined(LWS_WITH_IPV4)
766767
{
767768
s->dest.sa4.sin_family = AF_INET;
768769
s->dest.sa4.sin_addr.s_addr = INADDR_ANY;
769770
s->af = AF_INET;
770771
}
772+
#endif
771773
lws_dll2_add_tail(&s->list, &wsi->dns_sorted_list);
772774
}
773775

@@ -836,8 +838,13 @@ lws_create_adopt_udp2(struct lws *wsi, const char *ads,
836838

837839
/* ipv6 udp!!! */
838840

841+
#if defined(LWS_WITH_IPV4)
839842
if (s->dest.sa4.sin_family == AF_INET)
840843
s->dest.sa4.sin_port = htons(wsi->c_port);
844+
#if defined(LWS_WITH_IPV6)
845+
else
846+
#endif
847+
#endif
841848
#if defined(LWS_WITH_IPV6)
842849
else
843850
s->dest.sa6.sin6_port = htons(wsi->c_port);
@@ -952,10 +959,15 @@ lws_create_adopt_udp2(struct lws *wsi, const char *ads,
952959
memset(&dest, 0, sizeof(dest));
953960

954961
if (r) {
962+
#if defined(LWS_WITH_IPV4)
955963
if (r->ai_family == AF_INET) {
956964
dest.sa4.sin_family = AF_INET;
957965
memcpy(&dest.sa4.sin_addr, &((struct sockaddr_in *)r->ai_addr)->sin_addr, sizeof(struct in_addr));
958966
}
967+
#if defined(LWS_WITH_IPV6)
968+
else
969+
#endif
970+
#endif
959971
#if defined(LWS_WITH_IPV6)
960972
else if (r->ai_family == AF_INET6) {
961973
dest.sa6.sin6_family = AF_INET6;
@@ -969,10 +981,12 @@ lws_create_adopt_udp2(struct lws *wsi, const char *ads,
969981
dest.sa6.sin6_family = AF_INET6;
970982
} else
971983
#endif
984+
#if defined(LWS_WITH_IPV4)
972985
{
973986
dest.sa4.sin_family = AF_INET;
974987
dest.sa4.sin_addr.s_addr = INADDR_ANY;
975988
}
989+
#endif
976990
}
977991

978992
#if !defined(__linux__)
@@ -1013,8 +1027,13 @@ lws_create_adopt_udp2(struct lws *wsi, const char *ads,
10131027
}
10141028
#endif
10151029

1030+
#if defined(LWS_WITH_IPV4)
10161031
if (dest.sa4.sin_family == AF_INET)
10171032
dest.sa4.sin_port = htons(wsi->c_port);
1033+
#if defined(LWS_WITH_IPV6)
1034+
else
1035+
#endif
1036+
#endif
10181037
#if defined(LWS_WITH_IPV6)
10191038
else
10201039
dest.sa6.sin6_port = htons(wsi->c_port);

lib/core-net/network.c

Lines changed: 55 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,7 @@ lws_get_addresses(struct lws_vhost *vh, void *ads, char *name,
151151
return 0;
152152
} else
153153
#endif
154+
#if defined(LWS_WITH_IPV4)
154155
{
155156
addr4.sin_family = AF_INET;
156157
addr4.sin_addr = ((struct sockaddr_in *)ads)->sin_addr;
@@ -174,13 +175,16 @@ lws_get_addresses(struct lws_vhost *vh, void *ads, char *name,
174175
#endif
175176
}
176177
}
178+
#endif
177179

178180
if (addr4.sin_family == AF_UNSPEC)
179181
return -1;
180182

183+
#if defined(LWS_WITH_IPV4)
181184
if (lws_plat_inet_ntop(AF_INET, &addr4.sin_addr, rip,
182185
(socklen_t)rip_len) == NULL)
183186
return -1;
187+
#endif
184188

185189
return 0;
186190
}
@@ -293,7 +297,9 @@ lws_socket_bind(struct lws_vhost *vhost, struct lws *wsi,
293297
#if defined(LWS_WITH_IPV6) && !defined(LWS_PLAT_OPTEE)
294298
struct sockaddr_in6 serv_addr6;
295299
#endif
300+
#if defined(LWS_WITH_IPV4)
296301
struct sockaddr_in serv_addr4;
302+
#endif
297303
#ifndef LWS_PLAT_OPTEE
298304
socklen_t len = sizeof(struct sockaddr_storage);
299305
#endif
@@ -377,6 +383,7 @@ lws_socket_bind(struct lws_vhost *vhost, struct lws *wsi,
377383
#endif
378384
#endif
379385

386+
#if defined(LWS_WITH_IPV4)
380387
case AF_INET:
381388
v = (struct sockaddr *)&serv_addr4;
382389
n = sizeof(serv_addr4);
@@ -402,6 +409,7 @@ lws_socket_bind(struct lws_vhost *vhost, struct lws *wsi,
402409
#endif
403410
serv_addr4.sin_port = htons((uint16_t)(unsigned int)port);
404411
break;
412+
#endif
405413
default:
406414
return -1;
407415
} /* switch */
@@ -500,9 +508,13 @@ lws_socket_bind(struct lws_vhost *vhost, struct lws *wsi,
500508
} else
501509
#endif
502510
#if defined(LWS_WITH_IPV6)
511+
#if defined(LWS_WITH_IPV4)
503512
port = (sin.ss_family == AF_INET6) ?
504513
ntohs(((struct sockaddr_in6 *)psin)->sin6_port) :
505514
ntohs(((struct sockaddr_in *)psin)->sin_port);
515+
#else
516+
port = ntohs(((struct sockaddr_in6 *)psin)->sin6_port);
517+
#endif
506518
#else
507519
{
508520
struct sockaddr_in sain;
@@ -949,11 +961,15 @@ lws_sa46_parse_numeric_address(const char *ads, lws_sockaddr46 *sa46)
949961
if (n != 4)
950962
return -1;
951963

964+
#if defined(LWS_WITH_IPV4)
952965
sa46->sa4.sin_family = AF_INET;
953966
memcpy(&sa46->sa4.sin_addr.s_addr, a,
954967
sizeof(sa46->sa4.sin_addr.s_addr));
955968

956969
return 0;
970+
#else
971+
return -1;
972+
#endif
957973
}
958974

959975
int
@@ -1033,9 +1049,11 @@ lws_sa46_write_numeric_address(lws_sockaddr46 *sa46, char *buf, size_t len)
10331049
return lws_write_numeric_address(
10341050
(uint8_t *)&sa46->sa6.sin6_addr, 16, buf, len);
10351051
#endif
1052+
#if defined(LWS_WITH_IPV4)
10361053
if (sa46->sa4.sin_family == AF_INET)
10371054
return lws_write_numeric_address(
10381055
(uint8_t *)&sa46->sa4.sin_addr, 4, buf, len);
1056+
#endif
10391057

10401058
#if defined(LWS_WITH_UNIX_SOCK)
10411059
if (sa46->sa4.sin_family == AF_UNIX)
@@ -1056,27 +1074,35 @@ lws_sa46_write_numeric_address(lws_sockaddr46 *sa46, char *buf, size_t len)
10561074
int
10571075
lws_sa46_compare_ads(const lws_sockaddr46 *sa46a, const lws_sockaddr46 *sa46b)
10581076
{
1077+
#if defined(LWS_WITH_IPV4)
10591078
uint8_t norm1[16], norm2[16];
1079+
#endif
10601080
const uint8_t *p1, *p2;
10611081

1082+
#if defined(LWS_WITH_IPV4)
10621083
if (sa46a->sa4.sin_family == AF_INET) {
10631084
p1 = norm1;
10641085
lws_4to6(norm1, (const uint8_t *)&sa46a->sa4.sin_addr);
1086+
} else
1087+
#endif
10651088
#if defined(LWS_WITH_IPV6)
1066-
} else if (sa46a->sa4.sin_family == AF_INET6) {
1089+
if (sa46a->sa4.sin_family == AF_INET6) {
10671090
p1 = (const uint8_t *)&sa46a->sa6.sin6_addr;
1068-
#endif
10691091
} else
1092+
#endif
10701093
return 1;
10711094

1095+
#if defined(LWS_WITH_IPV4)
10721096
if (sa46b->sa4.sin_family == AF_INET) {
10731097
p2 = norm2;
10741098
lws_4to6(norm2, (const uint8_t *)&sa46b->sa4.sin_addr);
1099+
} else
1100+
#endif
10751101
#if defined(LWS_WITH_IPV6)
1076-
} else if (sa46b->sa4.sin_family == AF_INET6) {
1102+
if (sa46b->sa4.sin_family == AF_INET6) {
10771103
p2 = (const uint8_t *)&sa46b->sa6.sin6_addr;
1078-
#endif
10791104
} else
1105+
#endif
10801106
return 1;
10811107

10821108
return memcmp(p1, p2, 16);
@@ -1111,9 +1137,14 @@ int
11111137
lws_sa46_on_net(const lws_sockaddr46 *sa46a, const lws_sockaddr46 *sa46_net,
11121138
int net_len)
11131139
{
1140+
#if defined(LWS_WITH_IPV4)
11141141
uint8_t mask = 0xff, norm[16];
1142+
#else
1143+
uint8_t mask = 0xff;
1144+
#endif
11151145
const uint8_t *p1, *p2;
11161146

1147+
#if defined(LWS_WITH_IPV4)
11171148
if (sa46a->sa4.sin_family == AF_INET) {
11181149
p1 = (uint8_t *)&sa46a->sa4.sin_addr;
11191150
if (sa46_net->sa4.sin_family == AF_INET6) {
@@ -1122,14 +1153,16 @@ lws_sa46_on_net(const lws_sockaddr46 *sa46a, const lws_sockaddr46 *sa46_net,
11221153
lws_4to6(norm, p1);
11231154
p1 = norm;
11241155
}
1156+
} else
1157+
#endif
11251158
#if defined(LWS_WITH_IPV6)
1159+
if (sa46a->sa4.sin_family == AF_INET6) {
1160+
p1 = (uint8_t *)&sa46a->sa6.sin6_addr;
11261161
} else
1127-
if (sa46a->sa4.sin_family == AF_INET6) {
1128-
p1 = (uint8_t *)&sa46a->sa6.sin6_addr;
11291162
#endif
1130-
} else
1131-
return 1;
1163+
return 1;
11321164

1165+
#if defined(LWS_WITH_IPV4)
11331166
if (sa46_net->sa4.sin_family == AF_INET) {
11341167
p2 = (uint8_t *)&sa46_net->sa4.sin_addr;
11351168
if (sa46a->sa4.sin_family == AF_INET6) {
@@ -1140,13 +1173,14 @@ lws_sa46_on_net(const lws_sockaddr46 *sa46a, const lws_sockaddr46 *sa46_net,
11401173
/* because the mask length is for net v4 address */
11411174
net_len += 12 * 8;
11421175
}
1176+
} else
1177+
#endif
11431178
#if defined(LWS_WITH_IPV6)
1179+
if (sa46a->sa4.sin_family == AF_INET6) {
1180+
p2 = (uint8_t *)&sa46_net->sa6.sin6_addr;
11441181
} else
1145-
if (sa46a->sa4.sin_family == AF_INET6) {
1146-
p2 = (uint8_t *)&sa46_net->sa6.sin6_addr;
11471182
#endif
1148-
} else
1149-
return 1;
1183+
return 1;
11501184

11511185
while (net_len > 0) {
11521186
if (net_len < 8)
@@ -1166,10 +1200,13 @@ lws_sa46_copy_address(lws_sockaddr46 *sa46a, const void *in, int af)
11661200
{
11671201
sa46a->sa4.sin_family = (sa_family_t)af;
11681202

1203+
#if defined(LWS_WITH_IPV4)
11691204
if (af == AF_INET)
11701205
memcpy(&sa46a->sa4.sin_addr, in, 4);
1206+
else
1207+
#endif
11711208
#if defined(LWS_WITH_IPV6)
1172-
else if (af == AF_INET6)
1209+
if (af == AF_INET6)
11731210
memcpy(&sa46a->sa6.sin6_addr, in, sizeof(sa46a->sa6.sin6_addr));
11741211
#endif
11751212
}
@@ -1252,22 +1289,25 @@ lws_is_lan_address(const char *ads)
12521289
if (lws_sa46_parse_numeric_address(ads, &sa46) < 0)
12531290
return 0;
12541291

1292+
#if defined(LWS_WITH_IPV4)
12551293
if (sa46.sa4.sin_family == AF_INET) {
12561294
uint8_t *p = (uint8_t *)&sa46.sa4.sin_addr.s_addr;
12571295

12581296
/* 10.0.0.0/8 */
12591297
if (p[0] == 10)
12601298
return 1;
12611299
/* 172.16.0.0/12 */
1262-
if (p[0] == 172 && (p[1] >= 16 && p[1] <= 31))
1300+
if (p[0] == 172 && p[1] >= 16 && p[1] <= 31)
12631301
return 1;
12641302
/* 192.168.0.0/16 */
12651303
if (p[0] == 192 && p[1] == 168)
12661304
return 1;
12671305
/* 127.0.0.0/8 */
12681306
if (p[0] == 127)
12691307
return 1;
1270-
} else if (sa46.sa4.sin_family == AF_INET6) {
1308+
} else
1309+
#endif
1310+
if (sa46.sa4.sin_family == AF_INET6) {
12711311
#if defined(LWS_WITH_IPV6)
12721312
uint8_t *p = (uint8_t *)&sa46.sa6.sin6_addr.s6_addr;
12731313

lib/core-net/private-lib-core-net.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -362,7 +362,11 @@ struct lws_context_per_thread {
362362
#endif
363363

364364
#if defined(WIN32)
365+
#if defined(LWS_WITH_IPV4)
365366
struct sockaddr_in frt_pipe_si;
367+
#else
368+
struct sockaddr_in6 frt_pipe_si;
369+
#endif
366370
#endif
367371

368372
#if defined(LWS_WITH_TLS)

lib/core/private-lib-core.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -513,7 +513,11 @@ struct lws_context {
513513
#endif
514514

515515
#if defined(LWS_PLAT_FREERTOS)
516+
#if defined(LWS_WITH_IPV4)
516517
struct sockaddr_in frt_pipe_si;
518+
#else
519+
struct sockaddr_in6 frt_pipe_si;
520+
#endif
517521
#endif
518522

519523
#if defined(LWS_WITH_HTTP2)

lib/plat/freertos/freertos-pipe.c

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,11 @@ int
3030
lws_plat_pipe_create(struct lws *wsi)
3131
{
3232
struct lws_context_per_thread *pt = &wsi->a.context->pt[(int)wsi->tsi];
33+
#if defined(LWS_WITH_IPV4)
3334
struct sockaddr_in *si = &wsi->a.context->frt_pipe_si;
35+
#else
36+
struct sockaddr_in6 *si = &wsi->a.context->frt_pipe_si;
37+
#endif
3438
lws_sockfd_type *fd = pt->dummy_pipe_fds;
3539
socklen_t sl;
3640

@@ -43,6 +47,7 @@ lws_plat_pipe_create(struct lws *wsi)
4347
* ephemeral range for us.
4448
*/
4549

50+
#if defined(LWS_WITH_IPV4)
4651
fd[0] = lwip_socket(AF_INET, SOCK_DGRAM, 0);
4752
if (fd[0] < 0)
4853
goto bail;
@@ -68,6 +73,27 @@ lws_plat_pipe_create(struct lws *wsi)
6873

6974
if (lwip_bind(fd[0], (const struct sockaddr *)si, sizeof(*si)) < 0)
7075
goto bail;
76+
#else
77+
fd[0] = lwip_socket(AF_INET6, SOCK_DGRAM, 0);
78+
if (fd[0] < 0)
79+
goto bail;
80+
81+
fd[1] = lwip_socket(AF_INET6, SOCK_DGRAM, 0);
82+
if (fd[1] < 0)
83+
goto bail;
84+
85+
si->sin6_family = AF_INET6;
86+
si->sin6_addr = in6addr_loopback;
87+
si->sin6_port = 0;
88+
89+
if (lwip_bind(fd[1], (const struct sockaddr *)si, sizeof(*si)) < 0)
90+
goto bail;
91+
92+
si->sin6_port = 0;
93+
94+
if (lwip_bind(fd[0], (const struct sockaddr *)si, sizeof(*si)) < 0)
95+
goto bail;
96+
#endif
7197

7298
/*
7399
* Query the socket to set context->frt_pipe_si to the full sockaddr it
@@ -81,8 +107,13 @@ lws_plat_pipe_create(struct lws *wsi)
81107
if (lwip_getsockname(fd[0], (struct sockaddr *)si, &sl))
82108
goto bail;
83109

110+
#if defined(LWS_WITH_IPV4)
84111
lwsl_info("%s: cancel UDP skt port %d\n", __func__,
85112
ntohs(si->sin_port));
113+
#else
114+
lwsl_info("%s: cancel UDP skt port %d\n", __func__,
115+
ntohs(si->sin6_port));
116+
#endif
86117

87118
return 0;
88119

@@ -96,7 +127,11 @@ int
96127
lws_plat_pipe_signal(struct lws_context *ctx, int tsi)
97128
{
98129
struct lws_context_per_thread *pt = &ctx->pt[tsi];
130+
#if defined(LWS_WITH_IPV4)
99131
struct sockaddr_in *si = &ctx->frt_pipe_si;
132+
#else
133+
struct sockaddr_in6 *si = &ctx->frt_pipe_si;
134+
#endif
100135
lws_sockfd_type *fd = pt->dummy_pipe_fds;
101136
uint8_t u = 0;
102137
int n;

0 commit comments

Comments
 (0)