Skip to content

Commit 813ae63

Browse files
committed
net: if: Add userspace support to IPv4 netmask set function
Allow application to call net_if_ipv4_set_netmask_by_index() and set the netmask if enabled by configuration. Signed-off-by: Jukka Rissanen <[email protected]>
1 parent 1018933 commit 813ae63

File tree

3 files changed

+73
-15
lines changed

3 files changed

+73
-15
lines changed

include/net/net_if.h

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1652,21 +1652,19 @@ struct in_addr *net_if_ipv4_get_global_addr(struct net_if *iface,
16521652
* @param iface Interface to use.
16531653
* @param netmask IPv4 netmask
16541654
*/
1655-
static inline void net_if_ipv4_set_netmask(struct net_if *iface,
1656-
const struct in_addr *netmask)
1657-
{
1658-
#if defined(CONFIG_NET_IPV4)
1659-
if (net_if_config_ipv4_get(iface, NULL) < 0) {
1660-
return;
1661-
}
1662-
1663-
if (!iface->config.ip.ipv4) {
1664-
return;
1665-
}
1655+
void net_if_ipv4_set_netmask(struct net_if *iface,
1656+
const struct in_addr *netmask);
16661657

1667-
net_ipaddr_copy(&iface->config.ip.ipv4->netmask, netmask);
1668-
#endif
1669-
}
1658+
/**
1659+
* @brief Set IPv4 netmask for an interface index.
1660+
*
1661+
* @param index Network interface index
1662+
* @param netmask IPv4 netmask
1663+
*
1664+
* @return True if netmask was added, false otherwise.
1665+
*/
1666+
__syscall bool net_if_ipv4_set_netmask_by_index(int index,
1667+
const struct in_addr *netmask);
16701668

16711669
/**
16721670
* @brief Set IPv4 gateway for an interface.

subsys/net/ip/net_if.c

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2597,6 +2597,53 @@ Z_SYSCALL_HANDLER(net_if_ipv4_addr_lookup_by_index, addr)
25972597
}
25982598
#endif
25992599

2600+
void net_if_ipv4_set_netmask(struct net_if *iface,
2601+
const struct in_addr *netmask)
2602+
{
2603+
#if defined(CONFIG_NET_IPV4)
2604+
if (net_if_config_ipv4_get(iface, NULL) < 0) {
2605+
return;
2606+
}
2607+
2608+
if (!iface->config.ip.ipv4) {
2609+
return;
2610+
}
2611+
2612+
net_ipaddr_copy(&iface->config.ip.ipv4->netmask, netmask);
2613+
#endif
2614+
}
2615+
2616+
bool z_impl_net_if_ipv4_set_netmask_by_index(int index,
2617+
const struct in_addr *netmask)
2618+
{
2619+
struct net_if *iface;
2620+
2621+
iface = net_if_get_by_index(index);
2622+
if (!iface) {
2623+
return false;
2624+
}
2625+
2626+
net_if_ipv4_set_netmask(iface, netmask);
2627+
2628+
return true;
2629+
}
2630+
2631+
#ifdef CONFIG_USERSPACE
2632+
Z_SYSCALL_HANDLER(net_if_ipv4_set_netmask_by_index, index, netmask)
2633+
{
2634+
#if defined(CONFIG_NET_IF_USERSPACE_ACCESS)
2635+
struct in_addr netmask_addr;
2636+
2637+
Z_OOPS(z_user_from_copy(&netmask_addr, (void *)netmask,
2638+
sizeof(netmask_addr)));
2639+
2640+
return z_impl_net_if_ipv4_set_netmask_by_index(index, &netmask_addr);
2641+
#else
2642+
return false;
2643+
#endif
2644+
}
2645+
#endif /* CONFIG_USERSPACE */
2646+
26002647
#if defined(CONFIG_NET_IPV4)
26012648
static struct net_if_addr *ipv4_addr_find(struct net_if *iface,
26022649
struct in_addr *addr)

tests/net/iface/src/main.c

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -779,6 +779,17 @@ static void v6_addr_rm_user(void)
779779
}
780780
}
781781

782+
static void netmask_addr_add(void)
783+
{
784+
struct in_addr my_netmask = { { { 255, 255, 255, 0 } } };
785+
bool ret;
786+
787+
if (IS_ENABLED(CONFIG_NET_IF_USERSPACE_ACCESS)) {
788+
ret = net_if_ipv4_set_netmask_by_index(1, &my_netmask);
789+
zassert_true(ret, "Cannot add IPv4 netmask");
790+
}
791+
}
792+
782793
void test_main(void)
783794
{
784795
ztest_test_suite(net_iface_test,
@@ -806,7 +817,9 @@ void test_main(void)
806817
ztest_unit_test(v6_addr_rm),
807818
ztest_user_unit_test(v6_addr_add_user),
808819
ztest_user_unit_test(v6_addr_lookup_user),
809-
ztest_user_unit_test(v6_addr_rm_user)
820+
ztest_user_unit_test(v6_addr_rm_user),
821+
ztest_unit_test(netmask_addr_add),
822+
ztest_user_unit_test(netmask_addr_add)
810823
);
811824

812825
ztest_run_test_suite(net_iface_test);

0 commit comments

Comments
 (0)