From fa8ba73833587ebb0133c70ddeb2992a85939128 Mon Sep 17 00:00:00 2001 From: Robert Lubos Date: Wed, 30 Mar 2022 14:16:42 +0200 Subject: [PATCH] net: if: Connect interface with offloaded socket implementation Instead of keeping a boolean informing whether a network interface is offloaded at socket layer or not, keep a pointer to a function which allows to create an offloaded socket. Native interfaces keep this as NULL, while for offloaded interfaces it allows to connect an offloaded socket implementation with an interface. Signed-off-by: Robert Lubos --- drivers/modem/quectel-bg9x.c | 4 ++ drivers/modem/simcom-sim7080.c | 4 ++ drivers/modem/ublox-sara-r4.c | 4 ++ drivers/wifi/eswifi/eswifi.h | 1 + drivers/wifi/eswifi/eswifi_core.c | 2 + drivers/wifi/eswifi/eswifi_socket_offload.c | 2 +- drivers/wifi/simplelink/simplelink.c | 2 + drivers/wifi/simplelink/simplelink_sockets.c | 2 +- drivers/wifi/simplelink/simplelink_support.h | 2 + include/zephyr/net/net_if.h | 51 ++++++++++++++++++-- 10 files changed, 69 insertions(+), 5 deletions(-) diff --git a/drivers/modem/quectel-bg9x.c b/drivers/modem/quectel-bg9x.c index fcae3c6b193..c34ea88c583 100644 --- a/drivers/modem/quectel-bg9x.c +++ b/drivers/modem/quectel-bg9x.c @@ -1066,6 +1066,8 @@ static const struct socket_op_vtable offload_socket_fd_op_vtable = { .setsockopt = NULL, }; +static int offload_socket(int family, int type, int proto); + /* Setup the Modem NET Interface. */ static void modem_net_iface_init(struct net_if *iface) { @@ -1077,6 +1079,8 @@ static void modem_net_iface_init(struct net_if *iface) sizeof(data->mac_addr), NET_LINK_ETHERNET); data->net_iface = iface; + + net_if_socket_offload_set(iface, offload_socket); } static struct net_if_api api_funcs = { diff --git a/drivers/modem/simcom-sim7080.c b/drivers/modem/simcom-sim7080.c index f5637062634..59954bf21bd 100644 --- a/drivers/modem/simcom-sim7080.c +++ b/drivers/modem/simcom-sim7080.c @@ -62,6 +62,8 @@ static inline uint8_t *modem_get_mac(const struct device *dev) return data->mac_addr; } +static int offload_socket(int family, int type, int proto); + /* Setup the Modem NET Interface. */ static void modem_net_iface_init(struct net_if *iface) { @@ -73,6 +75,8 @@ static void modem_net_iface_init(struct net_if *iface) data->netif = iface; socket_offload_dns_register(&offload_dns_ops); + + net_if_socket_offload_set(iface, offload_socket); } /** diff --git a/drivers/modem/ublox-sara-r4.c b/drivers/modem/ublox-sara-r4.c index c62cef4d933..cbe1ddcd9f5 100644 --- a/drivers/modem/ublox-sara-r4.c +++ b/drivers/modem/ublox-sara-r4.c @@ -2097,6 +2097,8 @@ static inline uint8_t *modem_get_mac(const struct device *dev) return data->mac_addr; } +static int offload_socket(int family, int type, int proto); + static void modem_net_iface_init(struct net_if *iface) { const struct device *dev = net_if_get_device(iface); @@ -2111,6 +2113,8 @@ static void modem_net_iface_init(struct net_if *iface) #ifdef CONFIG_DNS_RESOLVER socket_offload_dns_register(&offload_dns_ops); #endif + + net_if_socket_offload_set(iface, offload_socket); } static struct net_if_api api_funcs = { diff --git a/drivers/wifi/eswifi/eswifi.h b/drivers/wifi/eswifi/eswifi.h index b81eb394e43..ebe30a1452c 100644 --- a/drivers/wifi/eswifi/eswifi.h +++ b/drivers/wifi/eswifi/eswifi.h @@ -130,6 +130,7 @@ struct eswifi_dev *eswifi_by_iface_idx(uint8_t iface); int eswifi_at_cmd_rsp(struct eswifi_dev *eswifi, char *cmd, char **rsp); void eswifi_async_msg(struct eswifi_dev *eswifi, char *msg, size_t len); void eswifi_offload_async_msg(struct eswifi_dev *eswifi, char *msg, size_t len); +int eswifi_socket_create(int family, int type, int proto); int eswifi_socket_type_from_zephyr(int proto, enum eswifi_transport_type *type); diff --git a/drivers/wifi/eswifi/eswifi_core.c b/drivers/wifi/eswifi/eswifi_core.c index 42ef3f26562..88041fce472 100644 --- a/drivers/wifi/eswifi/eswifi_core.c +++ b/drivers/wifi/eswifi/eswifi_core.c @@ -411,6 +411,8 @@ static void eswifi_iface_init(struct net_if *iface) eswifi_offload_init(eswifi); #if defined(CONFIG_NET_SOCKETS_OFFLOAD) eswifi_socket_offload_init(eswifi); + + net_if_socket_offload_set(iface, eswifi_socket_create); #endif } diff --git a/drivers/wifi/eswifi/eswifi_socket_offload.c b/drivers/wifi/eswifi/eswifi_socket_offload.c index c3616b76716..0b82801ec97 100644 --- a/drivers/wifi/eswifi/eswifi_socket_offload.c +++ b/drivers/wifi/eswifi/eswifi_socket_offload.c @@ -512,7 +512,7 @@ static bool eswifi_socket_is_supported(int family, int type, int proto) return true; } -static int eswifi_socket_create(int family, int type, int proto) +int eswifi_socket_create(int family, int type, int proto) { int fd = z_reserve_fd(); int sock; diff --git a/drivers/wifi/simplelink/simplelink.c b/drivers/wifi/simplelink/simplelink.c index 07af8653311..23c12f23be9 100644 --- a/drivers/wifi/simplelink/simplelink.c +++ b/drivers/wifi/simplelink/simplelink.c @@ -258,6 +258,8 @@ static void simplelink_iface_init(struct net_if *iface) /* Direct socket offload: */ socket_offload_dns_register(&simplelink_dns_ops); simplelink_sockets_init(); + + net_if_socket_offload_set(iface, simplelink_socket_create); #endif } diff --git a/drivers/wifi/simplelink/simplelink_sockets.c b/drivers/wifi/simplelink/simplelink_sockets.c index 92b6b7c1df9..275f65b06cb 100644 --- a/drivers/wifi/simplelink/simplelink_sockets.c +++ b/drivers/wifi/simplelink/simplelink_sockets.c @@ -1258,7 +1258,7 @@ static bool simplelink_is_supported(int family, int type, int proto) return true; } -static int simplelink_socket_create(int family, int type, int proto) +int simplelink_socket_create(int family, int type, int proto) { int fd = z_reserve_fd(); int sock; diff --git a/drivers/wifi/simplelink/simplelink_support.h b/drivers/wifi/simplelink/simplelink_support.h index 5ec6fd04852..273aeab1ea2 100644 --- a/drivers/wifi/simplelink/simplelink_support.h +++ b/drivers/wifi/simplelink/simplelink_support.h @@ -45,6 +45,8 @@ extern int z_simplelink_init(simplelink_wifi_cb_t wifi_cb); extern int z_simplelink_connect(struct wifi_connect_req_params *params); extern int z_simplelink_disconnect(void); +int simplelink_socket_create(int family, int type, int proto); + #ifdef __cplusplus } #endif diff --git a/include/zephyr/net/net_if.h b/include/zephyr/net/net_if.h index 09a2d696ddc..3994790fd87 100644 --- a/include/zephyr/net/net_if.h +++ b/include/zephyr/net/net_if.h @@ -411,6 +411,14 @@ struct net_traffic_class { k_thread_stack_t *stack; }; +/** + * @typedef net_socket_create_t + + * @brief A function prototype to create an offloaded socket. The prototype is + * compatible with socket() function. + */ +typedef int (*net_socket_create_t)(int, int, int); + /** * @brief Network Interface Device structure * @@ -453,8 +461,10 @@ struct net_if_dev { uint16_t mtu; #if defined(CONFIG_NET_SOCKETS_OFFLOAD) - /** Indicate whether interface is offloaded at socket level. */ - bool offloaded; + /** A function pointer to create an offloaded socket. + * If non-NULL, the interface is considered offloaded at socket level. + */ + net_socket_create_t socket_offload; #endif /* CONFIG_NET_SOCKETS_OFFLOAD */ }; @@ -662,7 +672,7 @@ static inline struct net_offload *net_if_offload(struct net_if *iface) static inline bool net_if_is_socket_offloaded(struct net_if *iface) { #if defined(CONFIG_NET_SOCKETS_OFFLOAD) - return iface->if_dev->offloaded; + return (iface->if_dev->socket_offload != NULL); #else ARG_UNUSED(iface); @@ -670,6 +680,41 @@ static inline bool net_if_is_socket_offloaded(struct net_if *iface) #endif } +/** + * @brief Set the function to create an offloaded socket + * + * @param iface Network interface + * @param socket_offload A function to create an offloaded socket + */ +static inline void net_if_socket_offload_set( + struct net_if *iface, net_socket_create_t socket_offload) +{ +#if defined(CONFIG_NET_SOCKETS_OFFLOAD) + iface->if_dev->socket_offload = socket_offload; +#else + ARG_UNUSED(iface); + ARG_UNUSED(socket_offload); +#endif +} + +/** + * @brief Return the function to create an offloaded socket + * + * @param iface Network interface + * + * @return NULL if the interface is not socket offloaded, valid pointer otherwise + */ +static inline net_socket_create_t net_if_socket_offload(struct net_if *iface) +{ +#if defined(CONFIG_NET_SOCKETS_OFFLOAD) + return iface->if_dev->socket_offload; +#else + ARG_UNUSED(iface); + + return NULL; +#endif +} + /** * @brief Get an network interface's link address *