PPPoE

Emulating PPP over Ethernet (PPPoE) sessions was initial use case of the BNG Blaster supporting 1:1 and N:1 VLAN mode.

The BNG Blaster concept is leaned to the idea of fail-fast. Therefore PPPoE sessions may not be established if not all expected conditions are fulfilled. PPPoE sessions become established only if all enabled network protocols (IPCP and IP6CP) are negotiated successfully. If IPCP is configured to request two DNS servers, it fails if only one is returned.

The BNG Blaster is not optimized for robustness. The opposite is the case, to ensure it failed if the device under test behaves faulty.

Configuration

Following is a basic PPPoE configuration example.

{
    "interfaces": {
        "network": {
            "interface": "eth2",
            "address": "10.0.0.1/24",
            "gateway": "10.0.0.2",
            "address-ipv6": "fc66:1337:7331::1/64",
            "gateway-ipv6": "fc66:1337:7331::2"
        },
        "access": [
            {
                "interface": "eth1",
                "type": "pppoe",
                "outer-vlan-min": 1000,
                "outer-vlan-max": 1999,
                "inner-vlan-min": 1,
                "inner-vlan-max": 4049,
                "authentication-protocol": "PAP"
            },
            {
                "interface": "eth1",
                "type": "pppoe",
                "outer-vlan-min": 2000,
                "outer-vlan-max": 2999,
                "inner-vlan-min": 1,
                "inner-vlan-max": 4049,
                "authentication-protocol": "CHAP"
            }
        ]
    },
    "sessions": {
        "count": 1000,
        "session-time": 0,
        "max-outstanding": 800,
        "start-rate": 400,
        "stop-rate": 400
    },
    "pppoe": {
        "reconnect": true,
        "discovery-timeout": 3,
        "discovery-retry": 10
    },
    "ppp": {
        "mru": 1492,
        "authentication": {
            "username": "user{session-global}@rtbrick.com",
            "password": "test",
            "timeout": 5,
            "retry": 30
        },
        "lcp": {
            "conf-request-timeout": 1,
            "conf-request-retry": 10,
            "keepalive-interval": 30,
            "keepalive-retry": 3
        },
        "ipcp": {
            "enable": true,
            "request-ip": true,
            "request-dns1": true,
            "request-dns2": true,
            "conf-request-timeout": 1,
            "conf-request-retry": 10
        },
        "ip6cp": {
            "enable": true,
            "conf-request-timeout": 1,
            "conf-request-retry": 10
        }
    },
    "dhcpv6": {
        "enable": true,
        "rapid-commit": true
    },
    "access-line": {
        "agent-remote-id": "DEU.RTBRICK.{session-global}",
        "agent-circuit-id": "0.0.0.0/0.0.0.0 eth 0:{session-global}",
        "rate-up": 1024,
        "rate-down": 16384
    },
    "session-traffic": {
        "ipv4-pps": 1,
        "ipv6-pps": 1,
        "ipv6pd-pps": 1
    }
}

PPPoE

{ "pppoe": {} }

Attribute

Description

Default

session-time

Max PPPoE session time in seconds

0 (infinity)

reconnect

Automatically reconnect sessions if terminated

false

discovery-timeout

PPPoE discovery (PADI and PADR) timeout in seconds

5

discovery-retry

PPPoE discovery (PADI and PADR) max retry

10

service-name

PPPoE discovery service name

host-uniq

PPPoE discovery host-uniq

false

vlan-priority

VLAN PBIT for all PPPoE/PPP control traffic

0

PPP

{ "ppp": {} }

Attribute

Description

Default

mru

Define the maximum receive unit proposed via PPP

1492

PPP Authentication

{ "ppp": { "authentication": {} } }

Attribute

Description

Default

username

Username

user{session-global}@rtbrick.com

password

Password

test

timeout

Authentication request timeout in seconds

5

retry

Authentication request max retry

30

protocol

This value can be set to PAP or CHAP to reject the other protocol

allow PAP and CHAP

PPP LCP

{ "ppp": { "lcp": {} } }

Attribute

Description

Default

conf-request-timeout

LCP configuration request timeout in seconds

5

conf-request-retry

LCP configuration request max retry

10

keepalive-interval

LCP echo request interval in seconds (0 means disabled)

30

keepalive-retry

PPP LCP echo request max retry

3

start-delay

PPP LCP initial request delay in milliseconds

0

ignore-vendor-specific

Ignore LCP vendor-specific requests

false

connection-status-message

Accept LCP connection status messages

false

PPP IPCP (IPv4)

{ "ppp": { "ipcp": {} } }

Attribute

Description

Default

enable

