From f2411cc37b8fa5f0fe78107069b77cee761d2e23 Mon Sep 17 00:00:00 2001 From: Dmitry Kozlov Date: Tue, 29 Oct 2013 21:36:16 +0400 Subject: ipoe: introduce 'vlan-name' option. This new option is pattern for naming newly created vlans. Pattern may contain following macros: %I - name of parent interface %N - number of vlan By default vlan-name=%I.%N Signed-off-by: Dmitry Kozlov --- accel-pppd/ctrl/ipoe/ipoe.c | 38 +++++++++++++++++++++++++++++++++++--- 1 file changed, 35 insertions(+), 3 deletions(-) (limited to 'accel-pppd/ctrl') diff --git a/accel-pppd/ctrl/ipoe/ipoe.c b/accel-pppd/ctrl/ipoe/ipoe.c index 5baf3d85..36ba4e36 100644 --- a/accel-pppd/ctrl/ipoe/ipoe.c +++ b/accel-pppd/ctrl/ipoe/ipoe.c @@ -132,6 +132,7 @@ static int conf_verbose; static const char *conf_agent_remote_id; static int conf_proto; static LIST_HEAD(conf_offer_delay); +static const char *conf_vlan_name; static unsigned int stat_starting; static unsigned int stat_active; @@ -1827,6 +1828,32 @@ static int get_offer_delay() return 0; } +static int make_vlan_name(const char *parent, int vid, char *name) +{ + char *ptr1 = name, *endptr = name + IFNAMSIZ - 1; + const char *ptr2 = conf_vlan_name; + char num[5], *ptr3 = num; + + sprintf(num, "%i", vid); + + while (ptr1 < endptr && *ptr2) { + if (ptr2[0] == '%' && ptr2[1] == 'I') { + while (ptr1 < endptr && *parent) + *ptr1++ = *parent++; + ptr2 += 2; + } else if (ptr2[0] == '%' && ptr2[1] == 'N') { + while (ptr1 < endptr && *ptr3) + *ptr1++ = *ptr3++; + ptr2 += 2; + } else + *ptr1++ = *ptr2++; + } + + *ptr1 = 0; + + return ptr1 == endptr; +} + void ipoe_vlan_notify(int ifindex, int vid) { struct conf_sect_t *sect = conf_get_section("ipoe"); @@ -1838,6 +1865,7 @@ void ipoe_vlan_notify(int ifindex, int vid) const char *pcre_err; char *pattern; int pcre_offset; + char ifname[IFNAMSIZ]; if (!sect) return; @@ -1849,12 +1877,12 @@ void ipoe_vlan_notify(int ifindex, int vid) return; } - if (strlen(ifr.ifr_name) + 5 >= sizeof(ifr.ifr_name)) { + if (make_vlan_name(ifr.ifr_name, vid, ifname)) { log_error("ipoe: vlan-mon: %s.%i: interface name is too long\n", ifr.ifr_name, vid); return; } - - sprintf(ifr.ifr_name + strlen(ifr.ifr_name), ".%i", vid); + + strcpy(ifr.ifr_name, ifname); len = strlen(ifr.ifr_name); log_info2("ipoe: create vlan %s\n", ifr.ifr_name); @@ -2838,6 +2866,10 @@ static void load_config(void) conf_offer_timeout = 10; conf_ip_pool = conf_get_opt("ipoe", "ip-pool"); + + conf_vlan_name = conf_get_opt("ipoe", "vlan-name"); + if (!conf_vlan_name) + conf_vlan_name = "%I.%N"; #ifdef RADIUS if (triton_module_loaded("radius")) -- cgit v1.2.3 From 46ecf0e5867ea88cd9ec184b6731efbadf887392 Mon Sep 17 00:00:00 2001 From: Guillaume Nault Date: Mon, 28 Oct 2013 21:37:24 +0100 Subject: l2tp: No iprange check for locally created tunnels There's no need to check for iprange when creating a new tunnel upon administrator's request. Signed-off-by: Guillaume Nault --- accel-pppd/ctrl/l2tp/l2tp.c | 6 ------ 1 file changed, 6 deletions(-) (limited to 'accel-pppd/ctrl') diff --git a/accel-pppd/ctrl/l2tp/l2tp.c b/accel-pppd/ctrl/l2tp/l2tp.c index e14bab85..e018e5b0 100644 --- a/accel-pppd/ctrl/l2tp/l2tp.c +++ b/accel-pppd/ctrl/l2tp/l2tp.c @@ -3786,12 +3786,6 @@ static int l2tp_create_tunnel_exec(const char *cmd, char * const *fields, return CLI_CMD_SYNTAX; } - if (iprange_client_check(peer.sin_addr.s_addr) < 0) { - cli_sendv(client, "peer address %s out of IP range\r\n", - fields[peer_indx]); - return CLI_CMD_INVAL; - } - conn = l2tp_tunnel_alloc(&peer, &host, 3, lns_mode, 0, hide_avps); if (conn == NULL) { cli_send(client, "tunnel allocation failed\r\n"); -- cgit v1.2.3 From f1adc930c84f02ff845dce3013c05bc027a8bda4 Mon Sep 17 00:00:00 2001 From: Guillaume Nault Date: Mon, 28 Oct 2013 21:37:29 +0100 Subject: l2tp: Don't send Assigned Sesssion ID in ICCN The Assigned Session ID AVP should only be sent in ICRQ, ICRP, OCRQ, OCRP and CDN messages. An LNS receiving an ICCN with Assigned Session ID may reject the message because of this unexpected mandatory AVP. Signed-off-by: Guillaume Nault --- accel-pppd/ctrl/l2tp/l2tp.c | 6 ------ 1 file changed, 6 deletions(-) (limited to 'accel-pppd/ctrl') diff --git a/accel-pppd/ctrl/l2tp/l2tp.c b/accel-pppd/ctrl/l2tp/l2tp.c index e018e5b0..3b2e3f2c 100644 --- a/accel-pppd/ctrl/l2tp/l2tp.c +++ b/accel-pppd/ctrl/l2tp/l2tp.c @@ -1822,12 +1822,6 @@ static int l2tp_send_ICCN(struct l2tp_sess_t *sess) return -1; } - if (l2tp_packet_add_int16(pack, Assigned_Session_ID, - sess->sid, 1) < 0) { - log_session(log_error, sess, "impossible to send ICCN:" - " adding data to packet failed\n"); - goto out_err; - } if (l2tp_packet_add_int32(pack, TX_Speed, 1000, 1) < 0) { log_session(log_error, sess, "impossible to send ICCN:" " adding data to packet failed\n"); -- cgit v1.2.3