Merge pull request #16709 from leandrolanzieri/pr/net/netif_get_by_name_buf

net/netif: add function to get interface by name from a buffer
This commit is contained in:
Martine Lenders 2021-08-04 19:37:55 +02:00 committed by GitHub
commit 1b0152bd73
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 39 additions and 3 deletions

View File

@ -34,6 +34,7 @@
#define NET_NETIF_H #define NET_NETIF_H
#include <stdint.h> #include <stdint.h>
#include <string.h>
#include "list.h" #include "list.h"
#include "net/netopt.h" #include "net/netopt.h"
@ -113,6 +114,19 @@ int netif_get_name(netif_t *netif, char *name);
*/ */
int16_t netif_get_id(const netif_t *netif); int16_t netif_get_id(const netif_t *netif);
/**
* @brief Gets interface by name, from a buffer
*
* @pre `name != NULL`
*
* @param[in] name The name of an interface as an array of chars. Must not be `NULL`.
* @param[in] name_len Number of characters in @p name.
*
* @return Pointer to the interface that matches the name
* @retval NULL if no interface is named @p name.
*/
netif_t *netif_get_by_name_buffer(const char *name, size_t name_len);
/** /**
* @brief Gets interface by name * @brief Gets interface by name
* *
@ -125,7 +139,10 @@ int16_t netif_get_id(const netif_t *netif);
* @return The interface on success. * @return The interface on success.
* @return NULL if no interface is named @p name. * @return NULL if no interface is named @p name.
*/ */
netif_t *netif_get_by_name(const char *name); static inline netif_t *netif_get_by_name(const char *name)
{
return netif_get_by_name_buffer(name, strlen(name));
}
/** /**
* @brief Gets interface by a numeric identifier. * @brief Gets interface by a numeric identifier.

View File

@ -56,16 +56,22 @@ __attribute__((weak)) int16_t netif_get_id(const netif_t *netif)
return -1; return -1;
} }
netif_t *netif_get_by_name(const char *name) netif_t *netif_get_by_name_buffer(const char *name, size_t name_len)
{ {
assert(name); assert(name);
if (name_len > CONFIG_NETIF_NAMELENMAX) {
return NULL;
}
list_node_t *node = netif_list.next; list_node_t *node = netif_list.next;
char tmp[CONFIG_NETIF_NAMELENMAX]; char tmp[CONFIG_NETIF_NAMELENMAX];
while (node) { while (node) {
netif_get_name((netif_t *)node, tmp); netif_get_name((netif_t *)node, tmp);
if (strncmp(name, tmp, CONFIG_NETIF_NAMELENMAX) == 0) { size_t len = strlen(tmp);
if ((len == name_len) && (strncmp(name, tmp, name_len) == 0)) {
return (netif_t *)node; return (netif_t *)node;
} }
node = node->next; node = node->next;

View File

@ -1308,6 +1308,18 @@ static void test_netif_get_by_name(void)
TEST_ASSERT(netif == netif_get_by_name(name)); TEST_ASSERT(netif == netif_get_by_name(name));
} }
static void test_netif_get_by_name_buffer(void)
{
char name[CONFIG_NETIF_NAMELENMAX] = "6nPRK28";
netif_t *netif = netif_iter(NULL);
TEST_ASSERT(netif_get_by_name_buffer(name, strlen(name)) == NULL);
/* there must be at least one interface */
TEST_ASSERT_NOT_NULL(netif);
TEST_ASSERT(netif_get_name(netif, name) > 0);
TEST_ASSERT(netif == netif_get_by_name_buffer(name, strlen(name)));
}
static void test_netif_get_opt(void) static void test_netif_get_opt(void)
{ {
/* just repeat one of the gnrc_netapi_get tests, just with netif_get_opt */ /* just repeat one of the gnrc_netapi_get tests, just with netif_get_opt */
@ -1758,6 +1770,7 @@ static Test *embunit_tests_gnrc_netif(void)
new_TestFixture(test_netif_iter), new_TestFixture(test_netif_iter),
new_TestFixture(test_netif_get_name), new_TestFixture(test_netif_get_name),
new_TestFixture(test_netif_get_by_name), new_TestFixture(test_netif_get_by_name),
new_TestFixture(test_netif_get_by_name_buffer),
new_TestFixture(test_netif_get_opt), new_TestFixture(test_netif_get_opt),
new_TestFixture(test_netif_set_opt), new_TestFixture(test_netif_set_opt),
/* only add tests not involving output here */ /* only add tests not involving output here */