From 1932d4c3ec5de34b50d691c18449ff718f5210eb Mon Sep 17 00:00:00 2001 From: Jukka Rissanen Date: Wed, 22 Jun 2016 16:33:56 +0300 Subject: [PATCH] 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 --- net/yaip/connection.c | 74 ++++++++++++++++----------- net/yaip/connection.h | 16 +++--- net/yaip/udp.h | 4 +- tests/net/udp/src/main.c | 106 +++++++++++++++++++++++++-------------- 4 files changed, 121 insertions(+), 79 deletions(-) diff --git a/net/yaip/connection.c b/net/yaip/connection.c index ed1713e96b2..75305f202c6 100644 --- a/net/yaip/connection.c +++ b/net/yaip/connection.c @@ -370,13 +370,14 @@ int net_conn_unregister(void *handle) #if NET_DEBUG static inline void prepare_register_debug_print(char *dst, char *src, - const struct net_addr *remote_addr, - const struct net_addr *local_addr) + const struct sockaddr *remote_addr, + const struct sockaddr *local_addr) { if (remote_addr && remote_addr->family == AF_INET6) { #if defined(CONFIG_NET_IPV6) snprintf(dst, sizeof(dst), - net_sprint_ipv6_addr(&remote_addr->in6_addr)); + net_sprint_ipv6_addr(&net_sin6(remote_addr)-> + sin6_addr)); #else snprintf(dst, sizeof(dst), "?"); #endif @@ -384,7 +385,8 @@ void prepare_register_debug_print(char *dst, char *src, } else if (remote_addr && remote_addr->family == AF_INET) { #if defined(CONFIG_NET_IPV4) snprintf(dst, sizeof(dst), - net_sprint_ipv4_addr(&remote_addr->in_addr)); + net_sprint_ipv4_addr(&net_sin(remote_addr)-> + sin_addr)); #else snprintf(dst, sizeof(dst), "?"); #endif @@ -396,7 +398,8 @@ void prepare_register_debug_print(char *dst, char *src, if (local_addr && local_addr->family == AF_INET6) { #if defined(CONFIG_NET_IPV6) snprintf(src, sizeof(src), - net_sprint_ipv6_addr(&local_addr->in6_addr)); + net_sprint_ipv6_addr(&net_sin6(local_addr)-> + sin6_addr)); #else snprintf(src, sizeof(src), "?"); #endif @@ -404,7 +407,8 @@ void prepare_register_debug_print(char *dst, char *src, } else if (local_addr && local_addr->family == AF_INET) { #if defined(CONFIG_NET_IPV4) snprintf(src, sizeof(src), - net_sprint_ipv4_addr(&local_addr->in_addr)); + net_sprint_ipv4_addr(&net_sin(local_addr)-> + sin_addr)); #else snprintf(src, sizeof(src), "?"); #endif @@ -416,8 +420,8 @@ void prepare_register_debug_print(char *dst, char *src, #endif /* NET_DEBUG */ int net_conn_register(enum ip_protocol proto, - const struct net_addr *remote_addr, - const struct net_addr *local_addr, + const struct sockaddr *remote_addr, + const struct sockaddr *local_addr, uint16_t remote_port, uint16_t local_port, 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; memcpy(&conns[i].remote_addr, remote_addr, - sizeof(struct net_addr)); + sizeof(struct sockaddr)); #if defined(CONFIG_NET_IPV6) if (remote_addr->family == AF_INET6) { if (net_is_ipv6_addr_unspecified( - &remote_addr->in6_addr)) { + &net_sin6(remote_addr)-> + sin6_addr)) { rank |= NET_RANK_REMOTE_UNSPEC_ADDR; } else { rank |= NET_RANK_REMOTE_SPEC_ADDR; @@ -457,7 +462,8 @@ int net_conn_register(enum ip_protocol proto, #if defined(CONFIG_NET_IPV4) 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; } else { 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; memcpy(&conns[i].local_addr, local_addr, - sizeof(struct net_addr)); + sizeof(struct sockaddr)); #if defined(CONFIG_NET_IPV6) if (local_addr->family == AF_INET6) { if (net_is_ipv6_addr_unspecified( - &local_addr->in6_addr)) { + &net_sin6(local_addr)-> + sin6_addr)) { rank |= NET_RANK_LOCAL_UNSPEC_ADDR; } else { rank |= NET_RANK_LOCAL_SPEC_ADDR; @@ -491,7 +498,7 @@ int net_conn_register(enum ip_protocol proto, #if defined(CONFIG_NET_IPV4) 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; } else { rank |= NET_RANK_LOCAL_SPEC_ADDR; @@ -509,15 +516,17 @@ int net_conn_register(enum ip_protocol proto, if (remote_port) { rank |= NET_RANK_REMOTE_PORT; + net_sin(&conns[i].remote_addr)->sin_port = + htons(remote_port); } if (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].remote_port = remote_port; - conns[i].local_port = local_port; conns[i].cb = cb; conns[i].user_data = user_data; conns[i].rank = rank; @@ -535,8 +544,9 @@ int net_conn_register(enum ip_protocol proto, remote_addr, local_addr); - NET_DBG("[%d/%u/0x%02x] remote %p/%s/%u local %p/%s/%u " - "cb %p ud %p", i, proto, rank, + NET_DBG("[%d/%d/%u/0x%02x] remote %p/%s/%u " + "local %p/%s/%u cb %p ud %p", + i, remote_addr->family, proto, rank, remote_addr, dst, remote_port, local_addr, src, local_port, cb, user_data); @@ -553,7 +563,8 @@ int net_conn_register(enum ip_protocol proto, 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) { 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; } - if (!net_is_ipv6_addr_unspecified(&addr->in6_addr)) { - if (!net_ipv6_addr_cmp(&addr->in6_addr, addr6)) { + if (!net_is_ipv6_addr_unspecified( + &net_sin6(addr)->sin6_addr)) { + if (!net_ipv6_addr_cmp(&net_sin6(addr)->sin6_addr, + addr6)) { return false; } } @@ -590,8 +603,9 @@ static bool check_addr(struct net_buf *buf, struct net_addr *addr, addr4 = &NET_IPV4_BUF(buf)->dst; } - if (addr->in_addr.s_addr[0]) { - if (!net_ipv4_addr_cmp(&addr->in_addr, addr4)) { + if (net_sin(addr)->sin_addr.s_addr[0]) { + if (!net_ipv4_addr_cmp(&net_sin(addr)->sin_addr, + addr4)) { return false; } } @@ -649,16 +663,16 @@ enum net_verdict net_conn_input(enum ip_protocol proto, struct net_buf *buf) continue; } - if (conns[i].remote_port) { - if (conns[i].remote_port != - ntohs(NET_CONN_BUF(buf)->src_port)) { + if (net_sin(&conns[i].remote_addr)->sin_port) { + if (net_sin(&conns[i].remote_addr)->sin_port != + NET_CONN_BUF(buf)->src_port) { continue; } } - if (conns[i].local_port) { - if (conns[i].local_port != - ntohs(NET_CONN_BUF(buf)->dst_port)) { + if (net_sin(&conns[i].local_addr)->sin_port) { + if (net_sin(&conns[i].local_addr)->sin_port != + NET_CONN_BUF(buf)->dst_port) { continue; } } @@ -701,7 +715,7 @@ enum net_verdict net_conn_input(enum ip_protocol proto, struct net_buf *buf) conns[best_match].rank); #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) { goto drop; } diff --git a/net/yaip/connection.h b/net/yaip/connection.h index c183e161c8f..58dd245c058 100644 --- a/net/yaip/connection.h +++ b/net/yaip/connection.h @@ -35,6 +35,8 @@ extern "C" { #endif +struct net_conn; + /** * @brief Function that is called by connection subsystem when UDP/TCP * 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 { /** Remote IP address */ - struct net_addr remote_addr; + struct sockaddr remote_addr; /** Local IP address */ - struct net_addr local_addr; - - /** Remote port */ - uint16_t remote_port; - - /** Local port */ - uint16_t local_port; + struct sockaddr local_addr; /** Callback to be called when matching UDP packet is received */ net_conn_cb_t cb; @@ -103,8 +99,8 @@ struct net_conn { * @return Return 0 if the registration succeed, <0 otherwise. */ int net_conn_register(enum ip_protocol proto, - const struct net_addr *remote_addr, - const struct net_addr *local_addr, + const struct sockaddr *remote_addr, + const struct sockaddr *local_addr, uint16_t remote_port, uint16_t local_port, net_conn_cb_t cb, diff --git a/net/yaip/udp.h b/net/yaip/udp.h index 21731833c11..57fdfdfe432 100644 --- a/net/yaip/udp.h +++ b/net/yaip/udp.h @@ -49,8 +49,8 @@ extern "C" { * * @return Return 0 if the registration succeed, <0 otherwise. */ -static inline int net_udp_register(const struct net_addr *remote_addr, - const struct net_addr *local_addr, +static inline int net_udp_register(const struct sockaddr *remote_addr, + const struct sockaddr *local_addr, uint16_t remote_port, uint16_t local_port, net_conn_cb_t cb, diff --git a/tests/net/udp/src/main.c b/tests/net/udp/src/main.c index f12ed3f7e6d..a24d49394f0 100644 --- a/tests/net/udp/src/main.c +++ b/tests/net/udp/src/main.c @@ -131,8 +131,8 @@ NET_DEVICE_INIT(net_udp_test, "net_udp_test", &net_udp_if_api, _ETH_L2_LAYER, 127); struct ud { - const struct net_addr *remote_addr; - const struct net_addr *local_addr; + const struct sockaddr *remote_addr; + const struct sockaddr *local_addr; uint16_t remote_port; uint16_t local_port; char *test; @@ -329,6 +329,31 @@ static bool send_ipv4_udp_msg(struct net_if *iface, 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 *handlers[CONFIG_NET_MAX_CONN]; @@ -338,43 +363,43 @@ void main_fiber(void) int ret, i = 0; bool st; - struct net_addr any_addr6; + struct sockaddr_in6 any_addr6; 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, 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, 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 } } }; - struct net_addr my_addr4; + struct sockaddr_in my_addr4; 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 } } }; - net_ipaddr_copy(&any_addr6.in6_addr, &in6addr_any); - any_addr6.family = AF_INET6; + net_ipaddr_copy(&any_addr6.sin6_addr, &in6addr_any); + any_addr6.sin6_family = AF_INET6; - net_ipaddr_copy(&my_addr6.in6_addr, &in6addr_my); - my_addr6.family = AF_INET6; + net_ipaddr_copy(&my_addr6.sin6_addr, &in6addr_my); + my_addr6.sin6_family = AF_INET6; - net_ipaddr_copy(&peer_addr6.in6_addr, &in6addr_peer); - peer_addr6.family = AF_INET6; + net_ipaddr_copy(&peer_addr6.sin6_addr, &in6addr_peer); + peer_addr6.sin6_family = AF_INET6; - net_ipaddr_copy(&any_addr4.in_addr, &in4addr_any); - any_addr4.family = AF_INET; + net_ipaddr_copy(&any_addr4.sin_addr, &in4addr_any); + any_addr4.sin_family = AF_INET; - net_ipaddr_copy(&my_addr4.in_addr, &in4addr_my); - my_addr4.family = AF_INET; + net_ipaddr_copy(&my_addr4.sin_addr, &in4addr_my); + my_addr4.sin_family = AF_INET; - net_ipaddr_copy(&peer_addr4.in_addr, &in4addr_peer); - peer_addr4.family = AF_INET; + net_ipaddr_copy(&peer_addr4.sin_addr, &in4addr_peer); + peer_addr4.sin_family = AF_INET; nano_sem_init(&recv_lock); @@ -392,17 +417,22 @@ void main_fiber(void) return; } -#define REGISTER(raddr, laddr, rport, lport) \ +#define REGISTER(family, raddr, laddr, rport, lport) \ ({ \ static struct ud user_data; \ \ - user_data.remote_addr = raddr; \ - user_data.local_addr = laddr; \ + user_data.remote_addr = (struct sockaddr *)raddr; \ + user_data.local_addr = (struct sockaddr *)laddr; \ user_data.remote_port = rport; \ user_data.local_port = 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, \ &handlers[i]); \ if (ret) { \ @@ -415,8 +445,10 @@ void main_fiber(void) }) #define REGISTER_FAIL(raddr, laddr, rport, lport) \ - ret = net_udp_register(raddr, laddr, rport, lport, test_fail, \ - INT_TO_POINTER(0), NULL); \ + ret = net_udp_register((struct sockaddr *)raddr, \ + (struct sockaddr *)laddr, \ + rport, lport, \ + test_fail, INT_TO_POINTER(0), NULL); \ if (!ret) { \ printk("UDP register invalid match %s failed\n", \ #raddr"-"#laddr"-"#rport"-"#lport); \ @@ -467,47 +499,47 @@ void main_fiber(void) 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_FAIL(ud, &in6addr_peer, &in6addr_my, 1234, 61400); TEST_IPV6_FAIL(ud, &in6addr_peer, &in6addr_my, 1234, 61400); 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_FAIL(ud, &in4addr_peer, &in4addr_my, 1234, 4325); TEST_IPV4_FAIL(ud, &in4addr_peer, &in4addr_my, 1234, 4325); 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_FAIL(ud, &in6addr_peer, &in6addr_my, 1234, 61400); TEST_IPV6_FAIL(ud, &in6addr_peer, &in6addr_my, 1234, 61400); 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_FAIL(ud, &in6addr_peer, &in6addr_my, 1234, 61400); TEST_IPV6_FAIL(ud, &in6addr_peer, &in6addr_my, 1234, 61400); 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_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_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_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_IPV6_OK(ud, &in6addr_peer, &in6addr_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_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_IPV6_OK(ud, &in6addr_peer, &in6addr_my, 12345, 42421); /* Remote addr same as local addr, these two will never match */ - REGISTER(&my_addr6, NULL, 1234, 4242); - REGISTER(&my_addr4, NULL, 1234, 4242); + REGISTER(AF_INET6, &my_addr6, NULL, 1234, 4242); + REGISTER(AF_INET, &my_addr4, NULL, 1234, 4242); /* IPv4 remote addr and IPv6 remote addr, impossible combination */ REGISTER_FAIL(&my_addr4, &my_addr6, 1234, 4242);