summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Kozlov <xeb@mail.ru>2017-08-08 18:39:58 +0300
committerDmitry Kozlov <xeb@mail.ru>2017-08-08 18:39:58 +0300
commit4b7c9dea22afa4ab598b1b6fae2c0d470aa32d9f (patch)
treeee1ad9ef1de38763ccab699fc43804ae27447fc4
parent945a132a7af2862d89fa1fb86c175fe595419eef (diff)
parent685a8b314121dbdde3bdcfe6308497123a878420 (diff)
downloadaccel-ppp-4b7c9dea22afa4ab598b1b6fae2c0d470aa32d9f.tar.gz
accel-ppp-4b7c9dea22afa4ab598b1b6fae2c0d470aa32d9f.zip
Merge branch 'master' of github.com:xebd/accel-ppp
-rw-r--r--accel-pppd/accel-ppp.conf.54
-rw-r--r--accel-pppd/ctrl/pppoe/cli.c38
-rw-r--r--accel-pppd/ctrl/pppoe/pppoe.c75
-rw-r--r--accel-pppd/ctrl/pppoe/pppoe.h3
-rw-r--r--accel-pppd/ppp/lcp_opt_mru.c12
5 files changed, 100 insertions, 32 deletions
diff --git a/accel-pppd/accel-ppp.conf.5 b/accel-pppd/accel-ppp.conf.5
index d49b65fb..bfc5427f 100644
--- a/accel-pppd/accel-ppp.conf.5
+++ b/accel-pppd/accel-ppp.conf.5
@@ -481,6 +481,10 @@ Specifies AC-Name tag value. If absent tag will not be sent.
.BI "service-name=" service-name
Specifies Service-Name to respond. If absent any Service-Name is acceptable and client's Service-Name will be sent back.
.TP
+.BI "accept-any-service=" n
+If service-name specified still will answer with service names, but accepts any service name in PADR request. Useful
+for scenarios, where selection of PPPoE done by client, based on service names in PADO.
+.TP
.BI "pado-delay=" delay[,delay1:count1[,delay2:count2[,...]]]
Specifies delays (also in condition of connection count) to send PADO (ms).
Last delay in list may be -1 which means don't accept new connections.
diff --git a/accel-pppd/ctrl/pppoe/cli.c b/accel-pppd/ctrl/pppoe/cli.c
index c79a5f1e..d8399543 100644
--- a/accel-pppd/ctrl/pppoe/cli.c
+++ b/accel-pppd/ctrl/pppoe/cli.c
@@ -170,9 +170,15 @@ static int show_service_name_exec(const char *cmd, char * const *f, int f_cnt, v
if (f_cnt != 3)
return CLI_CMD_SYNTAX;
- if (conf_service_name)
- cli_sendv(cli, "%s\r\n", conf_service_name);
- else
+ if (conf_service_name[0]) {
+ int i = 0;
+ do {
+ cli_sendv(cli, "%s", conf_service_name[i]);
+ i++;
+ if (conf_service_name[i]) { cli_sendv(cli, ","); }
+ } while(conf_service_name[i]);
+ cli_sendv(cli, "\r\n");
+ } else
cli_sendv(cli, "*\r\n");
return CLI_CMD_OK;
@@ -219,13 +225,27 @@ static int set_service_name_exec(const char *cmd, char * const *f, int f_cnt, vo
if (f_cnt != 4)
return CLI_CMD_SYNTAX;
- if (conf_service_name)
- _free(conf_service_name);
-
+ if (conf_service_name[0]) {
+ int i = 0;
+ do {
+ _free(conf_service_name[i]);
+ i++;
+ } while(conf_service_name[i]);
+ conf_service_name[0] = NULL;
+ }
if (!strcmp(f[3], "*"))
- conf_service_name = NULL;
- else
- conf_service_name = _strdup(f[3]);
+ conf_service_name[0] = NULL;
+ else {
+ char *conf_service_name_string = _strdup(f[3]);
+ char *p = strtok (conf_service_name_string, ",");
+ int i = 0;
+ while (p != NULL && i<255) {
+ conf_service_name[i++] = _strdup(p);
+ p = strtok(NULL, ",");
+ }
+ conf_service_name[i] = NULL;
+ _free(conf_service_name_string);
+ }
return CLI_CMD_OK;
}
diff --git a/accel-pppd/ctrl/pppoe/pppoe.c b/accel-pppd/ctrl/pppoe/pppoe.c
index 60d71276..c5721765 100644
--- a/accel-pppd/ctrl/pppoe/pppoe.c
+++ b/accel-pppd/ctrl/pppoe/pppoe.c
@@ -88,7 +88,8 @@ struct iplink_arg {
};
int conf_verbose;
-char *conf_service_name;
+char *conf_service_name[255];
+int conf_accept_any_service;
char *conf_ac_name;
int conf_ifname_in_sid;
char *conf_pado_delay;
@@ -759,8 +760,13 @@ static void pppoe_send_PADO(struct pppoe_serv_t *serv, const uint8_t *addr, cons
setup_header(pack, serv->hwaddr, addr, CODE_PADO, 0);
add_tag(pack, TAG_AC_NAME, (uint8_t *)conf_ac_name, strlen(conf_ac_name));
- if (conf_service_name)
- add_tag(pack, TAG_SERVICE_NAME, (uint8_t *)conf_service_name, strlen(conf_service_name));
+ if (conf_service_name[0]) {
+ int i = 0;
+ do {
+ add_tag(pack, TAG_SERVICE_NAME, (uint8_t *)conf_service_name[i], strlen(conf_service_name[i]));
+ i++;
+ } while(conf_service_name[i]);
+ }
if (service_name)
add_tag2(pack, service_name);
@@ -940,7 +946,7 @@ static void pppoe_recv_PADI(struct pppoe_serv_t *serv, uint8_t *pack, int size)
struct pppoe_tag *host_uniq_tag = NULL;
struct pppoe_tag *relay_sid_tag = NULL;
struct pppoe_tag *service_name_tag = NULL;
- int len, n, service_match = conf_service_name == NULL;
+ int len, n, service_match = conf_service_name[0] == NULL;
struct delayed_pado_t *pado;
struct timespec ts;
uint16_t ppp_max_payload = 0;
@@ -977,12 +983,16 @@ static void pppoe_recv_PADI(struct pppoe_serv_t *serv, uint8_t *pack, int size)
case TAG_END_OF_LIST:
break;
case TAG_SERVICE_NAME:
- if (conf_service_name) {
- if (ntohs(tag->tag_len) != strlen(conf_service_name))
- break;
- if (memcmp(tag->tag_data, conf_service_name, ntohs(tag->tag_len)))
- break;
- service_match = 1;
+ if (conf_service_name[0]) {
+ int svc_index = 0;
+ do {
+ if (ntohs(tag->tag_len) == strlen(conf_service_name[svc_index]) &&
+ memcmp(tag->tag_data, conf_service_name[svc_index], ntohs(tag->tag_len)) == 0) {
+ service_match = 1;
+ break;
+ }
+ svc_index++;
+ } while(conf_service_name[svc_index]);
} else
service_name_tag = tag;
break;
@@ -1002,7 +1012,7 @@ static void pppoe_recv_PADI(struct pppoe_serv_t *serv, uint8_t *pack, int size)
if (conf_verbose)
print_packet(serv->ifname, "recv", pack);
- if (!service_match) {
+ if (!service_match && !conf_accept_any_service) {
if (conf_verbose)
log_warn("pppoe: discarding PADI packet (Service-Name mismatch)\n");
return;
@@ -1110,12 +1120,16 @@ static void pppoe_recv_PADR(struct pppoe_serv_t *serv, uint8_t *pack, int size)
service_name_tag = tag;
if (tag->tag_len == 0)
service_match = 1;
- else if (conf_service_name) {
- if (ntohs(tag->tag_len) != strlen(conf_service_name))
- break;
- if (memcmp(tag->tag_data, conf_service_name, ntohs(tag->tag_len)))
- break;
- service_match = 1;
+ else if (conf_service_name[0]) {
+ int svc_index = 0;
+ do {
+ if (ntohs(tag->tag_len) == strlen(conf_service_name[svc_index]) &&
+ memcmp(tag->tag_data, conf_service_name[svc_index], ntohs(tag->tag_len)) == 0) {
+ service_match = 1;
+ break;
+ }
+ svc_index++;
+ } while(conf_service_name[svc_index]);
} else {
service_match = 1;
}
@@ -1161,7 +1175,7 @@ static void pppoe_recv_PADR(struct pppoe_serv_t *serv, uint8_t *pack, int size)
return;
}
- if (!service_match) {
+ if (!service_match && !conf_accept_any_service) {
if (conf_verbose)
log_warn("pppoe: Service-Name mismatch\n");
pppoe_send_err(serv, ethhdr->h_source, host_uniq_tag, relay_sid_tag, CODE_PADS, TAG_SERVICE_NAME_ERROR);
@@ -1907,6 +1921,10 @@ static void load_config(void)
if (opt)
conf_verbose = atoi(opt);
+ opt = conf_get_opt("pppoe", "accept-any-service");
+ if (opt)
+ conf_accept_any_service = atoi(opt);
+
opt = conf_get_opt("pppoe", "ac-name");
if (!opt)
opt = conf_get_opt("pppoe", "AC-Name");
@@ -1921,9 +1939,23 @@ static void load_config(void)
if (!opt)
opt = conf_get_opt("pppoe", "Service-Name");
if (opt) {
- if (conf_service_name)
- _free(conf_service_name);
- conf_service_name = _strdup(opt);
+ if (conf_service_name[0]) {
+ int i = 0;
+ do {
+ _free(conf_service_name[i]);
+ i++;
+ } while(conf_service_name[i]);
+ conf_service_name[0] = NULL;
+ }
+ char *conf_service_name_string = _strdup(opt);
+ char *p = strtok (conf_service_name_string, ",");
+ int i = 0;
+ while (p != NULL && i<255) {
+ conf_service_name[i++] = _strdup(p);
+ p = strtok(NULL, ",");
+ }
+ conf_service_name[i] = NULL;
+ _free(conf_service_name_string);
}
opt = conf_get_opt("pppoe", "ifname-in-sid");
@@ -2039,6 +2071,7 @@ static void pppoe_init(void)
conn_pool = mempool_create(sizeof(struct pppoe_conn_t));
pado_pool = mempool_create(sizeof(struct delayed_pado_t));
padi_pool = mempool_create(sizeof(struct padi_t));
+ conf_service_name[0] = NULL;
if (!conf_get_section("pppoe")) {
log_error("pppoe: no configuration, disabled...\n");
diff --git a/accel-pppd/ctrl/pppoe/pppoe.h b/accel-pppd/ctrl/pppoe/pppoe.h
index 75e0eed9..1ea7b07d 100644
--- a/accel-pppd/ctrl/pppoe/pppoe.h
+++ b/accel-pppd/ctrl/pppoe/pppoe.h
@@ -102,7 +102,8 @@ struct pppoe_serv_t
};
extern int conf_verbose;
-extern char *conf_service_name;
+extern char *conf_service_name[255];
+extern int conf_accept_any_service;
extern char *conf_ac_name;
extern char *conf_pado_delay;
diff --git a/accel-pppd/ppp/lcp_opt_mru.c b/accel-pppd/ppp/lcp_opt_mru.c
index 486ade7b..2f321fb6 100644
--- a/accel-pppd/ppp/lcp_opt_mru.c
+++ b/accel-pppd/ppp/lcp_opt_mru.c
@@ -27,6 +27,7 @@ static int mru_send_conf_nak(struct ppp_lcp_t *lcp, struct lcp_option_t *opt, ui
static int mru_recv_conf_req(struct ppp_lcp_t *lcp, struct lcp_option_t *opt, uint8_t *ptr);
static int mru_recv_conf_ack(struct ppp_lcp_t *lcp, struct lcp_option_t *opt, uint8_t *ptr);
static int mru_recv_conf_nak(struct ppp_lcp_t *lcp, struct lcp_option_t *opt, uint8_t *ptr);
+static int mru_recv_conf_rej(struct ppp_lcp_t *lcp, struct lcp_option_t *opt, uint8_t *ptr);
static void mru_print(void (*print)(const char *fmt, ...), struct lcp_option_t*, uint8_t *ptr);
struct mru_option_t
@@ -35,6 +36,7 @@ struct mru_option_t
int mru;
int mtu;
int naked:1;
+ int rejected:1;
};
static struct lcp_option_handler_t mru_opt_hnd=
@@ -45,6 +47,7 @@ static struct lcp_option_handler_t mru_opt_hnd=
.recv_conf_req = mru_recv_conf_req,
.recv_conf_ack = mru_recv_conf_ack,
.recv_conf_nak = mru_recv_conf_nak,
+ .recv_conf_rej = mru_recv_conf_rej,
.free = mru_free,
.print = mru_print,
};
@@ -81,7 +84,7 @@ static int mru_send_conf_req(struct ppp_lcp_t *lcp, struct lcp_option_t *opt, ui
struct mru_option_t *mru_opt = container_of(opt, typeof(*mru_opt), opt);
struct lcp_opt16_t *opt16 = (struct lcp_opt16_t*)ptr;
- if (mru_opt->naked)
+ if (mru_opt->naked || mru_opt->rejected)
return 0;
opt16->hdr.id = CI_MRU;
@@ -141,6 +144,13 @@ static int mru_recv_conf_nak(struct ppp_lcp_t *lcp, struct lcp_option_t *opt, ui
mru_opt->naked = 1;
return 0;
}
+static int mru_recv_conf_rej(struct ppp_lcp_t *lcp, struct lcp_option_t *opt, uint8_t *ptr)
+{
+ struct mru_option_t *mru_opt = container_of(opt, typeof(*mru_opt), opt);
+
+ mru_opt->rejected = 1;
+ return 0;
+}
static void mru_print(void (*print)(const char *fmt, ...), struct lcp_option_t *opt, uint8_t *ptr)
{