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 <robert.lubos@nordicsemi.no>
This commit is contained in:
Robert Lubos 2022-03-30 14:16:42 +02:00 committed by Carles Cufí
commit fa8ba73833
10 changed files with 69 additions and 5 deletions

View file

@ -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 = {

View file

@ -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);
}
/**

View file

@ -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 = {

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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