This option allows to enable or disable the IPCP protocol

true

request-ip

Include IP-Address with 0.0.0.0 in initial LCP configuration request

true

request-dns1

Request Primary DNS Server Address (option 129)

true

request-dns2

Request Secondary DNS Server Address (option 131)

true

conf-request-timeout

IPCP configuration request timeout in seconds

5

conf-request-retry

IPCP configuration request max retry

10

PPP IP6CP (IPv6)

{ "ppp": { "ip6cp": {} } }

Attribute

Description

Default

enable

This option allows to enable or disable the IP6CP protocol

true

conf-request-timeout

IP6CP configuration request timeout in seconds

5

conf-request-retry

IP6CP configuration request max retry

10

LCP Vendor Extension

This chapter refers to RFC 2153 PPP vendor extensions.

Per default, all LCP vendor-specific requests will be rejected sending a LCP code-reject message. With the LCP option ignore-vendor-specific enabled in the configuration, those messages will be ignored as required to emulate different CPE behaviors.

The LCP option connection-status-message allows to accept LCP vendor requests with any OUI if kind is set to 1 by responding with vendor request of kind 2. The OUI from the request is copied to the response in this case. The value from the request is stored in the session as connection-status-message.

PPPoE Commands

The command session-info session-id <id> provides detailed information for PPPoE sessions.

$ sudo bngblaster-cli run.sock session-info session-id 1 | jq .

{
    "status": "ok",
    "code": 200,
    "session-information": {
        "type": "pppoe",
        "session-id": 1,
        "session-state": "Established",
        "interface": "eth1",
        "outer-vlan": 1000,
        "inner-vlan": 1,
        "mac": "02:00:00:00:00:01",
        "username": "user1@rtbrick.com",
        "agent-circuit-id": "0.0.0.0/0.0.0.0 eth 0:1",
        "agent-remote-id": "DEU.RTBRICK.1",
        "lcp-state": "Opened",
        "ipcp-state": "Opened",
        "ip6cp-state": "Opened",
        "ipv4-address": "10.100.128.0",
        "ipv4-dns1": "10.0.0.3",
        "ipv4-dns2": "10.0.0.4",
        "ipv6-prefix": "fc66:1000:1::/64",
        "ipv6-delegated-prefix": "fc66:2000::/56",
        "ipv6-dns1": "fc66::3",
        "ipv6-dns2": "fc66::4",
        "dhcpv6-state": "Bound",
        "dhcpv6-dns1": "fc66::3",
        "dhcpv6-dns2": "fc66::4",
        "tx-packets": 10036,
        "rx-packets": 10083,
        "rx-fragmented-packets": 0,
        "session-traffic": {
            "total-flows": 6,
            "verified-flows": 6,
            "downstream-ipv4-flow-id": 2,
            "downstream-ipv4-tx-packets": 13,
            "downstream-ipv4-rx-packets": 13,
            "downstream-ipv4-rx-first-seq": 1,
            "downstream-ipv4-loss": 0,
            "downstream-ipv4-wrong-session": 0,
            "upstream-ipv4-flow-id": 1,
            "upstream-ipv4-tx-packets": 13,
            "upstream-ipv4-rx-packets": 13,
            "upstream-ipv4-rx-first-seq": 1,
            "upstream-ipv4-loss": 0,
            "upstream-ipv4-wrong-session": 0,
            "downstream-ipv6-flow-id": 4,
            "downstream-ipv6-tx-packets": 13,
            "downstream-ipv6-rx-packets": 13,
            "downstream-ipv6-rx-first-seq": 1,
            "downstream-ipv6-loss": 0,
            "downstream-ipv6-wrong-session": 0,
            "upstream-ipv6-flow-id": 3,
            "upstream-ipv6-tx-packets": 13,
            "upstream-ipv6-rx-packets": 13,
            "upstream-ipv6-rx-first-seq": 1,
            "upstream-ipv6-loss": 0,
            "upstream-ipv6-wrong-session": 0,
            "downstream-ipv6pd-flow-id": 6,
            "downstream-ipv6pd-tx-packets": 13,
            "downstream-ipv6pd-rx-packets": 13,
            "downstream-ipv6pd-rx-first-seq": 1,
            "downstream-ipv6pd-loss": 0,
            "downstream-ipv6pd-wrong-session": 0,
            "upstream-ipv6pd-flow-id": 5,
            "upstream-ipv6pd-tx-packets": 13,
            "upstream-ipv6pd-rx-packets": 13,
            "upstream-ipv6pd-rx-first-seq": 1,
            "upstream-ipv6pd-loss": 0,
            "upstream-ipv6pd-wrong-session": 0
        }
    }
}