Zephyr Project API 4.4.99
A Scalable Open Source RTOS
Loading...
Searching...
No Matches
ppp.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2022 Trackunit Corporation
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7#include <zephyr/kernel.h>
8#include <zephyr/types.h>
9#include <zephyr/net/net_if.h>
10#include <zephyr/net/net_pkt.h>
11#include <zephyr/net/ppp.h>
13#include <zephyr/sys/atomic.h>
14
15#include <zephyr/modem/pipe.h>
16#include <zephyr/modem/stats.h>
17
18#ifndef ZEPHYR_INCLUDE_MODEM_PPP_H_
19#define ZEPHYR_INCLUDE_MODEM_PPP_H_
20
21#ifdef __cplusplus
22extern "C" {
23#endif
24
33
35typedef void (*modem_ppp_init_iface)(struct net_if *iface);
36
40
41enum modem_ppp_state {
42 /* Pipe is attached */
43 MODEM_PPP_STATE_ATTACHED_BIT = 0,
44 /* Link is dead */
45 MODEM_PPP_STATE_DEAD_BIT,
46};
47
48enum modem_ppp_receive_state {
49 /* Searching for start of frame and header */
50 MODEM_PPP_RECEIVE_STATE_HDR_SOF = 0,
51 MODEM_PPP_RECEIVE_STATE_HDR_FF,
52 MODEM_PPP_RECEIVE_STATE_HDR_FF_UNESCAPE,
53 MODEM_PPP_RECEIVE_STATE_HDR_CTRL_UNESCAPE,
54 MODEM_PPP_RECEIVE_STATE_HDR_CTRL,
55 /* Writing bytes to network packet */
56 MODEM_PPP_RECEIVE_STATE_WRITING,
57 /* Unescaping next byte before writing to network packet */
58 MODEM_PPP_RECEIVE_STATE_UNESCAPING,
59 /* Receiving an unsolicited "NO CARRIER" event */
60 MODEM_PPP_RECEIVE_STATE_UNSOLICITED_NO_CARRIER,
61};
62
63enum modem_ppp_transmit_state {
64 MODEM_PPP_TRANSMIT_STATE_IDLE = 0,
65 MODEM_PPP_TRANSMIT_STATE_SOF,
66 MODEM_PPP_TRANSMIT_STATE_PROTOCOL,
67 MODEM_PPP_TRANSMIT_STATE_DATA,
68 MODEM_PPP_TRANSMIT_STATE_EOF,
69};
70
71struct modem_ppp {
72 /* Network interface instance is bound to */
73 struct net_if *iface;
74
75 /* Hook for PPP L2 network interface initialization */
76 modem_ppp_init_iface init_iface;
77
79
80 /* Buffers used for processing partial frames */
81 uint8_t *receive_buf;
82 uint8_t *transmit_buf;
83 uint16_t buf_size;
84
85 /* Wrapped PPP frames are sent and received through this pipe */
86 struct modem_pipe *pipe;
87
88 /* Receive PPP frame state */
89 enum modem_ppp_receive_state receive_state;
90 uint8_t receive_offset;
91
92 /* Allocated network packet being created */
93 struct net_pkt *rx_pkt;
94
95 /* Packet being sent */
96 enum modem_ppp_transmit_state transmit_state;
97 struct net_pkt *tx_pkt;
98 uint16_t tx_pkt_fcs;
99
100 /* Ring buffer used for transmitting partial PPP frame */
101 struct ring_buf transmit_rb;
102
103 struct k_fifo tx_pkt_fifo;
104
105 /* Work */
106 struct k_work send_work;
107 struct k_work process_work;
108
109#if defined(CONFIG_NET_STATISTICS_PPP)
110 struct net_stats_ppp stats;
111#endif
112
113#if CONFIG_MODEM_STATS
114 struct modem_stats_buffer receive_buf_stats;
115 struct modem_stats_buffer transmit_buf_stats;
116#endif
117};
118
119struct modem_ppp_config {
120 const struct device *dev;
121};
122
126
133int modem_ppp_attach(struct modem_ppp *ppp, struct modem_pipe *pipe);
134
141struct net_if *modem_ppp_get_iface(struct modem_ppp *ppp);
142
148void modem_ppp_release(struct modem_ppp *ppp);
149
153
159int modem_ppp_init_internal(const struct device *dev);
160
164
181#define MODEM_DEV_PPP_DEFINE(_dev, _name, _init_iface, _mtu, _buf_size) \
182 extern const struct ppp_api modem_ppp_ppp_api; \
183 \
184 static uint8_t _CONCAT(_name, _receive_buf)[_buf_size]; \
185 static uint8_t _CONCAT(_name, _transmit_buf)[_buf_size]; \
186 \
187 static struct modem_ppp _name = { \
188 .init_iface = _init_iface, \
189 .receive_buf = _CONCAT(_name, _receive_buf), \
190 .transmit_buf = _CONCAT(_name, _transmit_buf), \
191 .buf_size = _buf_size, \
192 }; \
193 static const struct modem_ppp_config _CONCAT(_name, _config) = { \
194 .dev = _dev, \
195 }; \
196 \
197 NET_DEVICE_INIT(_CONCAT(ppp_net_dev_, _name), "modem_ppp_" #_name, \
198 modem_ppp_init_internal, NULL, &_name, &_CONCAT(_name, _config), \
199 CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, \
200 &modem_ppp_ppp_api, PPP_L2, NET_L2_GET_CTX_TYPE(PPP_L2), _mtu)
201
207#define MODEM_DT_INST_PPP_DEFINE(inst, _name, _init_iface, _mtu, _buf_size) \
208 MODEM_DEV_PPP_DEFINE(DEVICE_DT_INST_GET(inst), _name, _init_iface, _mtu, _buf_size)
209
215#define MODEM_PPP_DEFINE(_name, _init_iface, _mtu, _buf_size) \
216 MODEM_DEV_PPP_DEFINE(NULL, _name, _init_iface, _mtu, _buf_size)
217
221
222#ifdef __cplusplus
223}
224#endif
225
226#endif /* ZEPHYR_INCLUDE_MODEM_PPP_H_ */
long atomic_t
Atomic integer variable.
Definition atomic_types.h:31
int modem_ppp_attach(struct modem_ppp *ppp, struct modem_pipe *pipe)
Attach pipe to instance and connect.
struct net_if * modem_ppp_get_iface(struct modem_ppp *ppp)
Get network interface modem PPP instance is bound to.
void modem_ppp_release(struct modem_ppp *ppp)
Release pipe from instance.
void(* modem_ppp_init_iface)(struct net_if *iface)
L2 network interface init callback.
Definition ppp.h:35
Public kernel APIs.
PPP (Point-to-Point Protocol).
Public API for network interface.
Network packet buffer descriptor API.
state
Definition parser_state.h:29
Header file for the ring buffer API.
__UINT8_TYPE__ uint8_t
Definition stdint.h:88
__UINT16_TYPE__ uint16_t
Definition stdint.h:89
Runtime device structure (in ROM) per driver instance.
Definition device.h:513
Network Interface structure.
Definition net_if.h:764
Header file for the Atomic operations API.