mirror of
https://github.com/cesanta/mongoose.git
synced 2026-10-09 16:52:09 +07:00
A major cleanup, disentangling net_if and ssl_if. Pulled a lot of common logic into the core and reduced size of net_if implementations. CL: Mongoose net_if and ssl_if refactoring PUBLISHED_FROM=29bd4dcb264a1fd96b3dd164e2d880e1c2c0921e
126 lines
4.4 KiB
C
126 lines
4.4 KiB
C
/*
|
|
* Copyright (c) 2014-2016 Cesanta Software Limited
|
|
* All rights reserved
|
|
*/
|
|
|
|
#ifndef CS_MONGOOSE_SRC_NET_IF_H_
|
|
#define CS_MONGOOSE_SRC_NET_IF_H_
|
|
|
|
#include "common/platform.h"
|
|
|
|
/*
|
|
* Internal async networking core interface.
|
|
* Consists of calls made by the core, which should not block,
|
|
* and callbacks back into the core ("..._cb").
|
|
* Callbacks may (will) cause methods to be invoked from within,
|
|
* but methods are not allowed to invoke callbacks inline.
|
|
*
|
|
* Implementation must ensure that only one callback is invoked at any time.
|
|
*/
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif /* __cplusplus */
|
|
|
|
#define MG_MAIN_IFACE 0
|
|
|
|
struct mg_mgr;
|
|
struct mg_connection;
|
|
union socket_address;
|
|
|
|
struct mg_iface_vtable;
|
|
|
|
struct mg_iface {
|
|
struct mg_mgr *mgr;
|
|
void *data; /* Implementation-specific data */
|
|
const struct mg_iface_vtable *vtable;
|
|
};
|
|
|
|
struct mg_iface_vtable {
|
|
void (*init)(struct mg_iface *iface);
|
|
void (*free)(struct mg_iface *iface);
|
|
void (*add_conn)(struct mg_connection *nc);
|
|
void (*remove_conn)(struct mg_connection *nc);
|
|
time_t (*poll)(struct mg_iface *iface, int timeout_ms);
|
|
|
|
/* Set up a listening TCP socket on a given address. rv = 0 -> ok. */
|
|
int (*listen_tcp)(struct mg_connection *nc, union socket_address *sa);
|
|
/* Request that a "listening" UDP socket be created. */
|
|
int (*listen_udp)(struct mg_connection *nc, union socket_address *sa);
|
|
|
|
/* Request that a TCP connection is made to the specified address. */
|
|
void (*connect_tcp)(struct mg_connection *nc, const union socket_address *sa);
|
|
/* Open a UDP socket. Doesn't actually connect anything. */
|
|
void (*connect_udp)(struct mg_connection *nc);
|
|
|
|
/* Send functions for TCP and UDP. Sent data is copied before return. */
|
|
int (*tcp_send)(struct mg_connection *nc, const void *buf, size_t len);
|
|
int (*udp_send)(struct mg_connection *nc, const void *buf, size_t len);
|
|
|
|
int (*tcp_recv)(struct mg_connection *nc, void *buf, size_t len);
|
|
int (*udp_recv)(struct mg_connection *nc, void *buf, size_t len,
|
|
union socket_address *sa, size_t *sa_len);
|
|
|
|
/* Perform interface-related connection initialization. Return 1 on ok. */
|
|
int (*create_conn)(struct mg_connection *nc);
|
|
/* Perform interface-related cleanup on connection before destruction. */
|
|
void (*destroy_conn)(struct mg_connection *nc);
|
|
|
|
/* Associate a socket to a connection. */
|
|
void (*sock_set)(struct mg_connection *nc, sock_t sock);
|
|
|
|
/* Put connection's address into *sa, local (remote = 0) or remote. */
|
|
void (*get_conn_addr)(struct mg_connection *nc, int remote,
|
|
union socket_address *sa);
|
|
};
|
|
|
|
extern const struct mg_iface_vtable *mg_ifaces[];
|
|
extern int mg_num_ifaces;
|
|
|
|
/* Creates a new interface instance. */
|
|
struct mg_iface *mg_if_create_iface(const struct mg_iface_vtable *vtable,
|
|
struct mg_mgr *mgr);
|
|
|
|
/*
|
|
* Find an interface with a given implementation. The search is started from
|
|
* interface `from`, exclusive. Returns NULL if none is found.
|
|
*/
|
|
struct mg_iface *mg_find_iface(struct mg_mgr *mgr,
|
|
const struct mg_iface_vtable *vtable,
|
|
struct mg_iface *from);
|
|
/*
|
|
* Deliver a new TCP connection. Returns NULL in case on error (unable to
|
|
* create connection, in which case interface state should be discarded.
|
|
* This is phase 1 of the two-phase process - MG_EV_ACCEPT will be delivered
|
|
* when mg_if_accept_tcp_cb is invoked.
|
|
*/
|
|
struct mg_connection *mg_if_accept_new_conn(struct mg_connection *lc);
|
|
void mg_if_accept_tcp_cb(struct mg_connection *nc, union socket_address *sa,
|
|
size_t sa_len);
|
|
|
|
/* Callback invoked by connect methods. err = 0 -> ok, != 0 -> error. */
|
|
void mg_if_connect_cb(struct mg_connection *nc, int err);
|
|
/*
|
|
* Callback that tells the core that data can be received.
|
|
* Core will use tcp/udp_recv to retrieve the data.
|
|
*/
|
|
void mg_if_can_recv_cb(struct mg_connection *nc);
|
|
void mg_if_can_send_cb(struct mg_connection *nc);
|
|
/*
|
|
* Receive callback.
|
|
* buf must be heap-allocated and ownership is transferred to the core.
|
|
*/
|
|
void mg_if_recv_udp_cb(struct mg_connection *nc, void *buf, int len,
|
|
union socket_address *sa, size_t sa_len);
|
|
|
|
/* void mg_if_close_conn(struct mg_connection *nc); */
|
|
|
|
/* Deliver a POLL event to the connection. */
|
|
int mg_if_poll(struct mg_connection *nc, double now);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif /* __cplusplus */
|
|
|
|
#endif /* CS_MONGOOSE_SRC_NET_IF_H_ */
|