You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
160 lines
5.3 KiB
160 lines
5.3 KiB
/** @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 <zephyr/kernel.h> |
|
#include <zephyr/net/net_ip.h> |
|
#include <zephyr/net/socket.h> |
|
|
|
#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_ */
|
|
|