30#ifndef ZEPHYR_MODEM_CMUX_
31#define ZEPHYR_MODEM_CMUX_
84#if CONFIG_MODEM_CMUX_MTU > 127
85#define MODEM_CMUX_HEADER_SIZE 7
87#define MODEM_CMUX_HEADER_SIZE 6
92#define MODEM_CMUX_WORK_BUFFER_SIZE (CONFIG_MODEM_CMUX_MTU + MODEM_CMUX_HEADER_SIZE + \
93 CONFIG_MODEM_CMUX_WORK_BUFFER_SIZE_EXTRA)
95enum modem_cmux_state {
96 MODEM_CMUX_STATE_DISCONNECTED = 0,
97 MODEM_CMUX_STATE_CONNECTING,
98 MODEM_CMUX_STATE_CONNECTED,
99 MODEM_CMUX_STATE_ENTER_POWERSAVE,
100 MODEM_CMUX_STATE_POWERSAVE,
101 MODEM_CMUX_STATE_CONFIRM_POWERSAVE,
102 MODEM_CMUX_STATE_WAKEUP,
103 MODEM_CMUX_STATE_DISCONNECTING,
106enum modem_cmux_receive_state {
107 MODEM_CMUX_RECEIVE_STATE_SOF = 0,
108 MODEM_CMUX_RECEIVE_STATE_RESYNC,
109 MODEM_CMUX_RECEIVE_STATE_ADDRESS,
110 MODEM_CMUX_RECEIVE_STATE_ADDRESS_CONT,
111 MODEM_CMUX_RECEIVE_STATE_CONTROL,
112 MODEM_CMUX_RECEIVE_STATE_LENGTH,
113 MODEM_CMUX_RECEIVE_STATE_LENGTH_CONT,
114 MODEM_CMUX_RECEIVE_STATE_DATA,
115 MODEM_CMUX_RECEIVE_STATE_FCS,
116 MODEM_CMUX_RECEIVE_STATE_EOF,
119enum modem_cmux_dlci_state {
120 MODEM_CMUX_DLCI_STATE_CLOSED,
121 MODEM_CMUX_DLCI_STATE_OPENING,
122 MODEM_CMUX_DLCI_STATE_OPEN,
123 MODEM_CMUX_DLCI_STATE_CLOSING,
126struct modem_cmux_dlci {
130 struct modem_pipe pipe;
134 struct modem_cmux *cmux;
137 struct ring_buf receive_rb;
138 struct k_mutex receive_rb_lock;
141 struct k_work_delayable open_work;
142 struct k_work_delayable close_work;
145 enum modem_cmux_dlci_state
state;
148#if CONFIG_MODEM_STATS
149 struct modem_stats_buffer receive_buf_stats;
152 bool flow_control : 1;
157struct modem_cmux_frame {
166struct modem_cmux_work {
167 struct k_work_delayable dwork;
168 struct modem_cmux *cmux;
173 struct modem_pipe *pipe;
179 enum modem_cmux_state
state;
180 bool flow_control_on : 1;
185 struct k_spinlock work_lock;
188 enum modem_cmux_receive_state receive_state;
191 uint8_t work_buf[MODEM_CMUX_WORK_BUFFER_SIZE];
194 struct ring_buf transmit_rb;
195 struct k_mutex transmit_rb_lock;
198 struct modem_cmux_frame frame;
203 struct k_work_delayable receive_work;
204 struct k_work_delayable transmit_work;
205 struct k_work_delayable connect_work;
206 struct k_work_delayable disconnect_work;
207 struct k_work_delayable runtime_pm_work;
210 struct k_event event;
211 k_timepoint_t t3_timepoint;
212 k_timepoint_t idle_timepoint;
215#if CONFIG_MODEM_STATS
216 struct modem_stats_buffer receive_buf_stats;
217 struct modem_stats_buffer transmit_buf_stats;
219 struct modem_cmux_config config;
int modem_cmux_connect(struct modem_cmux *cmux)
Connect CMUX instance.
int modem_cmux_disconnect(struct modem_cmux *cmux)
Close down and disconnect CMUX instance.
int modem_cmux_disconnect_async(struct modem_cmux *cmux)
Close down and disconnect CMUX instance asynchronously.
void(* modem_cmux_callback)(struct modem_cmux *cmux, enum modem_cmux_event event, void *user_data)
Definition cmux.h:53
int modem_cmux_connect_async(struct modem_cmux *cmux)
Connect CMUX instance asynchronously.
modem_cmux_event
Definition cmux.h:48
int modem_cmux_attach(struct modem_cmux *cmux, struct modem_pipe *pipe)
Attach CMUX instance to pipe.
struct modem_pipe * modem_cmux_dlci_init(struct modem_cmux *cmux, struct modem_cmux_dlci *dlci, const struct modem_cmux_dlci_config *config)
Initialize DLCI instance and register it with CMUX instance.
void modem_cmux_init(struct modem_cmux *cmux, const struct modem_cmux_config *config)
Initialize CMUX instance.
void modem_cmux_release(struct modem_cmux *cmux)
Release CMUX instance from pipe.
@ MODEM_CMUX_EVENT_DISCONNECTED
Definition cmux.h:50
@ MODEM_CMUX_EVENT_CONNECTED
Definition cmux.h:49
struct _slist sys_slist_t
Single-linked list structure.
Definition slist.h:49
struct _snode sys_snode_t
Single-linked list node structure.
Definition slist.h:39
state
Definition parser_state.h:29
__UINT8_TYPE__ uint8_t
Definition stdint.h:88
__UINT16_TYPE__ uint16_t
Definition stdint.h:89
Kernel timeout type.
Definition clock.h:65
Contains CMUX instance configuration data.
Definition cmux.h:59
bool enable_runtime_power_management
Enable runtime power management.
Definition cmux.h:73
uint8_t * receive_buf
Receive buffer.
Definition cmux.h:65
modem_cmux_callback callback
Invoked when event occurs.
Definition cmux.h:61
uint16_t receive_buf_size
Size of receive buffer in bytes [127, ...].
Definition cmux.h:67
void * user_data
Free to use pointer passed to event handler when invoked.
Definition cmux.h:63
uint8_t * transmit_buf
Transmit buffer.
Definition cmux.h:69
k_timeout_t idle_timeout
Idle timeout for power save.
Definition cmux.h:77
bool close_pipe_on_power_save
Close pipe on power save.
Definition cmux.h:75
uint16_t transmit_buf_size
Size of transmit buffer in bytes [149, ...].
Definition cmux.h:71
CMUX DLCI configuration.
Definition cmux.h:236
uint8_t dlci_address
DLCI channel address.
Definition cmux.h:238
uint8_t * receive_buf
Receive buffer used by pipe.
Definition cmux.h:240
uint16_t receive_buf_size
Size of receive buffer used by pipe [127, ...].
Definition cmux.h:242