// This is an example configuration file for the DHCPv6 server in Kea.
// The purpose of this example is to showcase how clients can be classified.

{ "Dhcp6":

{
// Kea is told to listen on eth0 interface only.
  "interfaces-config": {
    "interfaces": [ "eth0" ]
  },

// Let's use the simplest backend: memfile and use some reasonable values
// for timers. They are of no concern for the classification demonstration.
  "lease-database": {
      "type": "memfile",
      "lfc-interval": 3600
  },
  "renew-timer": 1000,
  "rebind-timer": 2000,
  "preferred-lifetime": 3000,
  "valid-lifetime": 4000,

// This list defines several classes that incoming packets can be assigned to.
// One packet can belong to zero or more classes.
  "client-classes": [

// This class is required by the second subnet and is evaluated only
// if it is required. The test expression returns true.
// Note it is not possible to depend on cable-modems class because it
// is not yet defined.
  {
      "name": "second_subnet",
      "only-if-required": true,
      "test": "member('ALL')",
      "option-data": [{
          "name": "dns-servers",
          "data": "2001:db8::1"
      }]
  },

// Let's classify all incoming RENEW (message type 5) to a separate
// class.
  {
      "name": "renews",
      "test": "pkt6.msgtype == 5"
  },

// Let's pick cable modems. In this simple example we'll assume the device
// is a cable modem if it sends a vendor option with enterprise-id equal
// to 4491.
  {
      "name": "cable-modems",
      "test": "vendor.enterprise == 4491"
  },

// Both a cable modem (by evaluation or host reservation) and has a host
// reservation.
  {
      "name": "cable-modem-hosts",
      "test": "member('cable-modems') and member('KNOWN')"
  }

  ],


// The following list defines subnets. Each subnet consists of at
// least subnet and pool entries.
  "subnet6": [
    {
        "id": 1,
        "pools": [ { "pool": "2001:db8:1::/80" } ],
        "subnet": "2001:db8:1::/64",
        "client-class": "cable-modems",
        "interface": "eth0"
    },
// The following subnet contains a class reservation for a client using
// DUID 01:02:03:04:05:0A:0B:0C:0D:0E. This client will always be assigned
// to this class.
    {
        "id": 2,
        "pools": [ { "pool": "2001:db8:2::/80" } ],
        "subnet": "2001:db8:2::/64",
        "reservations": [
        {
            "duid": "01:02:03:04:05:0A:0B:0C:0D:0E",
            "client-classes": [ "cable-modems" ]
        } ],
        "interface": "eth0",
        "require-client-classes": [ "second_subnet" ]
    },
// The following subnet contains a pool with a class constraint: only
// clients which belong to the class are allowed to use this pool.
    {
        "id": 3,
        "pools": [
           {
               "pool": "2001:db8:4::/80",
               "client-class": "cable-modems"
           } ],
         "subnet": "2001:db8:4::/64",
         "interface": "eth1"
    },
// This subnet is divided in two pools for unknown and known
// (i.e. which have a reservation) clients. The built-in KNOWN and
// UNKNOWN classes are set or not at host reservation lookup (KNOWN if
// this returns something, UNKNOWN if this finds nothing) and client
// classes depending on it are evaluated.
// This happens after subnet selection and before address allocation
// from pools.
    {
        "id": 4,
        "pools": [
            {
               "pool": "2001:db8:8::/64",
               "client-class": "UNKNOWN"
            },
            {
               "pool": "2001:db8:9::/64",
               "client-class": "KNOWN"
           }
        ],
        "subnet": "2001:db8:8::/46",
        "reservations": [
            {  "hw-address": "00:00:00:11:22:33", "hostname": "h1" },
            {  "hw-address": "00:00:00:44:55:66", "hostname": "h4" },
            {  "hw-address": "00:00:00:77:88:99", "hostname": "h7" },
            {  "hw-address": "00:00:00:aa:bb:cc", "hostname": "ha" }
        ]
    }

  ],

// The following configures logging. It assumes that messages with at
// least informational level (info, warn, error and fatal) should be
// logged to stdout.
    "loggers": [
        {
            "name": "kea-dhcp6",
            "output_options": [
                {
                    "output": "stdout"
                }
            ],
            "debuglevel": 0,
            "severity": "INFO"
        }
    ]
}

}
