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:
Jukka Rissanen 2016-06-22 16:33:56 +03:00
commit 1932d4c3ec
4 changed files with 121 additions and 79 deletions

View file

@ -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;
}

View file

@ -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,

View file

@ -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,

View file

@ -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);