summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Poessinger <christian@poessinger.com>2020-03-07 18:24:27 +0100
committerChristian Poessinger <christian@poessinger.com>2020-03-07 18:24:27 +0100
commite93dfe5517982216759c29c023a563d6db825052 (patch)
tree457ff72780ca9178b0c5159d08f1d76a17e10a08
parentaa0b5251fa2e9c4b652582f747c2df0b34a3f66a (diff)
downloadvyos-1x-e93dfe5517982216759c29c023a563d6db825052.tar.gz
vyos-1x-e93dfe5517982216759c29c023a563d6db825052.zip
vrf: T31: enable vrf support for pppoe interface
-rw-r--r--interface-definitions/interfaces-pppoe.xml.in1
-rwxr-xr-xsrc/conf_mode/interfaces-pppoe.py41
2 files changed, 41 insertions, 1 deletions
diff --git a/interface-definitions/interfaces-pppoe.xml.in b/interface-definitions/interfaces-pppoe.xml.in
index b6b54c915..bbaff5f04 100644
--- a/interface-definitions/interfaces-pppoe.xml.in
+++ b/interface-definitions/interfaces-pppoe.xml.in
@@ -75,6 +75,7 @@
</leafNode>
#include <include/interface-description.xml.i>
#include <include/interface-disable.xml.i>
+ #include <include/interface-vrf.xml.i>
<leafNode name="idle-timeout">
<properties>
<help>Delay before disconnecting idle session (in seconds)</help>
diff --git a/src/conf_mode/interfaces-pppoe.py b/src/conf_mode/interfaces-pppoe.py
index 46a6171c6..cebb07ea9 100755
--- a/src/conf_mode/interfaces-pppoe.py
+++ b/src/conf_mode/interfaces-pppoe.py
@@ -148,6 +148,26 @@ echo 1 > /proc/sys/net/ipv6/conf/{{ intf }}/autoconfigure
{% endif %}
"""
+config_pppoe_ip_pre_up_tmpl = """#!/bin/sh
+
+# As PPPoE is an "on demand" interface we need to re-configure it when it
+# becomes up
+
+if [ "$6" != "pppoe0" ]; then
+ exit
+fi
+
+# add some info to syslog
+DIALER_PID=$(cat /var/run/{{ intf }}.pid)
+logger -t pppd[$DIALER_PID] "executing $0"
+
+{% if vrf -%}
+logger -t pppd[$DIALER_PID] "configuring dialer interface $6 for VRF {{ vrf }}"
+ip link set dev {{ intf }} master {{ vrf }}
+{% endif %}
+
+"""
+
PPP_LOGFILE = '/var/log/vyatta/ppp_{}.log'
default_config_data = {
@@ -169,7 +189,8 @@ default_config_data = {
'name_server': True,
'remote_address': '',
'service_name': '',
- 'source_interface': ''
+ 'source_interface': '',
+ 'vrf': ''
}
def subprocess_cmd(command):
@@ -260,6 +281,10 @@ def get_config():
if conf.exists(['service-name']):
pppoe['service_name'] = conf.return_value(['service-name'])
+ # retrieve VRF instance
+ if conf.exists('vrf'):
+ pppoe['vrf'] = conf.return_value('vrf')
+
return pppoe
def verify(pppoe):
@@ -273,10 +298,15 @@ def verify(pppoe):
if not pppoe['source_interface'] in interfaces():
raise ConfigError('PPPoE source interface does not exist')
+ vrf_name = pppoe['vrf']
+ if vrf_name and vrf_name not in interfaces():
+ raise ConfigError(f'VRF {vrf_name} does not exist')
+
return None
def generate(pppoe):
config_file_pppoe = '/etc/ppp/peers/{}'.format(pppoe['intf'])
+ ip_pre_up_script_file = '/etc/ppp/ip-pre-up.d/9999-vyos-vrf-{}'.format(pppoe['intf'])
ipv6_if_up_script_file = '/etc/ppp/ipv6-up.d/50-vyos-{}-autoconf'.format(pppoe['intf'])
# Always hang-up PPPoE connection prior generating new configuration file
@@ -291,6 +321,9 @@ def generate(pppoe):
if os.path.exists(ipv6_if_up_script_file):
os.unlink(ipv6_if_up_script_file)
+ if os.path.exists(ip_pre_up_script_file):
+ os.unlink(ip_pre_up_script_file)
+
else:
# Create PPP configuration files
tmpl = Template(config_pppoe_tmpl)
@@ -298,6 +331,11 @@ def generate(pppoe):
with open(config_file_pppoe, 'w') as f:
f.write(config_text)
+ tmpl = Template(config_pppoe_ip_pre_up_tmpl)
+ config_text = tmpl.render(pppoe)
+ with open(ip_pre_up_script_file, 'w') as f:
+ f.write(config_text)
+
tmpl = Template(config_pppoe_ipv6_up_tmpl)
config_text = tmpl.render(pppoe)
with open(ipv6_if_up_script_file, 'w') as f:
@@ -305,6 +343,7 @@ def generate(pppoe):
bitmask = S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | \
S_IROTH | S_IXOTH
+ os.chmod(ip_pre_up_script_file, bitmask)
os.chmod(ipv6_if_up_script_file, bitmask)
return None