/** @file * @brief Modem socket header file. * * Generic modem socket and packet size implementation for modem context */ /* * Copyright (c) 2019-2020 Foundries.io * * SPDX-License-Identifier: Apache-2.0 */ #ifndef ZEPHYR_INCLUDE_DRIVERS_MODEM_MODEM_SOCKET_H_ #define ZEPHYR_INCLUDE_DRIVERS_MODEM_MODEM_SOCKET_H_ #include #include #include #include "sockets_internal.h" #ifdef __cplusplus extern "C" { #endif __net_socket struct modem_socket { sa_family_t family; enum net_sock_type type; int ip_proto; struct sockaddr src; struct sockaddr dst; /** The number identifying the socket handle inside the modem */ int id; /** The file descriptor identifying the socket in the fdtable */ int sock_fd; /** packet data */ uint16_t packet_sizes[CONFIG_MODEM_SOCKET_PACKET_COUNT]; uint16_t packet_count; /** data ready semaphore */ struct k_sem sem_data_ready; /** data ready poll signal */ struct k_poll_signal sig_data_ready; /** socket state */ bool is_connected; bool is_waiting; /** temporary socket data */ void *data; }; struct modem_socket_config { struct modem_socket *sockets; size_t sockets_len; /* beginning socket id (modems can set this to 0 or 1 as needed) */ int base_socket_id; /* dynamically assign id when modem socket is allocated */ bool assign_id; struct k_sem sem_lock; const struct socket_op_vtable *vtable; }; /* return size of the first packet */ uint16_t modem_socket_next_packet_size(struct modem_socket_config *cfg, struct modem_socket *sock); int modem_socket_packet_size_update(struct modem_socket_config *cfg, struct modem_socket *sock, int new_total); int modem_socket_get(struct modem_socket_config *cfg, int family, int type, int proto); struct modem_socket *modem_socket_from_fd(struct modem_socket_config *cfg, int sock_fd); struct modem_socket *modem_socket_from_id(struct modem_socket_config *cfg, int id); struct modem_socket *modem_socket_from_newid(struct modem_socket_config *cfg); void modem_socket_put(struct modem_socket_config *cfg, int sock_fd); int modem_socket_poll(struct modem_socket_config *cfg, struct zsock_pollfd *fds, int nfds, int msecs); int modem_socket_poll_update(struct modem_socket *sock, struct zsock_pollfd *pfd, struct k_poll_event **pev); int modem_socket_poll_prepare(struct modem_socket_config *cfg, struct modem_socket *sock, struct zsock_pollfd *pfd, struct k_poll_event **pev, struct k_poll_event *pev_end); void modem_socket_wait_data(struct modem_socket_config *cfg, struct modem_socket *sock); void modem_socket_data_ready(struct modem_socket_config *cfg, struct modem_socket *sock); /** * @brief Initialize modem socket config struct and associated modem sockets * * @param cfg The config to initialize * @param sockets The array of sockets associated with the modem socket config * @param sockets_len The length of the array of sockets associated with the modem socket config * @param base_socket_id The lowest socket id supported by the modem * @param assign_id Dynamically assign modem socket id when allocated using modem_socket_get() * @param vtable Socket API implementation used by this config and associated sockets * * @return -EINVAL if any argument is invalid * @return 0 if successful */ int modem_socket_init(struct modem_socket_config *cfg, struct modem_socket *sockets, size_t sockets_len, int base_socket_id, bool assign_id, const struct socket_op_vtable *vtable); /** * @brief Check if modem socket has been allocated * * @details A modem socket is allocated after a successful invocation of modem_socket_get, and * released after a successful invocation of modem_socket_put. * * @note If socket id is automatically assigned, the socket id will be a value between * base_socket_id and (base_socket_id + socket_len). * Otherwise, the socket id will be assigned to (base_socket_id + socket_len) when allocated. * * @param cfg The modem socket config which the modem socket belongs to * @param sock The modem socket which is checked * * @return true if the socket has been allocated * @return false if the socket has not been allocated */ bool modem_socket_is_allocated(const struct modem_socket_config *cfg, const struct modem_socket *sock); /** * @brief Check if modem socket id has been assigned * * @note An assigned modem socket will have an id between base_socket_id and * (base_socket_id + socket_len). * * @param cfg The modem socket config which the modem socket belongs to * @param sock The modem socket for which the id is checked * * @return true if the socket id is been assigned * @return false if the socket has not been assigned */ bool modem_socket_id_is_assigned(const struct modem_socket_config *cfg, const struct modem_socket *sock); /** * @brief Assign id to modem socket * * @param cfg The modem socket config which the modem socket belongs to * @param sock The modem socket for which the id will be assigned * @param id The id to assign to the modem socket * * @return -EPERM if id has been assigned previously * @return -EINVAL if id is invalid * @return 0 if successful */ int modem_socket_id_assign(const struct modem_socket_config *cfg, struct modem_socket *sock, int id); #ifdef __cplusplus } #endif #endif /* ZEPHYR_INCLUDE_DRIVERS_MODEM_MODEM_SOCKET_H_ */