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 based on 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 fails if the device under test misbehaves.

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,
        "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: sessions->reconnect (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: none

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: 0 - 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 Range: 0 - 999

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 enabling or disabling 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 enabling or disabling 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

DHCPv6

DHCPv6 over PPPoE is started after an ICMPv6 router advertisement with the managed (M) or other-config (O) flag is received. Per default, only IA_PD is requested, and the IPv6 address of the session is assigned via SLAAC from the router advertisement prefix.

With the access interface option dhcpv6-ia-na enabled, IA_NA is requested in addition. An address received via IA_NA is used as the IPv6 address of the session instead of the SLAAC address, which is required if the router advertisement does not contain a prefix with the autonomous (A) flag.

{
    "interfaces": {
        "access": [
            {
                "interface": "eth1",
                "type": "pppoe",
                "dhcpv6-ia-na": true
            }
        ]
    }
}

The IPv6 address of the session is shown as ipv6-address in the session-info command output.

LCP Vendor Extension

This chapter refers to RFC 2153 PPP vendor extensions.

Per default, all LCP vendor-specific requests will be rejected by sending an 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-info": {
        "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
        }
    }
}