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 {outer-vlan}:{inner-vlan}",
        "rate-up": 1024,
        "rate-down": 16384
    },
    "session-traffic": {
        "ipv4-pps": 1,
        "ipv6-pps": 1,
        "ipv6pd-pps": 1
    }
}

PPPoE

{ "pppoe": {} }

Attribute

Description

session-time

Max PPPoE session time in seconds.
Default: 0 (infinity)

reconnect

Automatically reconnect sessions if terminated.
Default: false

discovery-timeout

PPPoE discovery (PADI and PADR) timeout in seconds.
Default: 5

discovery-retry

PPPoE discovery (PADI and PADR) max retry.
Default: 10

service-name

PPPoE discovery service name.
Default:

host-uniq

PPPoE discovery host-uniq.
Default: false

max-payload

PPP-Max-Payload (RFC4638).
Default: 0 (disabled)

vlan-priority

VLAN PBIT for all PPPoE/PPP control traffic.
Default: 0

PPP

{ "ppp": {} }

Attribute

Description

mru

Define the maximum receive unit proposed via PPP.
Default: 1492 Range: 1 - 65535

PPP Authentication

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

Attribute

Description

username

password

Password.
Default: test

timeout

Authentication request timeout in seconds.
Default: 5

retry

Authentication request max retry.
Default: 30

protocol

This value can be set to PAP or CHAP to reject
the other protocol.
Default: allow both PAP and CHAP

PPP LCP

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

Attribute

Description

conf-request-timeout

LCP configuration request timeout in seconds.
Default: 5

conf-request-retry

LCP configuration request max retry.
Default: 10

keepalive-interval

LCP echo request interval in seconds (0 means disabled).
Default: 30

keepalive-retry

PPP LCP echo request max retry.
Default: 3

start-delay

PPP LCP initial request delay in milliseconds.
Default: 0

ignore-vendor-specific

Ignore LCP vendor-specific requests.
Default: false

connection-status-message

Accept LCP connection status messages.
Default: false

PPP IPCP (IPv4)

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

Attribute

Description

enable

This option allows to enable or disable the IPCP protocol
Default: true

request-ip

Include IP-Address with 0.0.0.0 in the initial IPCP
configuration request.
Default: true

request-dns1

Request primary DNS server address (option 129).
Default: true

request-dns2

Request secondary DNS server address (option 131).
Default: true

conf-reject-ignore

Ignore configuration reject messages.
Default: false

conf-request-timeout

IPCP configuration request timeout in seconds
Default: 5

conf-request-retry

IPCP configuration request max retry.
Default: 10

PPP IP6CP (IPv6)

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

Attribute

Description

enable

This option allows to enable or disable the IP6CP protocol.
Default: true

conf-request-timeout

IP6CP configuration request timeout in seconds.
Default: 5

conf-request-retry

IP6CP configuration request max retry.
Default: 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 accepting 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
        }
    }
}