Revision 7b0ebdd0 nfdhcpd

b/nfdhcpd
55 55
from scapy.layers.dhcp import BOOTP, DHCP
56 56
from scapy.layers.dhcp6 import DHCP6_Reply, DHCP6OptDNSServers, \
57 57
                               DHCP6OptServerId, DHCP6OptClientId, \
58
                               DUID_LLT, DHCP6_InfoRequest
58
                               DUID_LLT, DHCP6_InfoRequest, DHCP6OptDNSDomains
59 59

  
60 60

  
61 61
DEFAULT_CONFIG = "/etc/nfdhcpd/nfdhcpd.conf"
......
96 96
ns_queue = integer(min=0, max=65535)
97 97
dhcp_queue = integer(min=0, max=65535)
98 98
nameservers = ip_addr_list(family=6)
99
domains = force_list(default=None)
99 100
"""
100 101

  
101 102

  
......
356 357
                 rs_queue_num=None, ns_queue_num=None, dhcpv6_queue_num=None,
357 358
                 dhcp_lease_lifetime=DEFAULT_LEASE_LIFETIME,
358 359
                 dhcp_lease_renewal=DEFAULT_LEASE_RENEWAL,
359
                 dhcp_domain='',
360
                 dhcp_domain=None,
360 361
                 dhcp_server_ip=DHCP_DUMMY_SERVER_IP, dhcp_nameservers=None,
361
                 ra_period=DEFAULT_RA_PERIOD, ipv6_nameservers=None):
362
                 ra_period=DEFAULT_RA_PERIOD, ipv6_nameservers=None,
363
                 dhcpv6_domains=None):
362 364

  
363 365
        try:
364 366
            getattr(nfqueue.payload, 'get_physindev')
......
381 383
        else:
382 384
            self.ipv6_nameservers = ipv6_nameservers
383 385

  
386
        if dhcpv6_domains is None:
387
            self.dhcpv6_domains = []
388
        else:
389
            self.dhcpv6_domains = dhcpv6_domains
390

  
384 391
        self.ipv6_enabled = False
385 392

  
386 393
        self.clients = {}
......
745 752
        logging.info(" - Generating DHCPv6 response for host %s (mac %s) on tap %s",
746 753
                      binding.hostname, binding.mac, binding.tap)
747 754

  
755
        if self.dhcpv6_domains:
756
            domains = self.dhcpv6_domains
757
        else:
758
            domains = [binding.hostname.split('.', 1)[-1]]
759

  
760
        # We do this in order not to caclulate optlen ourselves
761
        dnsdomains = str(DHCP6OptDNSDomains(dnsdomains=domains))
762
        dnsservers = str(DHCP6OptDNSServers(dnsservers=self.ipv6_nameservers))
763

  
748 764
        resp = Ether(src=indevmac, dst=binding.mac)/\
749 765
               IPv6(tc=192, src=str(ifll), dst=str(ofll))/\
750 766
               UDP(sport=pkt.dport, dport=pkt.sport)/\
751 767
               DHCP6_Reply(trid=pkt[DHCP6_InfoRequest].trid)/\
752 768
               DHCP6OptClientId(duid=pkt[DHCP6OptClientId].duid)/\
753 769
               DHCP6OptServerId(duid=DUID_LLT(lladdr=indevmac, timeval=time.time()))/\
754
               DHCP6OptDNSServers(dnsservers=self.ipv6_nameservers,
755
                                  optlen=16 * len(self.ipv6_nameservers))
770
               DHCP6OptDNSDomains(dnsdomains)/\
771
               DHCP6OptDNSServers(dnsservers)
756 772

  
757 773
        try:
758 774
            binding.sendp(resp)
......
1186 1202
            "ns_queue_num": config["ipv6"].as_int("ns_queue"),
1187 1203
            "ra_period": config["ipv6"].as_int("ra_period"),
1188 1204
            "ipv6_nameservers": config["ipv6"]["nameservers"],
1205
            "dhcpv6_domains": config["ipv6"]["domains"],
1189 1206
        })
1190 1207

  
1191 1208
    # pylint: disable=W0142

Also available in: Unified diff