summaryrefslogtreecommitdiff
path: root/accel-pppd
diff options
context:
space:
mode:
Diffstat (limited to 'accel-pppd')
-rw-r--r--accel-pppd/CMakeLists.txt1
-rw-r--r--accel-pppd/ctrl/ipoe/ipoe.c10
-rw-r--r--accel-pppd/ctrl/l2tp/l2tp.c12
-rw-r--r--accel-pppd/ctrl/pppoe/pppoe.c25
-rw-r--r--accel-pppd/ctrl/pppoe/pppoe.h2
-rw-r--r--accel-pppd/ctrl/pptp/pptp.c10
-rw-r--r--accel-pppd/include/ap_session.h15
-rw-r--r--accel-pppd/net.c42
8 files changed, 102 insertions, 15 deletions
diff --git a/accel-pppd/CMakeLists.txt b/accel-pppd/CMakeLists.txt
index ab96bc01..314a9f8b 100644
--- a/accel-pppd/CMakeLists.txt
+++ b/accel-pppd/CMakeLists.txt
@@ -55,6 +55,7 @@ ADD_EXECUTABLE(accel-pppd
session.c
session_backup.c
ifcfg.c
+ net.c
backup/backup.c
diff --git a/accel-pppd/ctrl/ipoe/ipoe.c b/accel-pppd/ctrl/ipoe/ipoe.c
index 536fb252..46f1cacd 100644
--- a/accel-pppd/ctrl/ipoe/ipoe.c
+++ b/accel-pppd/ctrl/ipoe/ipoe.c
@@ -196,6 +196,12 @@ static void __ipoe_session_start(struct ipoe_session *ses);
static int ipoe_rad_send_auth_request(struct rad_plugin_t *rad, struct rad_packet_t *pack);
static int ipoe_rad_send_acct_request(struct rad_plugin_t *rad, struct rad_packet_t *pack);
+static void ipoe_ctx_switch(struct triton_context_t *ctx, void *arg)
+{
+ net = &def_net;
+ ipoe_ctx_switch(ctx, arg);
+}
+
static struct ipoe_session *ipoe_session_lookup(struct ipoe_serv *serv, struct dhcpv4_packet *pack, struct ipoe_session **opt82_ses)
{
struct ipoe_session *ses, *res = NULL;
@@ -1873,7 +1879,7 @@ struct ipoe_session *ipoe_session_alloc(void)
ses->ifindex = -1;
- ses->ctx.before_switch = log_switch;
+ ses->ctx.before_switch = ipoe_ctx_switch;
ses->ctx.close = ipoe_session_close;
ses->ctrl.ctx = &ses->ctx;
ses->ctrl.started = ipoe_session_started;
@@ -2575,7 +2581,7 @@ static void add_interface(const char *ifname, int ifindex, const char *opt, int
serv = _malloc(sizeof(*serv));
memset(serv, 0, sizeof(*serv));
serv->ctx.close = ipoe_serv_close;
- serv->ctx.before_switch = log_switch;
+ serv->ctx.before_switch = ipoe_ctx_switch;
pthread_mutex_init(&serv->lock, NULL);
serv->ifname = _strdup(ifname);
serv->ifindex = ifindex;
diff --git a/accel-pppd/ctrl/l2tp/l2tp.c b/accel-pppd/ctrl/l2tp/l2tp.c
index befe0c90..6350e8e3 100644
--- a/accel-pppd/ctrl/l2tp/l2tp.c
+++ b/accel-pppd/ctrl/l2tp/l2tp.c
@@ -253,6 +253,12 @@ static inline int nsnr_cmp(uint16_t ns, uint16_t nr)
return (sub_nsnr != 0 && sub_nsnr < ref) - (sub_nsnr >= ref);
}
+static void l2tp_ctx_switch(struct triton_context_t *ctx, void *arg)
+{
+ net = &def_net;
+ log_switch(ctx, arg);
+}
+
static inline struct l2tp_conn_t *l2tp_tunnel_self(void)
{
return container_of(triton_context_self(), struct l2tp_conn_t, ctx);
@@ -1684,7 +1690,7 @@ static struct l2tp_conn_t *l2tp_tunnel_alloc(const struct sockaddr_in *peer,
conn->state = STATE_INIT;
conn->framing_cap = framing_cap;
- conn->ctx.before_switch = log_switch;
+ conn->ctx.before_switch = l2tp_ctx_switch;
conn->ctx.close = l2tp_conn_close;
conn->hnd.read = l2tp_conn_read;
conn->timeout_timer.expire = l2tp_tunnel_timeout;
@@ -1741,7 +1747,7 @@ static inline int l2tp_tunnel_update_peerport(struct l2tp_conn_t *conn,
static int l2tp_session_start_data_channel(struct l2tp_sess_t *sess)
{
- sess->apses_ctx.before_switch = log_switch;
+ sess->apses_ctx.before_switch = l2tp_ctx_switch;
sess->apses_ctx.close = apses_ctx_stop;
sess->ctrl.ctx = &sess->apses_ctx;
@@ -4436,7 +4442,7 @@ static struct l2tp_serv_t udp_serv =
{
.hnd.read = l2tp_udp_read,
.ctx.close = l2tp_udp_close,
- .ctx.before_switch = log_switch,
+ .ctx.before_switch = l2tp_ctx_switch,
};
/*static struct l2tp_serv_t ip_serv =
diff --git a/accel-pppd/ctrl/pppoe/pppoe.c b/accel-pppd/ctrl/pppoe/pppoe.c
index fc8a0327..a9cbfbe8 100644
--- a/accel-pppd/ctrl/pppoe/pppoe.c
+++ b/accel-pppd/ctrl/pppoe/pppoe.c
@@ -252,6 +252,13 @@ static int pppoe_rad_send_accounting_request(struct rad_plugin_t *rad, struct ra
}
#endif
+static void pppoe_conn_ctx_switch(struct triton_context_t *ctx, void *arg)
+{
+ struct pppoe_conn_t *conn = arg;
+ net = conn->serv->net;
+ log_switch(ctx, &conn->ppp.ses);
+}
+
static struct pppoe_conn_t *allocate_channel(struct pppoe_serv_t *serv, const uint8_t *addr, const struct pppoe_tag *host_uniq, const struct pppoe_tag *relay_sid, const struct pppoe_tag *service_name, const struct pppoe_tag *tr101, const uint8_t *cookie)
{
struct pppoe_conn_t *conn;
@@ -318,7 +325,7 @@ static struct pppoe_conn_t *allocate_channel(struct pppoe_serv_t *serv, const ui
memcpy(conn->cookie, cookie, COOKIE_LENGTH - 4);
- conn->ctx.before_switch = log_switch;
+ conn->ctx.before_switch = pppoe_conn_ctx_switch;
conn->ctx.close = pppoe_conn_close;
conn->ctrl.ctx = &conn->ctx;
conn->ctrl.started = ppp_started;
@@ -386,7 +393,7 @@ static struct pppoe_conn_t *allocate_channel(struct pppoe_serv_t *serv, const ui
if (conf_ip_pool)
conn->ppp.ses.ipv4_pool_name = _strdup(conf_ip_pool);
- triton_context_register(&conn->ctx, &conn->ppp.ses);
+ triton_context_register(&conn->ctx, conn);
pthread_mutex_lock(&serv->lock);
list_add_tail(&conn->entry, &serv->conn_list);
@@ -1301,6 +1308,13 @@ void pppoe_server_start(const char *opt, void *cli)
__pppoe_server_start(opt, opt, cli, 0, 0);
}
+static void pppoe_serv_ctx_switch(struct triton_context_t *ctx, void *arg)
+{
+ struct pppoe_serv_t *serv = arg;
+ net = serv->net;
+ log_switch(ctx, NULL);
+}
+
static void __pppoe_server_start(const char *ifname, const char *opt, void *cli, int parent_ifindex, int vid)
{
struct pppoe_serv_t *serv;
@@ -1380,9 +1394,10 @@ static void __pppoe_server_start(const char *ifname, const char *opt, void *cli,
}
serv->ctx.close = pppoe_serv_close;
- serv->ctx.before_switch = log_switch;
+ serv->ctx.before_switch = pppoe_serv_ctx_switch;
serv->ifname = _strdup(ifname);
serv->ifindex = ifr.ifr_ifindex;
+ serv->net = &def_net;
pthread_mutex_init(&serv->lock, NULL);
INIT_LIST_HEAD(&serv->conn_list);
@@ -1390,7 +1405,7 @@ static void __pppoe_server_start(const char *ifname, const char *opt, void *cli,
INIT_LIST_HEAD(&serv->padi_list);
serv->padi_limit = padi_limit;
- triton_context_register(&serv->ctx, NULL);
+ triton_context_register(&serv->ctx, serv);
if (vid) {
serv->parent_ifindex = parent_ifindex;
@@ -1408,8 +1423,6 @@ static void __pppoe_server_start(const char *ifname, const char *opt, void *cli,
triton_context_wakeup(&serv->ctx);
- pppoe_disc_start(serv);
-
return;
out_err:
diff --git a/accel-pppd/ctrl/pppoe/pppoe.h b/accel-pppd/ctrl/pppoe/pppoe.h
index d044e4cf..c28d96e2 100644
--- a/accel-pppd/ctrl/pppoe/pppoe.h
+++ b/accel-pppd/ctrl/pppoe/pppoe.h
@@ -69,6 +69,8 @@ struct pppoe_serv_t
struct triton_context_t ctx;
struct rb_node node;
+ struct ap_net *net;
+
uint8_t hwaddr[ETH_ALEN];
char *ifname;
int ifindex;
diff --git a/accel-pppd/ctrl/pptp/pptp.c b/accel-pppd/ctrl/pptp/pptp.c
index 94cfd7fd..4a3090e8 100644
--- a/accel-pppd/ctrl/pptp/pptp.c
+++ b/accel-pppd/ctrl/pptp/pptp.c
@@ -73,6 +73,12 @@ static void pptp_timeout(struct triton_timer_t *);
static void ppp_started(struct ap_session *);
static void ppp_finished(struct ap_session *);
+static void pptp_ctx_switch(struct triton_context_t *ctx, void *arg)
+{
+ net = &def_net;
+ pptp_ctx_switch(ctx, arg);
+}
+
static void disconnect(struct pptp_conn_t *conn)
{
log_ppp_debug("pptp: disconnect\n");
@@ -663,7 +669,7 @@ static int pptp_connect(struct triton_md_handler_t *h)
conn->hnd.read = pptp_read;
conn->hnd.write = pptp_write;
conn->ctx.close = pptp_close;
- conn->ctx.before_switch = log_switch;
+ conn->ctx.before_switch = pptp_ctx_switch;
conn->in_buf = _malloc(PPTP_CTRL_SIZE_MAX);
conn->out_buf = _malloc(PPTP_CTRL_SIZE_MAX);
conn->timeout_timer.expire = pptp_timeout;
@@ -714,7 +720,7 @@ static struct pptp_serv_t serv=
{
.hnd.read = pptp_connect,
.ctx.close = pptp_serv_close,
- .ctx.before_switch = log_switch,
+ .ctx.before_switch = pptp_ctx_switch,
};
static int show_stat_exec(const char *cmd, char * const *fields, int fields_cnt, void *client)
diff --git a/accel-pppd/include/ap_session.h b/accel-pppd/include/ap_session.h
index 8bfe4cd8..aea2fa66 100644
--- a/accel-pppd/include/ap_session.h
+++ b/accel-pppd/include/ap_session.h
@@ -36,9 +36,17 @@
struct ap_session;
struct backup_data;
struct rtnl_link_stats;
+struct sockaddr;
+
+struct ap_net {
+ int (*pppox_socket)(int proto);
+ int (*pppox_connect)(int sock, const struct sockaddr *, socklen_t len);
+ int (*ppp_open)();
+ int (*ppp_ioctl)(int fd, unsigned long request, void *arg);
+ int (*sock_ioctl)(unsigned long request, void *arg);
+};
-struct ap_ctrl
-{
+struct ap_ctrl {
struct triton_context_t *ctx;
int type;
const char *name;
@@ -128,6 +136,9 @@ extern int sock6_fd; // internet socket for ioctls
extern int urandom_fd;
extern struct ap_session_stat ap_session_stat;
+extern __thread const struct ap_net *net;
+extern const struct ap_net def_net;
+
void ap_session_init(struct ap_session *ses);
void ap_session_set_ifindex(struct ap_session *ses);
int ap_session_starting(struct ap_session *ses);
diff --git a/accel-pppd/net.c b/accel-pppd/net.c
new file mode 100644
index 00000000..b1db5369
--- /dev/null
+++ b/accel-pppd/net.c
@@ -0,0 +1,42 @@
+#include <fcntl.h>
+#include <sys/socket.h>
+#include <sys/ioctl.h>
+
+#include "triton.h"
+
+#include "ap_session.h"
+
+__export __thread const struct ap_net *net;
+
+static int def_pppox_socket(int proto)
+{
+ return socket(AF_PPPOX, SOCK_STREAM, proto);
+}
+
+static int def_pppox_connect(int sock, const struct sockaddr *addr, socklen_t len)
+{
+ return connect(sock, addr, len);
+}
+
+static int def_ppp_open()
+{
+ return open("/dev/ppp", O_RDWR);
+}
+
+static int def_ppp_ioctl(int fd, unsigned long request, void *arg)
+{
+ return ioctl(fd, request, arg);
+}
+
+static int def_sock_ioctl(unsigned long request, void *arg)
+{
+ return ioctl(sock_fd, request, arg);
+}
+
+const struct ap_net def_net = {
+ .pppox_socket = def_pppox_socket,
+ .pppox_connect = def_pppox_connect,
+ .ppp_open = def_ppp_open,
+ .ppp_ioctl = def_ppp_ioctl,
+ .sock_ioctl = def_sock_ioctl,
+};