net: Convert network connection to use sockaddr
As the net_conn needs port information, use struct sockaddr internally as it has the port numbers built in. Change-Id: Idb1c87afa956dfe55dc8d533d867fa7845545b12 Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
This commit is contained in:
parent
b055a05ae8
commit
1932d4c3ec
4 changed files with 121 additions and 79 deletions
|
@ -370,13 +370,14 @@ int net_conn_unregister(void *handle)
|
||||||
#if NET_DEBUG
|
#if NET_DEBUG
|
||||||
static inline
|
static inline
|
||||||
void prepare_register_debug_print(char *dst, char *src,
|
void prepare_register_debug_print(char *dst, char *src,
|
||||||
const struct net_addr *remote_addr,
|
const struct sockaddr *remote_addr,
|
||||||
const struct net_addr *local_addr)
|
const struct sockaddr *local_addr)
|
||||||
{
|
{
|
||||||
if (remote_addr && remote_addr->family == AF_INET6) {
|
if (remote_addr && remote_addr->family == AF_INET6) {
|
||||||
#if defined(CONFIG_NET_IPV6)
|
#if defined(CONFIG_NET_IPV6)
|
||||||
snprintf(dst, sizeof(dst),
|
snprintf(dst, sizeof(dst),
|
||||||
net_sprint_ipv6_addr(&remote_addr->in6_addr));
|
net_sprint_ipv6_addr(&net_sin6(remote_addr)->
|
||||||
|
sin6_addr));
|
||||||
#else
|
#else
|
||||||
snprintf(dst, sizeof(dst), "?");
|
snprintf(dst, sizeof(dst), "?");
|
||||||
#endif
|
#endif
|
||||||
|
@ -384,7 +385,8 @@ void prepare_register_debug_print(char *dst, char *src,
|
||||||
} else if (remote_addr && remote_addr->family == AF_INET) {
|
} else if (remote_addr && remote_addr->family == AF_INET) {
|
||||||
#if defined(CONFIG_NET_IPV4)
|
#if defined(CONFIG_NET_IPV4)
|
||||||
snprintf(dst, sizeof(dst),
|
snprintf(dst, sizeof(dst),
|
||||||
net_sprint_ipv4_addr(&remote_addr->in_addr));
|
net_sprint_ipv4_addr(&net_sin(remote_addr)->
|
||||||
|
sin_addr));
|
||||||
#else
|
#else
|
||||||
snprintf(dst, sizeof(dst), "?");
|
snprintf(dst, sizeof(dst), "?");
|
||||||
#endif
|
#endif
|
||||||
|
@ -396,7 +398,8 @@ void prepare_register_debug_print(char *dst, char *src,
|
||||||
if (local_addr && local_addr->family == AF_INET6) {
|
if (local_addr && local_addr->family == AF_INET6) {
|
||||||
#if defined(CONFIG_NET_IPV6)
|
#if defined(CONFIG_NET_IPV6)
|
||||||
snprintf(src, sizeof(src),
|
snprintf(src, sizeof(src),
|
||||||
net_sprint_ipv6_addr(&local_addr->in6_addr));
|
net_sprint_ipv6_addr(&net_sin6(local_addr)->
|
||||||
|
sin6_addr));
|
||||||
#else
|
#else
|
||||||
snprintf(src, sizeof(src), "?");
|
snprintf(src, sizeof(src), "?");
|
||||||
#endif
|
#endif
|
||||||
|
@ -404,7 +407,8 @@ void prepare_register_debug_print(char *dst, char *src,
|
||||||
} else if (local_addr && local_addr->family == AF_INET) {
|
} else if (local_addr && local_addr->family == AF_INET) {
|
||||||
#if defined(CONFIG_NET_IPV4)
|
#if defined(CONFIG_NET_IPV4)
|
||||||
snprintf(src, sizeof(src),
|
snprintf(src, sizeof(src),
|
||||||
net_sprint_ipv4_addr(&local_addr->in_addr));
|
net_sprint_ipv4_addr(&net_sin(local_addr)->
|
||||||
|
sin_addr));
|
||||||
#else
|
#else
|
||||||
snprintf(src, sizeof(src), "?");
|
snprintf(src, sizeof(src), "?");
|
||||||
#endif
|
#endif
|
||||||
|
@ -416,8 +420,8 @@ void prepare_register_debug_print(char *dst, char *src,
|
||||||
#endif /* NET_DEBUG */
|
#endif /* NET_DEBUG */
|
||||||
|
|
||||||
int net_conn_register(enum ip_protocol proto,
|
int net_conn_register(enum ip_protocol proto,
|
||||||
const struct net_addr *remote_addr,
|
const struct sockaddr *remote_addr,
|
||||||
const struct net_addr *local_addr,
|
const struct sockaddr *local_addr,
|
||||||
uint16_t remote_port,
|
uint16_t remote_port,
|
||||||
uint16_t local_port,
|
uint16_t local_port,
|
||||||
net_conn_cb_t cb,
|
net_conn_cb_t cb,
|
||||||
|
@ -442,12 +446,13 @@ int net_conn_register(enum ip_protocol proto,
|
||||||
conns[i].flags |= NET_CONN_REMOTE_ADDR_SET;
|
conns[i].flags |= NET_CONN_REMOTE_ADDR_SET;
|
||||||
|
|
||||||
memcpy(&conns[i].remote_addr, remote_addr,
|
memcpy(&conns[i].remote_addr, remote_addr,
|
||||||
sizeof(struct net_addr));
|
sizeof(struct sockaddr));
|
||||||
|
|
||||||
#if defined(CONFIG_NET_IPV6)
|
#if defined(CONFIG_NET_IPV6)
|
||||||
if (remote_addr->family == AF_INET6) {
|
if (remote_addr->family == AF_INET6) {
|
||||||
if (net_is_ipv6_addr_unspecified(
|
if (net_is_ipv6_addr_unspecified(
|
||||||
&remote_addr->in6_addr)) {
|
&net_sin6(remote_addr)->
|
||||||
|
sin6_addr)) {
|
||||||
rank |= NET_RANK_REMOTE_UNSPEC_ADDR;
|
rank |= NET_RANK_REMOTE_UNSPEC_ADDR;
|
||||||
} else {
|
} else {
|
||||||
rank |= NET_RANK_REMOTE_SPEC_ADDR;
|
rank |= NET_RANK_REMOTE_SPEC_ADDR;
|
||||||
|
@ -457,7 +462,8 @@ int net_conn_register(enum ip_protocol proto,
|
||||||
|
|
||||||
#if defined(CONFIG_NET_IPV4)
|
#if defined(CONFIG_NET_IPV4)
|
||||||
if (remote_addr->family == AF_INET) {
|
if (remote_addr->family == AF_INET) {
|
||||||
if (!remote_addr->in_addr.s_addr[0]) {
|
if (!net_sin(remote_addr)->
|
||||||
|
sin_addr.s_addr[0]) {
|
||||||
rank |= NET_RANK_REMOTE_UNSPEC_ADDR;
|
rank |= NET_RANK_REMOTE_UNSPEC_ADDR;
|
||||||
} else {
|
} else {
|
||||||
rank |= NET_RANK_REMOTE_SPEC_ADDR;
|
rank |= NET_RANK_REMOTE_SPEC_ADDR;
|
||||||
|
@ -476,12 +482,13 @@ int net_conn_register(enum ip_protocol proto,
|
||||||
conns[i].flags |= NET_CONN_LOCAL_ADDR_SET;
|
conns[i].flags |= NET_CONN_LOCAL_ADDR_SET;
|
||||||
|
|
||||||
memcpy(&conns[i].local_addr, local_addr,
|
memcpy(&conns[i].local_addr, local_addr,
|
||||||
sizeof(struct net_addr));
|
sizeof(struct sockaddr));
|
||||||
|
|
||||||
#if defined(CONFIG_NET_IPV6)
|
#if defined(CONFIG_NET_IPV6)
|
||||||
if (local_addr->family == AF_INET6) {
|
if (local_addr->family == AF_INET6) {
|
||||||
if (net_is_ipv6_addr_unspecified(
|
if (net_is_ipv6_addr_unspecified(
|
||||||
&local_addr->in6_addr)) {
|
&net_sin6(local_addr)->
|
||||||
|
sin6_addr)) {
|
||||||
rank |= NET_RANK_LOCAL_UNSPEC_ADDR;
|
rank |= NET_RANK_LOCAL_UNSPEC_ADDR;
|
||||||
} else {
|
} else {
|
||||||
rank |= NET_RANK_LOCAL_SPEC_ADDR;
|
rank |= NET_RANK_LOCAL_SPEC_ADDR;
|
||||||
|
@ -491,7 +498,7 @@ int net_conn_register(enum ip_protocol proto,
|
||||||
|
|
||||||
#if defined(CONFIG_NET_IPV4)
|
#if defined(CONFIG_NET_IPV4)
|
||||||
if (local_addr->family == AF_INET) {
|
if (local_addr->family == AF_INET) {
|
||||||
if (!local_addr->in_addr.s_addr[0]) {
|
if (!net_sin(local_addr)->sin_addr.s_addr[0]) {
|
||||||
rank |= NET_RANK_LOCAL_UNSPEC_ADDR;
|
rank |= NET_RANK_LOCAL_UNSPEC_ADDR;
|
||||||
} else {
|
} else {
|
||||||
rank |= NET_RANK_LOCAL_SPEC_ADDR;
|
rank |= NET_RANK_LOCAL_SPEC_ADDR;
|
||||||
|
@ -509,15 +516,17 @@ int net_conn_register(enum ip_protocol proto,
|
||||||
|
|
||||||
if (remote_port) {
|
if (remote_port) {
|
||||||
rank |= NET_RANK_REMOTE_PORT;
|
rank |= NET_RANK_REMOTE_PORT;
|
||||||
|
net_sin(&conns[i].remote_addr)->sin_port =
|
||||||
|
htons(remote_port);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (local_port) {
|
if (local_port) {
|
||||||
rank |= NET_RANK_LOCAL_PORT;
|
rank |= NET_RANK_LOCAL_PORT;
|
||||||
|
net_sin(&conns[i].local_addr)->sin_port =
|
||||||
|
htons(local_port);
|
||||||
}
|
}
|
||||||
|
|
||||||
conns[i].flags |= NET_CONN_IN_USE;
|
conns[i].flags |= NET_CONN_IN_USE;
|
||||||
conns[i].remote_port = remote_port;
|
|
||||||
conns[i].local_port = local_port;
|
|
||||||
conns[i].cb = cb;
|
conns[i].cb = cb;
|
||||||
conns[i].user_data = user_data;
|
conns[i].user_data = user_data;
|
||||||
conns[i].rank = rank;
|
conns[i].rank = rank;
|
||||||
|
@ -535,8 +544,9 @@ int net_conn_register(enum ip_protocol proto,
|
||||||
remote_addr,
|
remote_addr,
|
||||||
local_addr);
|
local_addr);
|
||||||
|
|
||||||
NET_DBG("[%d/%u/0x%02x] remote %p/%s/%u local %p/%s/%u "
|
NET_DBG("[%d/%d/%u/0x%02x] remote %p/%s/%u "
|
||||||
"cb %p ud %p", i, proto, rank,
|
"local %p/%s/%u cb %p ud %p",
|
||||||
|
i, remote_addr->family, proto, rank,
|
||||||
remote_addr, dst, remote_port,
|
remote_addr, dst, remote_port,
|
||||||
local_addr, src, local_port,
|
local_addr, src, local_port,
|
||||||
cb, user_data);
|
cb, user_data);
|
||||||
|
@ -553,7 +563,8 @@ int net_conn_register(enum ip_protocol proto,
|
||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool check_addr(struct net_buf *buf, struct net_addr *addr,
|
static bool check_addr(struct net_buf *buf,
|
||||||
|
struct sockaddr *addr,
|
||||||
bool is_remote)
|
bool is_remote)
|
||||||
{
|
{
|
||||||
if (addr->family != net_nbuf_family(buf)) {
|
if (addr->family != net_nbuf_family(buf)) {
|
||||||
|
@ -570,8 +581,10 @@ static bool check_addr(struct net_buf *buf, struct net_addr *addr,
|
||||||
addr6 = &NET_IPV6_BUF(buf)->dst;
|
addr6 = &NET_IPV6_BUF(buf)->dst;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!net_is_ipv6_addr_unspecified(&addr->in6_addr)) {
|
if (!net_is_ipv6_addr_unspecified(
|
||||||
if (!net_ipv6_addr_cmp(&addr->in6_addr, addr6)) {
|
&net_sin6(addr)->sin6_addr)) {
|
||||||
|
if (!net_ipv6_addr_cmp(&net_sin6(addr)->sin6_addr,
|
||||||
|
addr6)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -590,8 +603,9 @@ static bool check_addr(struct net_buf *buf, struct net_addr *addr,
|
||||||
addr4 = &NET_IPV4_BUF(buf)->dst;
|
addr4 = &NET_IPV4_BUF(buf)->dst;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (addr->in_addr.s_addr[0]) {
|
if (net_sin(addr)->sin_addr.s_addr[0]) {
|
||||||
if (!net_ipv4_addr_cmp(&addr->in_addr, addr4)) {
|
if (!net_ipv4_addr_cmp(&net_sin(addr)->sin_addr,
|
||||||
|
addr4)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -649,16 +663,16 @@ enum net_verdict net_conn_input(enum ip_protocol proto, struct net_buf *buf)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (conns[i].remote_port) {
|
if (net_sin(&conns[i].remote_addr)->sin_port) {
|
||||||
if (conns[i].remote_port !=
|
if (net_sin(&conns[i].remote_addr)->sin_port !=
|
||||||
ntohs(NET_CONN_BUF(buf)->src_port)) {
|
NET_CONN_BUF(buf)->src_port) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (conns[i].local_port) {
|
if (net_sin(&conns[i].local_addr)->sin_port) {
|
||||||
if (conns[i].local_port !=
|
if (net_sin(&conns[i].local_addr)->sin_port !=
|
||||||
ntohs(NET_CONN_BUF(buf)->dst_port)) {
|
NET_CONN_BUF(buf)->dst_port) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -701,7 +715,7 @@ enum net_verdict net_conn_input(enum ip_protocol proto, struct net_buf *buf)
|
||||||
conns[best_match].rank);
|
conns[best_match].rank);
|
||||||
#endif /* CONFIG_NET_CONN_CACHE */
|
#endif /* CONFIG_NET_CONN_CACHE */
|
||||||
|
|
||||||
if (conns[best_match].cb(buf,
|
if (conns[best_match].cb(&conns[best_match], buf,
|
||||||
conns[best_match].user_data) == NET_DROP) {
|
conns[best_match].user_data) == NET_DROP) {
|
||||||
goto drop;
|
goto drop;
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,6 +35,8 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
struct net_conn;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Function that is called by connection subsystem when UDP/TCP
|
* @brief Function that is called by connection subsystem when UDP/TCP
|
||||||
* packet is received and which matches local and remote IP address
|
* packet is received and which matches local and remote IP address
|
||||||
|
@ -51,16 +53,10 @@ typedef enum net_verdict (*net_conn_cb_t)(struct net_buf *buf,
|
||||||
*/
|
*/
|
||||||
struct net_conn {
|
struct net_conn {
|
||||||
/** Remote IP address */
|
/** Remote IP address */
|
||||||
struct net_addr remote_addr;
|
struct sockaddr remote_addr;
|
||||||
|
|
||||||
/** Local IP address */
|
/** Local IP address */
|
||||||
struct net_addr local_addr;
|
struct sockaddr local_addr;
|
||||||
|
|
||||||
/** Remote port */
|
|
||||||
uint16_t remote_port;
|
|
||||||
|
|
||||||
/** Local port */
|
|
||||||
uint16_t local_port;
|
|
||||||
|
|
||||||
/** Callback to be called when matching UDP packet is received */
|
/** Callback to be called when matching UDP packet is received */
|
||||||
net_conn_cb_t cb;
|
net_conn_cb_t cb;
|
||||||
|
@ -103,8 +99,8 @@ struct net_conn {
|
||||||
* @return Return 0 if the registration succeed, <0 otherwise.
|
* @return Return 0 if the registration succeed, <0 otherwise.
|
||||||
*/
|
*/
|
||||||
int net_conn_register(enum ip_protocol proto,
|
int net_conn_register(enum ip_protocol proto,
|
||||||
const struct net_addr *remote_addr,
|
const struct sockaddr *remote_addr,
|
||||||
const struct net_addr *local_addr,
|
const struct sockaddr *local_addr,
|
||||||
uint16_t remote_port,
|
uint16_t remote_port,
|
||||||
uint16_t local_port,
|
uint16_t local_port,
|
||||||
net_conn_cb_t cb,
|
net_conn_cb_t cb,
|
||||||
|
|
|
@ -49,8 +49,8 @@ extern "C" {
|
||||||
*
|
*
|
||||||
* @return Return 0 if the registration succeed, <0 otherwise.
|
* @return Return 0 if the registration succeed, <0 otherwise.
|
||||||
*/
|
*/
|
||||||
static inline int net_udp_register(const struct net_addr *remote_addr,
|
static inline int net_udp_register(const struct sockaddr *remote_addr,
|
||||||
const struct net_addr *local_addr,
|
const struct sockaddr *local_addr,
|
||||||
uint16_t remote_port,
|
uint16_t remote_port,
|
||||||
uint16_t local_port,
|
uint16_t local_port,
|
||||||
net_conn_cb_t cb,
|
net_conn_cb_t cb,
|
||||||
|
|
|
@ -131,8 +131,8 @@ NET_DEVICE_INIT(net_udp_test, "net_udp_test",
|
||||||
&net_udp_if_api, _ETH_L2_LAYER, 127);
|
&net_udp_if_api, _ETH_L2_LAYER, 127);
|
||||||
|
|
||||||
struct ud {
|
struct ud {
|
||||||
const struct net_addr *remote_addr;
|
const struct sockaddr *remote_addr;
|
||||||
const struct net_addr *local_addr;
|
const struct sockaddr *local_addr;
|
||||||
uint16_t remote_port;
|
uint16_t remote_port;
|
||||||
uint16_t local_port;
|
uint16_t local_port;
|
||||||
char *test;
|
char *test;
|
||||||
|
@ -329,6 +329,31 @@ static bool send_ipv4_udp_msg(struct net_if *iface,
|
||||||
return !fail;
|
return !fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void set_port(sa_family_t family, struct sockaddr *raddr,
|
||||||
|
struct sockaddr *laddr, uint16_t rport,
|
||||||
|
uint16_t lport)
|
||||||
|
{
|
||||||
|
if (family == AF_INET6) {
|
||||||
|
if (raddr) {
|
||||||
|
((struct sockaddr_in6 *)raddr)->
|
||||||
|
sin6_port = htons(rport);
|
||||||
|
}
|
||||||
|
if (laddr) {
|
||||||
|
((struct sockaddr_in6 *)laddr)->
|
||||||
|
sin6_port = htons(lport);
|
||||||
|
}
|
||||||
|
} else if (family == AF_INET) {
|
||||||
|
if (raddr) {
|
||||||
|
((struct sockaddr_in *)raddr)->
|
||||||
|
sin_port = htons(rport);
|
||||||
|
}
|
||||||
|
if (laddr) {
|
||||||
|
((struct sockaddr_in *)laddr)->
|
||||||
|
sin_port = htons(lport);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void main_fiber(void)
|
void main_fiber(void)
|
||||||
{
|
{
|
||||||
void *handlers[CONFIG_NET_MAX_CONN];
|
void *handlers[CONFIG_NET_MAX_CONN];
|
||||||
|
@ -338,43 +363,43 @@ void main_fiber(void)
|
||||||
int ret, i = 0;
|
int ret, i = 0;
|
||||||
bool st;
|
bool st;
|
||||||
|
|
||||||
struct net_addr any_addr6;
|
struct sockaddr_in6 any_addr6;
|
||||||
const struct in6_addr in6addr_any = IN6ADDR_ANY_INIT;
|
const struct in6_addr in6addr_any = IN6ADDR_ANY_INIT;
|
||||||
|
|
||||||
struct net_addr my_addr6;
|
struct sockaddr_in6 my_addr6;
|
||||||
struct in6_addr in6addr_my = { { { 0x20, 0x01, 0x0d, 0xb8, 0, 0, 0, 0,
|
struct in6_addr in6addr_my = { { { 0x20, 0x01, 0x0d, 0xb8, 0, 0, 0, 0,
|
||||||
0, 0, 0, 0, 0, 0, 0, 0x1 } } };
|
0, 0, 0, 0, 0, 0, 0, 0x1 } } };
|
||||||
|
|
||||||
struct net_addr peer_addr6;
|
struct sockaddr_in6 peer_addr6;
|
||||||
struct in6_addr in6addr_peer = { { { 0x20, 0x01, 0x0d, 0xb8, 0, 0, 0, 0,
|
struct in6_addr in6addr_peer = { { { 0x20, 0x01, 0x0d, 0xb8, 0, 0, 0, 0,
|
||||||
0, 0, 0, 0x4e, 0x11, 0, 0, 0x2 } } };
|
0, 0, 0, 0x4e, 0x11, 0, 0, 0x2 } } };
|
||||||
|
|
||||||
struct net_addr any_addr4;
|
struct sockaddr_in any_addr4;
|
||||||
const struct in_addr in4addr_any = { { { 0 } } };
|
const struct in_addr in4addr_any = { { { 0 } } };
|
||||||
|
|
||||||
struct net_addr my_addr4;
|
struct sockaddr_in my_addr4;
|
||||||
struct in_addr in4addr_my = { { { 192, 0, 2, 1 } } };
|
struct in_addr in4addr_my = { { { 192, 0, 2, 1 } } };
|
||||||
|
|
||||||
struct net_addr peer_addr4;
|
struct sockaddr_in peer_addr4;
|
||||||
struct in_addr in4addr_peer = { { { 192, 0, 2, 9 } } };
|
struct in_addr in4addr_peer = { { { 192, 0, 2, 9 } } };
|
||||||
|
|
||||||
net_ipaddr_copy(&any_addr6.in6_addr, &in6addr_any);
|
net_ipaddr_copy(&any_addr6.sin6_addr, &in6addr_any);
|
||||||
any_addr6.family = AF_INET6;
|
any_addr6.sin6_family = AF_INET6;
|
||||||
|
|
||||||
net_ipaddr_copy(&my_addr6.in6_addr, &in6addr_my);
|
net_ipaddr_copy(&my_addr6.sin6_addr, &in6addr_my);
|
||||||
my_addr6.family = AF_INET6;
|
my_addr6.sin6_family = AF_INET6;
|
||||||
|
|
||||||
net_ipaddr_copy(&peer_addr6.in6_addr, &in6addr_peer);
|
net_ipaddr_copy(&peer_addr6.sin6_addr, &in6addr_peer);
|
||||||
peer_addr6.family = AF_INET6;
|
peer_addr6.sin6_family = AF_INET6;
|
||||||
|
|
||||||
net_ipaddr_copy(&any_addr4.in_addr, &in4addr_any);
|
net_ipaddr_copy(&any_addr4.sin_addr, &in4addr_any);
|
||||||
any_addr4.family = AF_INET;
|
any_addr4.sin_family = AF_INET;
|
||||||
|
|
||||||
net_ipaddr_copy(&my_addr4.in_addr, &in4addr_my);
|
net_ipaddr_copy(&my_addr4.sin_addr, &in4addr_my);
|
||||||
my_addr4.family = AF_INET;
|
my_addr4.sin_family = AF_INET;
|
||||||
|
|
||||||
net_ipaddr_copy(&peer_addr4.in_addr, &in4addr_peer);
|
net_ipaddr_copy(&peer_addr4.sin_addr, &in4addr_peer);
|
||||||
peer_addr4.family = AF_INET;
|
peer_addr4.sin_family = AF_INET;
|
||||||
|
|
||||||
nano_sem_init(&recv_lock);
|
nano_sem_init(&recv_lock);
|
||||||
|
|
||||||
|
@ -392,17 +417,22 @@ void main_fiber(void)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define REGISTER(raddr, laddr, rport, lport) \
|
#define REGISTER(family, raddr, laddr, rport, lport) \
|
||||||
({ \
|
({ \
|
||||||
static struct ud user_data; \
|
static struct ud user_data; \
|
||||||
\
|
\
|
||||||
user_data.remote_addr = raddr; \
|
user_data.remote_addr = (struct sockaddr *)raddr; \
|
||||||
user_data.local_addr = laddr; \
|
user_data.local_addr = (struct sockaddr *)laddr; \
|
||||||
user_data.remote_port = rport; \
|
user_data.remote_port = rport; \
|
||||||
user_data.local_port = lport; \
|
user_data.local_port = lport; \
|
||||||
user_data.test = #raddr"-"#laddr"-"#rport"-"#lport; \
|
user_data.test = #raddr"-"#laddr"-"#rport"-"#lport; \
|
||||||
\
|
\
|
||||||
ret = net_udp_register(raddr, laddr, rport, lport, \
|
set_port(family, (struct sockaddr *)raddr, \
|
||||||
|
(struct sockaddr *)laddr, rport, lport); \
|
||||||
|
\
|
||||||
|
ret = net_udp_register((struct sockaddr *)raddr, \
|
||||||
|
(struct sockaddr *)laddr, \
|
||||||
|
rport, lport, \
|
||||||
test_ok, &user_data, \
|
test_ok, &user_data, \
|
||||||
&handlers[i]); \
|
&handlers[i]); \
|
||||||
if (ret) { \
|
if (ret) { \
|
||||||
|
@ -415,8 +445,10 @@ void main_fiber(void)
|
||||||
})
|
})
|
||||||
|
|
||||||
#define REGISTER_FAIL(raddr, laddr, rport, lport) \
|
#define REGISTER_FAIL(raddr, laddr, rport, lport) \
|
||||||
ret = net_udp_register(raddr, laddr, rport, lport, test_fail, \
|
ret = net_udp_register((struct sockaddr *)raddr, \
|
||||||
INT_TO_POINTER(0), NULL); \
|
(struct sockaddr *)laddr, \
|
||||||
|
rport, lport, \
|
||||||
|
test_fail, INT_TO_POINTER(0), NULL); \
|
||||||
if (!ret) { \
|
if (!ret) { \
|
||||||
printk("UDP register invalid match %s failed\n", \
|
printk("UDP register invalid match %s failed\n", \
|
||||||
#raddr"-"#laddr"-"#rport"-"#lport); \
|
#raddr"-"#laddr"-"#rport"-"#lport); \
|
||||||
|
@ -467,47 +499,47 @@ void main_fiber(void)
|
||||||
return; \
|
return; \
|
||||||
}
|
}
|
||||||
|
|
||||||
ud = REGISTER(&any_addr6, &any_addr6, 1234, 4242);
|
ud = REGISTER(AF_INET6, &any_addr6, &any_addr6, 1234, 4242);
|
||||||
TEST_IPV6_OK(ud, &in6addr_peer, &in6addr_my, 1234, 4242);
|
TEST_IPV6_OK(ud, &in6addr_peer, &in6addr_my, 1234, 4242);
|
||||||
TEST_IPV6_OK(ud, &in6addr_peer, &in6addr_my, 1234, 4242);
|
TEST_IPV6_OK(ud, &in6addr_peer, &in6addr_my, 1234, 4242);
|
||||||
TEST_IPV6_FAIL(ud, &in6addr_peer, &in6addr_my, 1234, 61400);
|
TEST_IPV6_FAIL(ud, &in6addr_peer, &in6addr_my, 1234, 61400);
|
||||||
TEST_IPV6_FAIL(ud, &in6addr_peer, &in6addr_my, 1234, 61400);
|
TEST_IPV6_FAIL(ud, &in6addr_peer, &in6addr_my, 1234, 61400);
|
||||||
UNREGISTER(ud);
|
UNREGISTER(ud);
|
||||||
|
|
||||||
ud = REGISTER(&any_addr4, &any_addr4, 1234, 4242);
|
ud = REGISTER(AF_INET, &any_addr4, &any_addr4, 1234, 4242);
|
||||||
TEST_IPV4_OK(ud, &in4addr_peer, &in4addr_my, 1234, 4242);
|
TEST_IPV4_OK(ud, &in4addr_peer, &in4addr_my, 1234, 4242);
|
||||||
TEST_IPV4_OK(ud, &in4addr_peer, &in4addr_my, 1234, 4242);
|
TEST_IPV4_OK(ud, &in4addr_peer, &in4addr_my, 1234, 4242);
|
||||||
TEST_IPV4_FAIL(ud, &in4addr_peer, &in4addr_my, 1234, 4325);
|
TEST_IPV4_FAIL(ud, &in4addr_peer, &in4addr_my, 1234, 4325);
|
||||||
TEST_IPV4_FAIL(ud, &in4addr_peer, &in4addr_my, 1234, 4325);
|
TEST_IPV4_FAIL(ud, &in4addr_peer, &in4addr_my, 1234, 4325);
|
||||||
UNREGISTER(ud);
|
UNREGISTER(ud);
|
||||||
|
|
||||||
ud = REGISTER(&any_addr6, NULL, 1234, 4242);
|
ud = REGISTER(AF_INET6, &any_addr6, NULL, 1234, 4242);
|
||||||
TEST_IPV6_OK(ud, &in6addr_peer, &in6addr_my, 1234, 4242);
|
TEST_IPV6_OK(ud, &in6addr_peer, &in6addr_my, 1234, 4242);
|
||||||
TEST_IPV6_OK(ud, &in6addr_peer, &in6addr_my, 1234, 4242);
|
TEST_IPV6_OK(ud, &in6addr_peer, &in6addr_my, 1234, 4242);
|
||||||
TEST_IPV6_FAIL(ud, &in6addr_peer, &in6addr_my, 1234, 61400);
|
TEST_IPV6_FAIL(ud, &in6addr_peer, &in6addr_my, 1234, 61400);
|
||||||
TEST_IPV6_FAIL(ud, &in6addr_peer, &in6addr_my, 1234, 61400);
|
TEST_IPV6_FAIL(ud, &in6addr_peer, &in6addr_my, 1234, 61400);
|
||||||
UNREGISTER(ud);
|
UNREGISTER(ud);
|
||||||
|
|
||||||
ud = REGISTER(NULL, &any_addr6, 1234, 4242);
|
ud = REGISTER(AF_INET6, NULL, &any_addr6, 1234, 4242);
|
||||||
TEST_IPV6_OK(ud, &in6addr_peer, &in6addr_my, 1234, 4242);
|
TEST_IPV6_OK(ud, &in6addr_peer, &in6addr_my, 1234, 4242);
|
||||||
TEST_IPV6_OK(ud, &in6addr_peer, &in6addr_my, 1234, 4242);
|
TEST_IPV6_OK(ud, &in6addr_peer, &in6addr_my, 1234, 4242);
|
||||||
TEST_IPV6_FAIL(ud, &in6addr_peer, &in6addr_my, 1234, 61400);
|
TEST_IPV6_FAIL(ud, &in6addr_peer, &in6addr_my, 1234, 61400);
|
||||||
TEST_IPV6_FAIL(ud, &in6addr_peer, &in6addr_my, 1234, 61400);
|
TEST_IPV6_FAIL(ud, &in6addr_peer, &in6addr_my, 1234, 61400);
|
||||||
UNREGISTER(ud);
|
UNREGISTER(ud);
|
||||||
|
|
||||||
ud = REGISTER(&peer_addr6, &my_addr6, 1234, 4242);
|
ud = REGISTER(AF_INET6, &peer_addr6, &my_addr6, 1234, 4242);
|
||||||
TEST_IPV6_OK(ud, &in6addr_peer, &in6addr_my, 1234, 4242);
|
TEST_IPV6_OK(ud, &in6addr_peer, &in6addr_my, 1234, 4242);
|
||||||
TEST_IPV6_FAIL(ud, &in6addr_peer, &in6addr_my, 1234, 4243);
|
TEST_IPV6_FAIL(ud, &in6addr_peer, &in6addr_my, 1234, 4243);
|
||||||
|
|
||||||
ud = REGISTER(&peer_addr4, &my_addr4, 1234, 4242);
|
ud = REGISTER(AF_INET, &peer_addr4, &my_addr4, 1234, 4242);
|
||||||
TEST_IPV4_OK(ud, &in4addr_peer, &in4addr_my, 1234, 4242);
|
TEST_IPV4_OK(ud, &in4addr_peer, &in4addr_my, 1234, 4242);
|
||||||
TEST_IPV4_FAIL(ud, &in4addr_peer, &in4addr_my, 1234, 4243);
|
TEST_IPV4_FAIL(ud, &in4addr_peer, &in4addr_my, 1234, 4243);
|
||||||
|
|
||||||
ud = REGISTER(NULL, NULL, 1234, 42423);
|
ud = REGISTER(AF_UNSPEC, NULL, NULL, 1234, 42423);
|
||||||
TEST_IPV4_OK(ud, &in4addr_peer, &in4addr_my, 1234, 42423);
|
TEST_IPV4_OK(ud, &in4addr_peer, &in4addr_my, 1234, 42423);
|
||||||
TEST_IPV6_OK(ud, &in6addr_peer, &in6addr_my, 1234, 42423);
|
TEST_IPV6_OK(ud, &in6addr_peer, &in6addr_my, 1234, 42423);
|
||||||
|
|
||||||
ud = REGISTER(NULL, NULL, 1234, 0);
|
ud = REGISTER(AF_UNSPEC, NULL, NULL, 1234, 0);
|
||||||
TEST_IPV4_OK(ud, &in4addr_peer, &in4addr_my, 1234, 42422);
|
TEST_IPV4_OK(ud, &in4addr_peer, &in4addr_my, 1234, 42422);
|
||||||
TEST_IPV6_OK(ud, &in6addr_peer, &in6addr_my, 1234, 42422);
|
TEST_IPV6_OK(ud, &in6addr_peer, &in6addr_my, 1234, 42422);
|
||||||
TEST_IPV4_OK(ud, &in4addr_peer, &in4addr_my, 1234, 42422);
|
TEST_IPV4_OK(ud, &in4addr_peer, &in4addr_my, 1234, 42422);
|
||||||
|
@ -516,13 +548,13 @@ void main_fiber(void)
|
||||||
TEST_IPV4_FAIL(ud, &in4addr_peer, &in4addr_my, 12345, 42421);
|
TEST_IPV4_FAIL(ud, &in4addr_peer, &in4addr_my, 12345, 42421);
|
||||||
TEST_IPV6_FAIL(ud, &in6addr_peer, &in6addr_my, 12345, 42421);
|
TEST_IPV6_FAIL(ud, &in6addr_peer, &in6addr_my, 12345, 42421);
|
||||||
|
|
||||||
ud = REGISTER(NULL, NULL, 0, 0);
|
ud = REGISTER(AF_UNSPEC, NULL, NULL, 0, 0);
|
||||||
TEST_IPV4_OK(ud, &in4addr_peer, &in4addr_my, 12345, 42421);
|
TEST_IPV4_OK(ud, &in4addr_peer, &in4addr_my, 12345, 42421);
|
||||||
TEST_IPV6_OK(ud, &in6addr_peer, &in6addr_my, 12345, 42421);
|
TEST_IPV6_OK(ud, &in6addr_peer, &in6addr_my, 12345, 42421);
|
||||||
|
|
||||||
/* Remote addr same as local addr, these two will never match */
|
/* Remote addr same as local addr, these two will never match */
|
||||||
REGISTER(&my_addr6, NULL, 1234, 4242);
|
REGISTER(AF_INET6, &my_addr6, NULL, 1234, 4242);
|
||||||
REGISTER(&my_addr4, NULL, 1234, 4242);
|
REGISTER(AF_INET, &my_addr4, NULL, 1234, 4242);
|
||||||
|
|
||||||
/* IPv4 remote addr and IPv6 remote addr, impossible combination */
|
/* IPv4 remote addr and IPv6 remote addr, impossible combination */
|
||||||
REGISTER_FAIL(&my_addr4, &my_addr6, 1234, 4242);
|
REGISTER_FAIL(&my_addr4, &my_addr6, 1234, 4242);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue