zephyr/subsys/net/l2/ppp/ppp_internal.h
Göran Weinholt 091f630014 net: ppp: ipcp: negotiate DNS servers and optionally use them
We now negotiate DNS servers in the IPCP configuration. This has been
observed to speed up the connection setup. The received DNS servers
are used by the DNS resolver library, but we leave it optional since
the static server list might be preferable.

Increase MAX_IPCP_OPTIONS to 4 so that we can nack all RFC 1877
options.

Signed-off-by: Göran Weinholt <goran.weinholt@endian.se>
2020-03-10 14:09:10 +02:00

168 lines
5.2 KiB
C

/** @file
@brief PPP private header
This is not to be included by the application.
*/
/*
* Copyright (c) 2019 Intel Corporation
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <net/ppp.h>
/**
* FSM flags that control how it operates.
*/
#define FSM_RESTART BIT(0) /**< Treat 2nd OPEN as DOWN followed by UP */
/**
* PPP packet format.
*/
struct ppp_packet {
u8_t code;
u8_t id;
u16_t length;
} __packed;
/** Timeout in milliseconds */
#define PPP_TIMEOUT K_SECONDS(3)
/** Max Terminate-Request transmissions */
#define MAX_TERMINATE_REQ CONFIG_NET_L2_PPP_MAX_TERMINATE_REQ_RETRANSMITS
/** Max Configure-Request transmissions */
#define MAX_CONFIGURE_REQ CONFIG_NET_L2_PPP_MAX_CONFIGURE_REQ_RETRANSMITS
/** Max number of LCP options */
#define MAX_LCP_OPTIONS CONFIG_NET_L2_PPP_MAX_OPTIONS
/** Max number of IPCP options */
#define MAX_IPCP_OPTIONS 4
/** Max number of IPV6CP options */
#define MAX_IPV6CP_OPTIONS 1
/*
* Special alignment is needed for ppp_protocol_handler. This is the
* same issue as in net_if. See net_if.h __net_if_align for explanation.
*/
#define __ppp_proto_align __aligned(32)
/** Protocol handler information. */
struct ppp_protocol_handler {
/** Protocol init function */
void (*init)(struct ppp_context *ctx);
/** Process a received packet */
enum net_verdict (*handler)(struct ppp_context *ctx,
struct net_if *iface,
struct net_pkt *pkt);
/** Lower layer up */
void (*lower_up)(struct ppp_context *ctx);
/** Lower layer down */
void (*lower_down)(struct ppp_context *ctx);
/** Enable this protocol */
void (*open)(struct ppp_context *ctx);
/** Disable this protocol */
void (*close)(struct ppp_context *ctx, const u8_t *reason);
/** PPP protocol number */
u16_t protocol;
} __ppp_proto_align;
#define PPP_PROTO_GET_NAME(proto_name) \
(ppp_protocol_handler_##proto_name)
#define PPP_PROTOCOL_REGISTER(name, proto, init_func, proto_handler, \
proto_lower_up, proto_lower_down, \
proto_open, proto_close) \
static const struct ppp_protocol_handler \
(PPP_PROTO_GET_NAME(name)) __used \
__attribute__((__section__(".net_ppp_proto.data"))) = { \
.protocol = proto, \
.init = init_func, \
.handler = proto_handler, \
.lower_up = proto_lower_up, \
.lower_down = proto_lower_down, \
.open = proto_open, \
.close = proto_close, \
}
extern struct ppp_protocol_handler __net_ppp_proto_start[];
extern struct ppp_protocol_handler __net_ppp_proto_end[];
const char *ppp_phase_str(enum ppp_phase phase);
const char *ppp_state_str(enum ppp_state state);
const char *ppp_proto2str(u16_t proto);
const char *ppp_pkt_type2str(enum ppp_packet_type type);
const char *ppp_option2str(enum ppp_protocol_type protocol, int type);
void ppp_fsm_name_set(struct ppp_fsm *fsm, const char *name);
#if CONFIG_NET_L2_PPP_LOG_LEVEL < LOG_LEVEL_DBG
void ppp_change_phase(struct ppp_context *ctx, enum ppp_phase new_phase);
void ppp_change_state(struct ppp_fsm *fsm, enum ppp_state new_state);
#else
void ppp_change_phase_debug(struct ppp_context *ctx,
enum ppp_phase new_phase,
const char *caller, int line);
#define ppp_change_phase(ctx, state) \
ppp_change_phase_debug(ctx, state, __func__, __LINE__)
#define ppp_change_state(fsm, state) \
ppp_change_state_debug(fsm, state, __func__, __LINE__)
void ppp_change_state_debug(struct ppp_fsm *fsm, enum ppp_state new_state,
const char *caller, int line);
#endif
struct net_buf *ppp_get_net_buf(struct net_buf *root_buf, u8_t len);
int ppp_send_pkt(struct ppp_fsm *fsm, struct net_if *iface,
enum ppp_packet_type type, u8_t id,
void *data, u32_t data_len);
void ppp_send_proto_rej(struct net_if *iface, struct net_pkt *pkt,
u16_t protocol);
void ppp_fsm_init(struct ppp_fsm *fsm, u16_t protocol);
void ppp_fsm_lower_up(struct ppp_fsm *fsm);
void ppp_fsm_lower_down(struct ppp_fsm *fsm);
void ppp_fsm_open(struct ppp_fsm *fsm);
void ppp_fsm_close(struct ppp_fsm *fsm, const u8_t *reason);
void ppp_fsm_proto_reject(struct ppp_fsm *fsm);
enum net_verdict ppp_fsm_input(struct ppp_fsm *fsm, u16_t proto,
struct net_pkt *pkt);
enum net_verdict ppp_fsm_recv_protocol_rej(struct ppp_fsm *fsm,
u8_t id,
struct net_pkt *pkt);
enum net_verdict ppp_fsm_recv_echo_req(struct ppp_fsm *fsm,
u8_t id,
struct net_pkt *pkt);
enum net_verdict ppp_fsm_recv_echo_reply(struct ppp_fsm *fsm,
u8_t id,
struct net_pkt *pkt);
enum net_verdict ppp_fsm_recv_discard_req(struct ppp_fsm *fsm,
u8_t id,
struct net_pkt *pkt);
const struct ppp_protocol_handler *ppp_lcp_get(void);
enum net_verdict ppp_parse_options(struct ppp_fsm *fsm,
struct net_pkt *pkt,
u16_t length,
struct ppp_option_pkt options[],
int options_len);
void ppp_link_established(struct ppp_context *ctx, struct ppp_fsm *fsm);
void ppp_link_terminated(struct ppp_context *ctx);
void ppp_link_down(struct ppp_context *ctx);
void ppp_link_needed(struct ppp_context *ctx);
void ppp_network_up(struct ppp_context *ctx, int proto);
void ppp_network_down(struct ppp_context *ctx, int proto);
void ppp_network_done(struct ppp_context *ctx, int proto);
void ppp_network_all_down(struct ppp_context *ctx);