Bruno automation test cases code upload: new test cases completed: some networking test cases and basic TR069 test cases.

Change-Id: I93e646544792790e0acd70b2c406146b7330ef20
diff --git a/basic_TR69.py b/basic_TR69.py
new file mode 100644
index 0000000..0b9bfae
--- /dev/null
+++ b/basic_TR69.py
@@ -0,0 +1,651 @@
+#!/usr/bin/python
+# Copyright 2012 Google Inc. All Rights Reserved.
+
+"""This class implements some basic TR069 test cases.
+
+   This class extends the TestCase Class.
+   This file implements some basic TR069 test cases to verify Bruno management
+   features. In the following test cases, only those that are defined in
+   'config.cfg' file will be executed.
+
+   Basic TR069 test cases include the following:
+   testID: 11865129  7.6.1 ACS Connection via IPv6
+   testID: 11721375  7.6.10 Verify there is a way to reset to factory default
+                            if user modifies the local configuration
+                            '/etc/init.d/S05factoryreset later'
+   testID: 14319146  7.6.19 Default ACS URL
+   testID: 11721371  7.6.2 ACS URL Pass to Bruno via Moca
+   testID: 14312009  7.6.21 Restrict the ability to locally configure ACS URL
+   testID: 14186028  7.6.22 Security of the link between the DHCPv6 server
+                            and the CPE
+   testID: 14312010  7.6.23 CPE Connection Initiation
+   testID: 14247012  7.6.24.1 Support of Connection Request notification
+                              mechanism
+   testID: 14186029  7.6.24.2 InternetGatewayDevice.ManagementServer.
+                              ConnectionRequestURL
+   testID: 14312011  7.6.24.3 InternetGatewayDevice.ManagementServer.
+                              ConnectionRequestURL format
+   testID: 14293012  7.6.24.4 No data is conveyed in the Connection
+                              Request HTTP Get notification
+   testID: 14165037  7.6.24.5 Restrict the number of Connection Request
+                              notifications
+   testID: 14315010  7.6.24.6 Connection Request Notification does not
+                              terminate current session
+   testID: 14247013  7.6.25.1 MaxEnvelopes
+   testID: 14312012  7.6.25.2 Cookie support (optional)
+   testID: 14293013  7.6.25.4 Authentication
+   testID: 14311008  7.6.26.1 SOAP namespace identifier
+   testID: 14293014  7.6.26.2 SOAP Fault element
+   testID: 14311009  7.6.26.3 SOAP future extensibility
+   testID: 14186030  7.6.27 Fault Handling
+   testID: 14319148  7.6.27.1 SOAP requests respond
+   testID: 14266497  7.6.27.2 Session Termination
+   testID: 14312013  7.6.28 Correctly handle concurrent downloads in catawampus
+   testID: 11874098  7.6.3.1 TLS (1.2)/SSL based Transport for TR-069 on IPv6
+   testID: 14315007  7.6.3.2 Support for encryption algorithms
+   testID: 14247014  7.6.32 Persist TR-069 config across reboots
+   testID: 14293015  7.6.33 Send notification when disk is full
+   testID: 14293016  7.6.34 Support for multiple SSIDs in WLANConfiguration
+   testID: 11865130  7.6.4 TR069-ACS Validation
+   testID: 11722370  7.6.5 TR069-Inform Request
+   testID: 11874103  7.6.7 Digest Authentication
+   testID: 11843139  7.6.8.1 Support of RPCs: REBOOT
+"""
+
+__author__ = 'Lehan Meng (lmeng@google.com)'
+
+
+import os
+import re
+import time
+
+from IPy import IP
+
+import device
+import ssh
+import testCase
+
+
+class BasicTR069Test(testCase.TestCase):
+  """Class for test cases: Bruno basic TR069 features.
+
+  A range of basic TR069 test cases are defined in this Class
+  """
+
+  def Init(self):
+    """Initialize the networking feature tests."""
+    # Get all device information.
+    info = self.log.CreateResultInfo(
+        '---', 'Networking test verification started...')
+    self.log.SendLine(self.test_info, info)
+    self.bruno = device.Bruno(user=self.params['user'],
+                              addr=self.params['addr'],
+                              bruno_prompt=self.params['bruno_prompt'],
+                              addr_ipv6=self.params['addr_ipv6'])
+    self.bruno.SetLogging(self.log)
+    if not self.p_ssh:
+      self.p_ssh = ssh.SSH(user=self.params['user'],
+                           addr=self.params['addr'],
+                           bruno_prompt=self.params['bruno_prompt'],
+                           addr_ipv6=self.params['addr_ipv6'])
+    self.bruno.dev_ssh = self.p_ssh
+    self.p_ssh.SetLogging(self.log)
+
+    self.__delay_5_sec = 5
+    self.__delay_5_min = 300
+    self.__delay_15_min = 900
+    return
+
+  def SshTunnel(self):
+    """Create ssh tunnel for the test."""
+    self.p_ssh.SshRetry(5, 15)
+    return
+
+  def VerifyDuplicatedAddress(self, ip_addr):
+    """Verify device can detect duplicated ipv6 address existing in network.
+
+    Set a duplicated ip address on the device.
+    Verify that the device can detect duplicated ip address
+
+    Args:
+      ip_addr: the duplicated address
+    Returns:
+      True: if duplicated detected
+      False: if duplicated address is not detected
+    """
+    time_stamp = self.bruno.GetTimeStamp()
+    self.bruno.dev_ssh.SendCmd('ip -6 addr add ' + ip_addr + '/64 dev br0')
+    time.sleep(1)
+    self.bruno.dev_ssh.SendCmd('dmesg')
+    log_list = self.bruno.dev_ssh.GetCmdOutput()
+
+    pattern_line = (
+      '\[\d*\.\d{3}\]\s*\w*\d:\s* IPv6 duplicate address\s*('
+      + ip_addr + ')\s*[/\d+]*\s*detected!')
+    self.bruno.dev_ssh.SendCmd('ip -6 addr del ' + ip_addr + '/64 dev br0')
+
+    if self.bruno.FindLineInLog(log_list, time_stamp, pattern_line):
+      info = self.log.CreateResultInfo('Pass', 'Duplicated IPv6 address '
+                                       'detected: ' + ip_addr)
+      self.log.SendLine(self.test_info, info)
+    else:
+      info = self.log.CreateResultInfo('Failed',
+                                       'Duplicated IPv6 address not detected: '
+                                       + ip_addr + '. Verification Failed!')
+      self.log.SendLine(self.test_info, info)
+    #[132344.324] br0: IPv6 duplicate address fe80:... detected!
+
+  def VerifyExpectedVersion(self):
+    """Verify if device is running on expected software version."""
+    if not self.bruno.VerifyCurrentVersion(self.params['expected_version']):
+      info = self.log.CreateErrorInfo('critical',
+                                      'Device software version is not expected!'
+                                      ' Exit!')
+      self.log.SendLine(self.test_info, info)
+      os.sys.exit(1)
+
+  def VerifyACSWithIPv6(self):
+    """Test ID: 11865129 - Verify IPv6 connection to ACS.
+
+    To verify device connects to ACS via IPv6, use tcpdump to capture
+    network packets, filtered with source IPv6 address, and destination
+    IPv6 address of Bruno and ACS.
+
+    tcpdump filter:
+      1. source address: device address
+         destination address: ACS address
+      2. source address: ACS address
+         destination address: device address
+
+    if packets on both directions are found, test succeeds.
+    Otherwise, test failed.
+    """
+    info = self.log.CreateProgressInfo(
+          '10%', 'Verifying current image version, expected: '
+          + self.params['expected_version'])
+    self.log.SendLine(self.test_info, info)
+    self.VerifyExpectedVersion()
+
+    # capture 10 packets on both directions.
+    # capture length: 100 bytes
+    packet_to_catch = '5'
+    bytes_to_catch = '100'
+    interface_to_catch = 'br0'
+    tcpdump_command = ('tcpdump -i ' + interface_to_catch + ' -c '
+                       + packet_to_catch + ' -s ' + bytes_to_catch
+                       + ' \'(((src ' + self.params['addr_ipv6']
+                       + ') and (dst ' + self.params['acs_ipv6']
+                       + ')) or ((src ' + self.params['acs_ipv6']
+                       + ') and (dst ' + self.params['addr_ipv6']
+                       + ')))\'')
+    info = self.log.CreateProgressInfo(
+          '30%', 'Calling tcpdump to capture device traffic to ACS server: '
+          'capturing on interface: ' + interface_to_catch
+          + ' Catch packets: ' + packet_to_catch)
+    self.log.SendLine(self.test_info, info)
+    self.p_ssh.SendCmd(tcpdump_command, 180)
+    info = self.log.CreateProgressInfo(
+          '60%', 'Packets captured. Analyzing...')
+    self.log.SendLine(self.test_info, info)
+    tcpdump_result = self.p_ssh.GetCmdOutput()
+    tcpdump_result.reverse()
+    if self.CheckACSIPv6Connection(tcpdump_result):
+      info = self.log.CreateProgressInfo(
+          '100%', 'TR069 traffic verified: Device connected to ACS via IPv6')
+      self.log.SendLine(self.test_info, info)
+      info = self.log.CreateResultInfo(
+          'Pass', 'TR069 traffic verified: Device connected to ACS via IPv6')
+      self.log.SendLine(self.test_info, info)
+    else:
+      info = self.log.CreateResultInfo(
+          'Failed', 'TR069 traffic verified: No IPv6 connection detected.')
+      self.log.SendLine(self.test_info, info)
+
+  def ParseDumpMsgToPackets(self, tcpdump_result):
+    """Parse tcpdump dump messages information to packets.
+
+    tcpdump result (for example):
+    14:24:36.887936 00:1a:11:30:64:e6 (oui Unknown) > a8:d0:e5:a1:e3:02    L1
+      (oui Unknown), ethertype IPv6 (0x86dd), length 86:                   L2
+    0x0000:  6000 0000 0020 0640 2605 a601 fe00 fd18  `......@&.......     L3
+    0x0010:  021a 11ff fe30 64e6 2001 4860 8005 0000  .....0d...H`....     L4
+    0x0020:  0000 0000 0000 008d e2e8 01bb 73e4 0dc8  ............s...     L5
+    0x0030:  a1bf d109 8011 0429 276b 0000 0101 080a  .......)'k......     L6
+    0x0040:  0389 b875 d29d 2401                      ...u..$.             L7
+    14:24:36.912863 a8:d0:e5:a1:e3:02 (oui Unknown) > 00:1a:11:30:64:e6    L8
+      (oui Unknown), ethertype IPv6 (0x86dd), length 86:                   L9
+    0x0000:  6000 0000 0020 0634 2001 4860 8005 0000  `......4..H`....     L10
+    0x0010:  0000 0000 0000 008d 2605 a601 fe00 fd18  ........&.......     L11
+    0x0020:  021a 11ff fe30 64e6 01bb e2e8 a1bf d109  .....0d.........     L12
+    0x0030:  73e4 0dc9 8011 05a8 6bdc 0000 0101 080a  s.......k.......     L13
+    0x0040:  d29d 763c 0389 b875                      ..v<...u             L14
+
+    This method will parse the dump message to two packets dump:
+    (new packet starts with time stamp: 14:24:36.912863)
+    packet_list[0]: line L1 ~ line L7
+    packet_list[1]: line L8 ~ line L14
+
+    Args:
+      tcpdump_result: raw dump message from tcpdump
+    Returns:
+      packet_list
+    """
+    packet_list = []
+    packet = []
+    for line in tcpdump_result:
+      m = re.search('^\s*\d{2}:\d{2}:\d{2}\.\d+\s*', line)
+      if m:
+        # new packet found:
+        packet = []
+        packet.append(line)
+        index = tcpdump_result.index(line)
+        while index+1 < len(tcpdump_result):
+          packet_line = tcpdump_result[index+1]
+          m = re.search('^\s*\d{2}:\d{2}:\d{2}\.\d+\s*', packet_line)
+          if not m:
+            # not start of next packet
+            packet.append(packet_line)
+            index +=1
+          else:
+            # next packet starts
+            packet_list.append(packet)
+            break
+    return packet_list
+
+  def FindSrcAddrFromTcpdump(self, packet):
+    """Parse source IPv6 address from tcpdump message.
+
+    Args:
+      packet: tcpdump dump message
+    Returns:
+      source address in packet dump message
+    """
+    src_addr = None
+    for line in packet:
+      m = re.search('^\s*0x0000:\s*([\da-f]{4})\s*([\da-f]{4})\s*([\da-f]{4})'
+                    '\s*([\da-f]{4})\s*([\da-f]{4})\s*([\da-f]{4})'
+                    '\s*([\da-f]{4})\s*([\da-f]{4})\s*.*', line)
+      if m:
+        # first line of packet data:
+        src_addr = (m.group(5) + ':' + m.group(6) + ':' + m.group(7)
+                    + ':' + m.group(8)) + ':'
+        index = packet.index(line)
+        m = re.search('^\s*0x0010:\s*([\da-f]{4})\s*([\da-f]{4})\s*([\da-f]{4})'
+                      '\s*([\da-f]{4})\s*([\da-f]{4})\s*([\da-f]{4})'
+                      '\s*([\da-f]{4})\s*([\da-f]{4})\s*.*', packet[index+1])
+        src_addr += (m.group(1) + ':' + m.group(2) + ':' + m.group(3)
+                     + ':' + m.group(4))
+        break
+    return src_addr
+
+  def FindDstAddrFromTcpdump(self, packet):
+    """Parse destination IPv6 address from tcpdump message.
+
+    Args:
+      packet: tcpdump dump message
+    Returns:
+      source address in packet dump message
+    """
+    dst_addr = None
+    for line in packet:
+      m = re.search('^\s*0x0010:\s*([\da-f]{4})\s*([\da-f]{4})\s*([\da-f]{4})'
+                    '\s*([\da-f]{4})\s*([\da-f]{4})\s*([\da-f]{4})'
+                    '\s*([\da-f]{4})\s*([\da-f]{4})\s*.*', line)
+      if m:
+        # first line of packet data:
+        dst_addr = (m.group(5) + ':' + m.group(6) + ':' + m.group(7)
+                    + ':' + m.group(8)) + ':'
+        index = packet.index(line)
+        m = re.search('^\s*0x0020:\s*([\da-f]{4})\s*([\da-f]{4})\s*([\da-f]{4})'
+                      '\s*([\da-f]{4})\s*([\da-f]{4})\s*([\da-f]{4})'
+                      '\s*([\da-f]{4})\s*([\da-f]{4})\s*.*', packet[index+1])
+        dst_addr += (m.group(1) + ':' + m.group(2) + ':' + m.group(3)
+                     + ':' + m.group(4))
+        break
+    return dst_addr
+
+  def CheckACSIPv6Connection(self, tcpdump_result):
+    """Examine captured packets, find IPv6 communication between ACS and device.
+
+    Args:
+      tcpdump_result: tcpdump result: captured packets message dump
+    Returns:
+      True: if bi-directional communication found from packet list.
+      False: otherwise
+    """
+    packet_list = self.ParseDumpMsgToPackets(tcpdump_result)
+    dev_to_acs = False
+    acs_to_dev = False
+    for pacekt in packet_list:
+      src_addr = IP(self.FindSrcAddrFromTcpdump(pacekt))
+      dst_addr = IP(self.FindDstAddrFromTcpdump(pacekt))
+      if (src_addr == IP(self.params['addr_ipv6'])
+          and dst_addr == IP(self.params['acs_ipv6'])):
+        dev_to_acs = True
+      if (dst_addr == IP(self.params['addr_ipv6'])
+          and src_addr == IP(self.params['acs_ipv6'])):
+        acs_to_dev = True
+
+    if dev_to_acs and acs_to_dev:
+      return True
+    else:
+      return False
+
+  def VerifyFactoryReset(self):
+    """Test case: 11721375, Verify the factory reset function of device.
+
+    Verify factory reset according to the following conditions:
+    - version
+    - address
+    - cat /etc/ntpd.conf
+    - cat /etc/resolv.conf
+    - cat /tmp/gvsbhost
+    - ls /tmp/gvsb*
+    - cat /tmp/cwmp/acs_url
+    - ls -l /var/media
+    - ls -l /rw/sage
+
+    This test will need to manually reset the device using reset button.
+    """
+    test_failed = False
+    info = self.log.CreateProgressInfo(
+          '10%', 'Verifying current image version, expected: '
+          + self.params['expected_version'])
+    self.log.SendLine(self.test_info, info)
+    self.VerifyExpectedVersion()
+
+    # get file time information:
+    wiz_bin_date = None
+    self.p_ssh.SendCmd('ls -l /rw/sage')
+    cmd_list = self.p_ssh.GetCmdOutput()
+    for line in cmd_list:
+      if 'Wiz.bin' in line:
+        m = re.search('.*(\d{4}-\d{2}-\d{2}\s*\d+:\d+).*', line)
+        if m:
+          wiz_bin_date = m.group(1)
+
+    info = self.log.CreateProgressInfo(
+          '20%', 'Please reset the device. '
+          'Hold down reset button for 5 seconds...')
+    self.log.SendLine(self.test_info, info)
+
+    info = self.log.CreateProgressInfo(
+          '30%', 'Wait ' + str(self.__delay_5_min)
+          + ' for device to reset and reboot...')
+    self.log.SendLine(self.test_info, info)
+    time.sleep(self.__delay_5_min)
+
+    info = self.log.CreateProgressInfo(
+          '40%', 'Connecting to device...')
+    self.log.SendLine(self.test_info, info)
+    self.SshTunnel()
+
+    addr = self.bruno.GetIPv4Address()
+    if not addr:
+      info = self.log.CreateErrorInfo('critical',
+                                      'Error! No IPv4 address found!')
+      self.log.SendLine(self.test_info, info)
+      test_failed = True
+    else:
+      info = self.log.CreateProgressInfo(
+          '50%', 'Checking device IPv4 address succeed: IPv4: '
+          + addr)
+      self.log.SendLine(self.test_info, info)
+
+    addr_v6 = self.bruno.GetIPv6Address()
+    if not addr_v6:
+      info = self.log.CreateErrorInfo('warning', 'No IPv6 address found!')
+      self.log.SendLine(self.test_info, info)
+    else:
+      info = self.log.CreateProgressInfo(
+          '55%', 'Checking device IPv6 address succeed: IPv6: '
+          + addr_v6[0])
+      self.log.SendLine(self.test_info, info)
+
+    if self.bruno.GetProductClass() == 'GFMS100':
+      # fat bruno, check Wiz.bin file:
+      found_file = False
+      self.p_ssh.SendCmd('ls -l /rw/sage')
+      cmd_list = self.p_ssh.GetCmdOutput()
+      for line in cmd_list:
+        if 'Wiz.bin' in line:
+          found_file = True
+          m = re.search('.*(\d{4}-\d{2}-\d{2}\s*\d+:\d+).*', line)
+          new_date = m.group(1)
+          if new_date == wiz_bin_date:
+            # if file is not updated
+            test_failed = True
+            info = self.log.CreateErrorInfo(
+                'warning', 'Wiz.bin not updated: '
+                'file date before reset: ' + wiz_bin_date
+                + ' new file date: ' + new_date)
+            self.log.SendLine(self.test_info, info)
+          else:
+            info = self.log.CreateProgressInfo(
+                '60%', 'Checking Wiz.bin file succeed: new file created at: '
+                + new_date)
+            self.log.SendLine(self.test_info, info)
+          break
+      if not found_file:
+        test_failed = True
+        info = self.log.CreateErrorInfo(
+            'critical', 'No Wiz.bin file found after reset!')
+        self.log.SendLine(self.test_info, info)
+
+    # verify ntpd.conf
+    ts = self.bruno.GetTimeServer()
+    if not ts:
+      test_failed = True
+      info = self.log.CreateErrorInfo(
+          'critical', 'No time server found in file /etc/ntpd.conf!')
+      self.log.SendLine(self.test_info, info)
+    else:
+      info = self.log.CreateProgressInfo(
+          '65%', 'Checking time server (ntpd.conf) succeed: Timeserver: '
+          + ts)
+      self.log.SendLine(self.test_info, info)
+
+    # verify resolv.conf
+    dns = self.bruno.GetDNSServer()
+    if not dns:
+      test_failed = True
+      info = self.log.CreateErrorInfo(
+          'critical', 'No DNS server found in file /etc/resolv.conf!')
+      self.log.SendLine(self.test_info, info)
+    else:
+      info = self.log.CreateProgressInfo(
+          '70%', 'Checking DNS server (resolv.conf) succeed: DNS: '
+          + dns)
+      self.log.SendLine(self.test_info, info)
+
+    # check gvsb:
+    gvsb = self.bruno.GetGVSBHost().strip()
+    if not gvsb or (gvsb != self.params['gvsb_host']):
+      test_failed = True
+      info = self.log.CreateErrorInfo(
+          'critical', 'GVSB host not found or not matching expected host!')
+      self.log.SendLine(self.test_info, info)
+    else:
+      info = self.log.CreateProgressInfo(
+          '75%', 'Checking GVSB server (gvsbhost) succeed: URL: '
+          + gvsb)
+      self.log.SendLine(self.test_info, info)
+
+    # check gvsb files:
+    self.bruno.dev_ssh.SendCmd('ls /tmp/gvsb*')
+    cmd_list = self.bruno.dev_ssh.GetCmdOutput()
+    gvsb_channel = False
+    gvsb_kick = False
+    gvsb_host = False
+    for line in cmd_list:
+      if 'gvsbhost' in line:
+        gvsb_host = True
+      elif 'gvsbchannel' in line:
+        gvsb_channel = True
+      elif 'gvsbkick' in line:
+        gvsb_kick = True
+    if not gvsb_channel or not gvsb_kick or not gvsb_host:
+      test_failed = True
+      info = self.log.CreateErrorInfo(
+          'critical', 'GVSB files missing! Check /tmp/for gvsb files')
+      self.log.SendLine(self.test_info, info)
+    else:
+      info = self.log.CreateProgressInfo(
+          '80%', 'Checking GVSB files (/tmp/gvsb*) succeed. Files found: '
+          'gvsbhost, gvsbchannel, gvsbkick.')
+      self.log.SendLine(self.test_info, info)
+
+    # verify acs url:
+    if self.bruno.GetACSUrl() != self.params['acs_url']:
+      test_failed = True
+      info = self.log.CreateErrorInfo(
+          'critical', 'ACS URL is not expected! Expected URL: '
+          + self.params['acs_url'])
+      self.log.SendLine(self.test_info, info)
+    else:
+      info = self.log.CreateProgressInfo(
+          '85%', 'Checking ACS URL (/tmp/cwmp/acs_url) succeed. URL: '
+          + self.params['acs_url'])
+      self.log.SendLine(self.test_info, info)
+
+    # verify sage properties
+    self.bruno.dev_ssh.SendCmd('ls -l /rw/sage')
+    cmd_list = self.bruno.dev_ssh.GetCmdOutput()
+    sage_prop = False
+    sage_prop_backup = False
+    for line in cmd_list:
+      if 'Sage.properties.autobackup' in line:
+        sage_prop_backup = True
+      elif 'Sage.properties' in line:
+        sage_prop = True
+    if not sage_prop or not sage_prop_backup:
+      test_failed = True
+      info = self.log.CreateErrorInfo(
+          'critical', 'Missing file in /rw/sage folder.')
+      self.log.SendLine(self.test_info, info)
+    else:
+      info = self.log.CreateProgressInfo(
+          '90%', 'Checking sage properties files (/rw/sage/) succeed.')
+      self.log.SendLine(self.test_info, info)
+
+    if test_failed:
+      info = self.log.CreateResultInfo(
+          'Failed', 'Device configuration not '
+          'restored completely after factory reset!')
+      self.log.SendLine(self.test_info, info)
+    else:
+      info = self.log.CreateResultInfo(
+          'Pass', 'Device configuration '
+          'successfully restored after factory reset.')
+      self.log.SendLine(self.test_info, info)
+      info = self.log.CreateProgressInfo(
+          '100%', 'Device configuration '
+          'successfully restored after factory reset.')
+      self.log.SendLine(self.test_info, info)
+
+  def VerifyDefaultACSURL(self):
+    """Test case: 14319146. This method verifies default ACS URL on device."""
+    # this test needs to disable the Ethernet port, therefore can not
+    # be automated via ssh tunnel
+    print 'pass this test case'
+
+  def Run(self):
+    """Run the test case."""
+    ####### Add your code here -- BEGIN #######
+    print 'Test Started...'
+
+    self.Init()
+    time.sleep(2)  # time delay between commands issued to Device
+    self.SshTunnel()
+    info = self.log.CreateProgressInfo(
+        '5%', 'SSH session to device successfully established!')
+    self.log.SendLine(self.test_info, info)
+
+    if self.test_info['testID'] == '11865129':
+      self.VerifyACSWithIPv6()
+    elif self.test_info['testID'] == '11721375':
+      self.VerifyFactoryReset()
+    elif self.test_info['testID'] == '14319146':
+      self.VerifyDefaultACSURL()
+    elif self.test_info['testID'] == '11721371':
+      print 'run test'
+    elif self.test_info['testID'] == '14312009':
+      print 'run test'
+    elif self.test_info['testID'] == '14186028':
+      print 'run test'
+    elif self.test_info['testID'] == '14312010':
+      print 'run test'
+    elif self.test_info['testID'] == '14247012':
+      print 'run test'
+    elif self.test_info['testID'] == '14186029':
+      print 'run test'
+    elif self.test_info['testID'] == '14312011':
+      print 'run test'
+    elif self.test_info['testID'] == '14293012':
+      print 'run test'
+    elif self.test_info['testID'] == '14165037':
+      print 'run test'
+    elif self.test_info['testID'] == '14315010':
+      print 'run test'
+    elif self.test_info['testID'] == '14247013':
+      print 'run test'
+    elif self.test_info['testID'] == '14312012':
+      print 'run test'
+    elif self.test_info['testID'] == '14293013':
+      print 'run test'
+    elif self.test_info['testID'] == '14311008':
+      print 'run test'
+    elif self.test_info['testID'] == '14293014':
+      print 'run test'
+    elif self.test_info['testID'] == '14311009':
+      print 'run test'
+    elif self.test_info['testID'] == '14186030':
+      print 'run test'
+    elif self.test_info['testID'] == '14319148':
+      print 'run test'
+    elif self.test_info['testID'] == '14266497':
+      print 'run test'
+    elif self.test_info['testID'] == '14312013':
+      print 'run test'
+    elif self.test_info['testID'] == '11874098':
+      print 'run test'
+    elif self.test_info['testID'] == '14315007':
+      print 'run test'
+    elif self.test_info['testID'] == '14247014':
+      print 'run test'
+    elif self.test_info['testID'] == '14293015':
+      print 'run test'
+    elif self.test_info['testID'] == '14293016':
+      print 'run test'
+    elif self.test_info['testID'] == '11865130':
+      print 'run test'
+    elif self.test_info['testID'] == '11722370':
+      print 'run test'
+    elif self.test_info['testID'] == '11874103':
+      print 'run test'
+    elif self.test_info['testID'] == '11843139':
+      print 'run test'
+    else:
+      print 'do nothing...'
+
+    print 'Test Completed...'
+    ####### Add your code here -- END   #######
+
+  def Destructor(self):
+    """This is the destructor function to call for the user extened class."""
+    self.p_ssh.close()
+
+if __name__ == '__main__':
+  # Test cases defined in this file:
+  test_defined = ['11865129', '11721375', '14319146', '11721371',
+                  '14312009', '14186028', '14312010', '14247012', '14186029',
+                  '14312011', '14293012', '14165037', '14315010', '14247013',
+                  '14312012', '14293013', '14311008', '14293014', '14311009',
+                  '14186030', '14319148', '14266497', '14312013', '11874098',
+                  '14315007', '14247014', '14293015', '14293016', '11865130',
+                  '11722370', '11874103', '11843139']
+  # To execute test cases that defined in config file:
+  test_to_execute = testCase.TestCase.FindTestCaseToExecute('config.cfg')
+  for test_id in test_to_execute:
+    if test_id in test_defined:
+      test = BasicTR069Test(testID=test_id)
diff --git a/basic_network_testcases.py b/basic_network_testcases.py
new file mode 100644
index 0000000..2979227
--- /dev/null
+++ b/basic_network_testcases.py
@@ -0,0 +1,230 @@
+#!/usr/bin/python
+# Copyright 2012 Google Inc. All Rights Reserved.
+
+"""This class implements some basic networking test cases.
+
+   This class extends the TestCase Class.
+   This file implements some test cases to verify Bruno basic networking
+   features. In the following test cases, only those that are defined in
+   'config.cfg' file will be executed.
+
+   Feature test cases include the following:
+   testID: 11874111   7.2.12 IPv6 Duplicate Address Detection
+   testID: 11724363   7.2.16 Ethernet/Moca Traffic Overloading
+   testID: 11843145   7.2.17 VLAN Pass Through
+   testID: 11723379   7.2.18 VLAN Tagging over Home Owner WiFi
+   testID: 11722378   7.2.19 VLAN Tagging over Guest WiFi
+   testID: 11721378   7.2.2 Verify BRUNO (connected to BRUNO-IS) can obtain
+                            IPv4 address via RG's DHCP service
+   testID: 11792173   7.2.20 VLAN Tag Removal
+   testID: 11721382   7.2.21 IPv6 Verify subnet with /56, /64 length
+   testID: 11843141   7.2.5 Verify client can get correct IPv4 address if
+                            the RG changes DHCP address pool
+   testID: 11721379   7.2.7 Verify time offset information obtained via
+                            DHCP option2
+"""
+
+__author__ = 'Lehan Meng (lmeng@google.com)'
+
+
+import re
+import time
+
+import device
+import ip
+import ssh
+import testCase
+
+
+class BasicNetworkingTest(testCase.TestCase):
+  """Class for test cases of Bruno networking features.
+
+      Configuration Parameters:
+      testID: 11874111/11724363/11843145/11723379
+              /11722378/11721378/11792173/11721382/
+              /11843141/11721379
+      addr = Bruno's IP address
+      user = root
+      pwd = google
+      bruno_prompt = gfibertv#
+      file = cmdOutput.txt
+      title = Basic_Networking
+  """
+
+  def Init(self):
+    """Initialize the networking feature tests."""
+    # Get all device information.
+    info = self.log.CreateResultInfo(
+        '---', 'Networking test verification started...')
+    self.log.SendLine(self.test_info, info)
+    self.bruno = device.Bruno(user=self.params['user'],
+                              addr=self.params['addr'],
+                              bruno_prompt=self.params['bruno_prompt'],
+                              addr_ipv6=self.params['addr_ipv6'])
+    self.bruno.SetLogging(self.log)
+    if not self.p_ssh:
+      self.p_ssh = ssh.SSH(user=self.params['user'],
+                           addr=self.params['addr'],
+                           bruno_prompt=self.params['bruno_prompt'],
+                           addr_ipv6=self.params['addr_ipv6'])
+    self.bruno.dev_ssh = self.p_ssh
+    self.p_ssh.SetLogging(self.log)
+    return
+
+  def SshTunnel(self):
+    """Create ssh tunnel for the test."""
+    self.p_ssh.SshRetry(5, 15)
+    return
+
+  def VerifyDuplicatedAddress(self, ip_addr):
+    """Verify device can detect duplicated ipv6 address existing in network.
+
+    Set a duplicated ip address on the device.
+    Verify that the device can detect duplicated ip address
+
+    Args:
+      ip_addr: the duplicated address
+    Returns:
+      True: if duplicated detected
+      False: if duplicated address is not detected
+    """
+    time_stamp = self.bruno.GetTimeStamp()
+    self.bruno.dev_ssh.SendCmd('ip -6 addr add ' + ip_addr + '/64 dev br0')
+    time.sleep(1)
+    self.bruno.dev_ssh.SendCmd('dmesg | grep detected')
+    log_list = self.bruno.dev_ssh.GetCmdOutput()
+
+    pattern_line = ('\[\s*\d*\.\d{3}\]\s*\w*\d:\s* IPv6 duplicate address\s*('
+                    + ip_addr + ')\s*[/\d+]*\s*detected!')
+    self.bruno.dev_ssh.SendCmd('ip -6 addr del ' + ip_addr + '/64 dev br0')
+
+    if self.bruno.FindLineInLog(log_list, time_stamp, pattern_line):
+      info = self.log.CreateResultInfo('Pass', 'Duplicated IPv6 address '
+                                       'detected: ' + ip_addr)
+      self.log.SendLine(self.test_info, info)
+    else:
+      info = self.log.CreateResultInfo('Failed',
+                                       'Duplicated IPv6 address not detected: '
+                                       + ip_addr + '. Verification Failed!')
+      self.log.SendLine(self.test_info, info)
+    #[132344.324] br0: IPv6 duplicate address fe80:... detected!
+
+  def GetIPv4Address(self):
+    """Test Bruno IP address. testID: 11874104."""
+    # Use ifconfig to check interface IP address
+    self.p_ssh.SendCmd(r'ifconfig br0')
+    line = self.p_ssh.GetCmdOutput(3)[1]
+
+    # Get Bruno IP address
+    address = ip.IPADDR(line).IsLikeIpv4Address()
+    if address is not None:
+      ip.IPADDR(address).IsValidIpv4Address()
+      info = self.log.CreateProgressInfo('---',
+                                         'Verify IP: Bruno has IP address '
+                                         + address)
+      self.log.SendLine(self.test_info, info)
+      return address
+    else:
+      info = self.log.CreateErrorInfo('critical',
+                                      'Error! Bruno does not have IP address!'
+                                      ' Exit!')
+      self.log.SendLine(self.test_info, info)
+      return False
+
+    def GetNetMask(self):
+      """Get Netmask from device."""
+      self.p_ssh.SendCmd(r'ifconfig br0')
+      line = self.p_ssh.GetCmdOutput(3)[1]
+
+      netmask = re.search(r'mask [0-9]+(?:\.[0-9]+){3}', line).group()
+      address = ip.IPADDR(netmask).IsLikeIpv4Address()
+      if address is not None:
+        ip.IPADDR(address).IsValidIpv4Address()
+        info = self.log.CreateProgressInfo('---',
+                                           'Verify IP: Bruno has netmask: '
+                                           + address)
+        self.log.SendLine(self.test_info, info)
+        return address
+      else:
+        info = self.log.CreateErrorInfo('critical',
+                                        'Error! Bruno does not have netmask!'
+                                        ' Exit!')
+        self.log.SendLine(self.test_info, info)
+      return False
+
+  def VerifyIPv6(self):
+    """Test Bruno IPv6 address. testID: 11722376."""
+    # Use ip addr to check interface IPv6 address
+    self.p_ssh.SendCmd(r'ip addr show dev br0')
+
+    for line in reversed(self.p_ssh.p_ssh.before.splitlines()[-10:]):
+      ipv6_addr = re.search('inet6.*dynamic', line)
+      # Get Bruno IPv6 address
+      if ipv6_addr is not None:
+        info = self.log.CreateProgressInfo('---',
+                                           'Verify IPv6: '
+                                           'Bruno has IPv6 address: '
+                                           + ipv6_addr.group())
+        self.log.SendLine(self.test_info, info)
+        break
+    else:
+      info = self.log.CreateErrorInfo('intermediate',
+                                      'Wanring! '
+                                      'Bruno did not have IPv6 address')
+      self.log.SendLine(self.test_info, info)
+    return
+
+  def VerifyDHCPOverBrunoIS(self):
+    """Verify Bruno (connected to Bruno-IS) can get IPv4 address from RG.
+
+    test ID: 11721378
+    This test requires thinBruno is connected to FatBruno, then to RG.
+    """
+    ip_addr = self.GetIPv4Address()
+    if ip_addr:
+      info = self.log.CreateResultInfo('Pass', 'Bruno can get IP address from '
+                                       'RG while connecting to Bruno-IS. '
+                                       'IP address: '+ ip_addr)
+      self.log.SendLine(self.test_info, info)
+    else:
+      info = self.log.CreateResultInfo('Failed',
+                                       'Bruno cannot get IP address from '
+                                       'RG. Verification Failed!')
+      self.log.SendLine(self.test_info, info)
+
+  def Run(self):
+    """Run the test case."""
+    ####### Add your code here -- BEGIN #######
+    print 'Test Started...'
+
+    self.Init()
+    time.sleep(2)  # time delay between commands issued to Device
+    self.SshTunnel()
+
+    self.VerifyIPv6()
+
+    if self.test_info['testID'] == '11874111':
+      ip_addr = self.params['addr_ipv6_dup']
+      self.VerifyDuplicatedAddress(ip_addr)
+    elif self.test_info['testID'] == '11721378':
+      self.VerifyDHCPOverBrunoIS()
+
+    # TODO(lmeng): Test cases: '11724363', '11843145', '11723379', '11722378',
+    # '11792173', '11721382', '11843141', '11721379'
+
+    print 'Test Completed...'
+    ####### Add your code here -- END   #######
+
+  def Destructor(self):
+    """This is the destructor function to call for the user extened class."""
+    self.p_ssh.close()
+
+if __name__ == '__main__':
+  # Test cases defined in this file:
+  test_defined = ['11874111', '11724363', '11843145', '11723379', '11722378',
+                  '11721378', '11792173', '11721382', '11843141', '11721379']
+  # To execute test cases that defined in config file:
+  test_to_execute = testCase.TestCase.FindTestCaseToExecute('config.cfg')
+  for test_id in test_to_execute:
+    if test_id in test_defined:
+      test = BasicNetworkingTest(testID=test_id)
diff --git a/data/DataModel_requirement.cfg b/data/DataModel_requirement.cfg
new file mode 100644
index 0000000..35f5a43
--- /dev/null
+++ b/data/DataModel_requirement.cfg
@@ -0,0 +1,296 @@
+Device.DeviceInfo.AdditionalHardwareVersion
+Device.DeviceInfo.AdditionalSoftwareVersion
+Device.DeviceInfo.Description
+Device.DeviceInfo.HardwareVersion
+Device.DeviceInfo.Manufacturer
+Device.DeviceInfo.ManufacturerOUI
+Device.DeviceInfo.MemoryStatus.Free
+Device.DeviceInfo.MemoryStatus.Total
+Device.DeviceInfo.ModelName
+Device.DeviceInfo.ProcessStatus.CPUUsage
+Device.DeviceInfo.ProcessStatus.Process.{i}.CPUTime
+Device.DeviceInfo.ProcessStatus.Process.{i}.Command
+Device.DeviceInfo.ProcessStatus.Process.{i}.PID
+Device.DeviceInfo.ProcessStatus.Process.{i}.Priority
+Device.DeviceInfo.ProcessStatus.Process.{i}.Size
+Device.DeviceInfo.ProcessStatus.Process.{i}.State
+Device.DeviceInfo.ProcessStatus.ProcessNumberOfEntries
+Device.DeviceInfo.ProcessorNumberOfEntries
+Device.DeviceInfo.ProductClass
+Device.DeviceInfo.SerialNumber
+Device.DeviceInfo.SoftwareVersion
+Device.DeviceInfo.SupportedDataModelNumberOfEntries
+Device.DeviceInfo.TemperatureStatus.TemperatureSensorNumberOfEntries
+Device.DeviceInfo.UpTime
+Device.DeviceInfo.VendorConfigFileNumberOfEntries
+Device.DeviceInfo.VendorLogFileNumberOfEntries
+Device.Ethernet.Interface.{i}.DuplexMode
+Device.Ethernet.Interface.{i}.Enable
+Device.Ethernet.Interface.{i}.LastChange
+Device.Ethernet.Interface.{i}.LowerLayers
+Device.Ethernet.Interface.{i}.MACAddress
+Device.Ethernet.Interface.{i}.MaxBitRate
+Device.Ethernet.Interface.{i}.Name
+Device.Ethernet.Interface.{i}.Stats.BroadcastPacketsReceived
+Device.Ethernet.Interface.{i}.Stats.BroadcastPacketsSent
+Device.Ethernet.Interface.{i}.Stats.BytesReceived
+Device.Ethernet.Interface.{i}.Stats.BytesSent
+Device.Ethernet.Interface.{i}.Stats.DiscardPacketsReceived
+Device.Ethernet.Interface.{i}.Stats.DiscardPacketsSent
+Device.Ethernet.Interface.{i}.Stats.ErrorsReceived
+Device.Ethernet.Interface.{i}.Stats.ErrorsSent
+Device.Ethernet.Interface.{i}.Stats.MulticastPacketsReceived
+Device.Ethernet.Interface.{i}.Stats.MulticastPacketsSent
+Device.Ethernet.Interface.{i}.Stats.PacketsReceived
+Device.Ethernet.Interface.{i}.Stats.PacketsSent
+Device.Ethernet.Interface.{i}.Stats.UnicastPacketsReceived
+Device.Ethernet.Interface.{i}.Stats.UnicastPacketsSent
+Device.Ethernet.Interface.{i}.Stats.UnknownProtoPacketsReceived
+Device.Ethernet.Interface.{i}.Status
+Device.Ethernet.Interface.{i}.Upstream
+Device.Ethernet.Interface.{i}.X_CATAWAMPUS-ORG_ActualBitRate
+Device.Ethernet.Interface.{i}.X_CATAWAMPUS-ORG_ActualDuplexMode
+Device.Ethernet.InterfaceNumberOfEntries
+Device.Ethernet.LinkNumberOfEntries
+Device.Ethernet.VLANTerminationNumberOfEntries
+Device.InterfaceStackNumberOfEntries
+Device.ManagementServer.CWMPRetryIntervalMultiplier
+Device.ManagementServer.CWMPRetryMinimumWaitInterval
+Device.ManagementServer.ConnectionRequestPassword
+Device.ManagementServer.ConnectionRequestURL
+Device.ManagementServer.ConnectionRequestUsername
+Device.ManagementServer.DefaultActiveNotificationThrottle
+Device.ManagementServer.EnableCWMP
+Device.ManagementServer.ManageableDeviceNumberOfEntries
+Device.ManagementServer.ParameterKey
+Device.ManagementServer.Password
+Device.ManagementServer.PeriodicInformEnable
+Device.ManagementServer.PeriodicInformInterval
+Device.ManagementServer.PeriodicInformTime
+Device.ManagementServer.STUNEnable
+Device.ManagementServer.URL
+Device.ManagementServer.UpgradesManaged
+Device.ManagementServer.Username
+Device.MoCA.Interface.{i}.AssociatedDevice.{i}.MACAddress
+Device.MoCA.Interface.{i}.AssociatedDevice.{i}.NodeID
+Device.MoCA.Interface.{i}.AssociatedDevice.{i}.PHYRxRate
+Device.MoCA.Interface.{i}.AssociatedDevice.{i}.PHYTxRate
+Device.MoCA.Interface.{i}.AssociatedDevice.{i}.PacketAggregationCapability
+Device.MoCA.Interface.{i}.AssociatedDevice.{i}.PreferredNC
+Device.MoCA.Interface.{i}.AssociatedDevice.{i}.QAM256Capable
+Device.MoCA.Interface.{i}.AssociatedDevice.{i}.RxBcastPowerLevel
+Device.MoCA.Interface.{i}.AssociatedDevice.{i}.RxErroredAndMissedPackets
+Device.MoCA.Interface.{i}.AssociatedDevice.{i}.RxPackets
+Device.MoCA.Interface.{i}.AssociatedDevice.{i}.RxPowerLevel
+Device.MoCA.Interface.{i}.AssociatedDevice.{i}.RxSNR
+Device.MoCA.Interface.{i}.AssociatedDevice.{i}.TxBcastRate
+Device.MoCA.Interface.{i}.AssociatedDevice.{i}.TxPackets
+Device.MoCA.Interface.{i}.AssociatedDevice.{i}.TxPowerControlReduction
+Device.MoCA.Interface.{i}.AssociatedDeviceNumberOfEntries
+Device.MoCA.Interface.{i}.BackupNC
+Device.MoCA.Interface.{i}.CurrentOperFreq
+Device.MoCA.Interface.{i}.CurrentVersion
+Device.MoCA.Interface.{i}.Enable
+Device.MoCA.Interface.{i}.FirmwareVersion
+Device.MoCA.Interface.{i}.HighestVersion
+Device.MoCA.Interface.{i}.LastChange
+Device.MoCA.Interface.{i}.LastOperFreq
+Device.MoCA.Interface.{i}.LowerLayers
+Device.MoCA.Interface.{i}.MACAddress
+Device.MoCA.Interface.{i}.Name
+Device.MoCA.Interface.{i}.NetworkCoordinator
+Device.MoCA.Interface.{i}.NodeID
+Device.MoCA.Interface.{i}.PacketAggregationCapability
+Device.MoCA.Interface.{i}.PrivacyEnabled
+Device.MoCA.Interface.{i}.QAM256Capable
+Device.MoCA.Interface.{i}.Stats.BroadcastPacketsReceived
+Device.MoCA.Interface.{i}.Stats.BroadcastPacketsSent
+Device.MoCA.Interface.{i}.Stats.BytesReceived
+Device.MoCA.Interface.{i}.Stats.BytesSent
+Device.MoCA.Interface.{i}.Stats.DiscardPacketsReceived
+Device.MoCA.Interface.{i}.Stats.DiscardPacketsSent
+Device.MoCA.Interface.{i}.Stats.ErrorsReceived
+Device.MoCA.Interface.{i}.Stats.ErrorsSent
+Device.MoCA.Interface.{i}.Stats.MulticastPacketsReceived
+Device.MoCA.Interface.{i}.Stats.MulticastPacketsSent
+Device.MoCA.Interface.{i}.Stats.PacketsReceived
+Device.MoCA.Interface.{i}.Stats.PacketsSent
+Device.MoCA.Interface.{i}.Stats.UnicastPacketsReceived
+Device.MoCA.Interface.{i}.Stats.UnicastPacketsSent
+Device.MoCA.Interface.{i}.Stats.UnknownProtoPacketsReceived
+Device.MoCA.Interface.{i}.Status
+Device.MoCA.Interface.{i}.Upstream
+Device.MoCA.InterfaceNumberOfEntries
+Device.PeriodicStatistics.MaxReportSamples
+Device.PeriodicStatistics.MinSampleInterval
+Device.PeriodicStatistics.SampleSet.{i}.Enable
+Device.PeriodicStatistics.SampleSet.{i}.FetchSamples
+Device.PeriodicStatistics.SampleSet.{i}.Name
+Device.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.CalculationMode
+Device.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.Enable
+Device.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.Failures
+Device.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.HighThreshold
+Device.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.LowThreshold
+Device.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.Reference
+Device.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.SampleMode
+Device.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.SampleSeconds
+Device.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.SuspectData
+Device.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.Values
+Device.PeriodicStatistics.SampleSet.{i}.ParameterNumberOfEntries
+Device.PeriodicStatistics.SampleSet.{i}.ReportEndTime
+Device.PeriodicStatistics.SampleSet.{i}.ReportSamples
+Device.PeriodicStatistics.SampleSet.{i}.ReportStartTime
+Device.PeriodicStatistics.SampleSet.{i}.SampleInterval
+Device.PeriodicStatistics.SampleSet.{i}.SampleSeconds
+Device.PeriodicStatistics.SampleSet.{i}.Status
+Device.PeriodicStatistics.SampleSet.{i}.TimeReference
+Device.PeriodicStatistics.SampleSetNumberOfEntries
+Device.Services.STBService.{i}.Components.FrontEnd.{i}.IP.IGMP.ClientGroup.{i}.GroupAddress
+Device.Services.STBService.{i}.Components.FrontEnd.{i}.IP.IGMP.ClientGroupNumberOfEntries
+Device.Services.STBService.{i}.Components.FrontEndNumberOfEntries
+Device.Services.STBServiceNumberOfEntries
+Device.Services.StorageServices.Capabilities.FTPCapable
+Device.Services.StorageServices.Capabilities.HTTPCapable
+Device.Services.StorageServices.Capabilities.HTTPSCapable
+Device.Services.StorageServices.Capabilities.HTTPWritable
+Device.Services.StorageServices.Capabilities.SFTPCapable
+Device.Services.StorageServices.Capabilities.SupportedFileSystemTypes
+Device.Services.StorageServices.Capabilities.SupportedNetworkProtocols
+Device.Services.StorageServices.Capabilities.SupportedRaidTypes
+Device.Services.StorageServices.Capabilities.VolumeEncryptionCapable
+Device.Services.StorageServices.Enable
+Device.Services.StorageServices.LogicalVolume.{i}.Capacity
+Device.Services.StorageServices.LogicalVolume.{i}.Enable
+Device.Services.StorageServices.LogicalVolume.{i}.FileSystem
+Device.Services.StorageServices.LogicalVolume.{i}.FolderNumberOfEntries
+Device.Services.StorageServices.LogicalVolume.{i}.Name
+Device.Services.StorageServices.LogicalVolume.{i}.Status
+Device.Services.StorageServices.LogicalVolume.{i}.ThresholdLimit
+Device.Services.StorageServices.LogicalVolume.{i}.UsedSpace
+Device.Services.StorageServices.LogicalVolume.{i}.X_CATAWAMPUS-ORG_ReadOnly
+Device.Services.StorageServices.LogicalVolumeNumberOfEntries
+Device.Services.StorageServices.PhysicalMedium.{i}.Capacity
+Device.Services.StorageServices.PhysicalMedium.{i}.ConnectionType
+Device.Services.StorageServices.PhysicalMedium.{i}.FirmwareVersion
+Device.Services.StorageServices.PhysicalMedium.{i}.Health
+Device.Services.StorageServices.PhysicalMedium.{i}.HotSwappable
+Device.Services.StorageServices.PhysicalMedium.{i}.Model
+Device.Services.StorageServices.PhysicalMedium.{i}.Name
+Device.Services.StorageServices.PhysicalMedium.{i}.Removable
+Device.Services.StorageServices.PhysicalMedium.{i}.SMARTCapable
+Device.Services.StorageServices.PhysicalMedium.{i}.SerialNumber
+Device.Services.StorageServices.PhysicalMedium.{i}.Vendor
+Device.Services.StorageServices.PhysicalMediumNumberOfEntries
+Device.Services.StorageServices.StorageArrayNumberOfEntries
+Device.Services.StorageServices.UserAccountNumberOfEntries
+Device.Services.StorageServices.UserGroupNumberOfEntries
+Device.Services.StorageServices.X_CATAWAMPUS-ORG_FlashMedia.{i}.BadEraseBlocks
+Device.Services.StorageServices.X_CATAWAMPUS-ORG_FlashMedia.{i}.CorrectedErrors
+Device.Services.StorageServices.X_CATAWAMPUS-ORG_FlashMedia.{i}.EraseBlockSize
+Device.Services.StorageServices.X_CATAWAMPUS-ORG_FlashMedia.{i}.IOSize
+Device.Services.StorageServices.X_CATAWAMPUS-ORG_FlashMedia.{i}.MaxEraseCount
+Device.Services.StorageServices.X_CATAWAMPUS-ORG_FlashMedia.{i}.Name
+Device.Services.StorageServices.X_CATAWAMPUS-ORG_FlashMedia.{i}.ReservedEraseBlocks
+Device.Services.StorageServices.X_CATAWAMPUS-ORG_FlashMedia.{i}.SubVolume.{i}.DataBytes
+Device.Services.StorageServices.X_CATAWAMPUS-ORG_FlashMedia.{i}.SubVolume.{i}.Name
+Device.Services.StorageServices.X_CATAWAMPUS-ORG_FlashMedia.{i}.SubVolume.{i}.Status
+Device.Services.StorageServices.X_CATAWAMPUS-ORG_FlashMedia.{i}.SubVolumeNumberOfEntries
+Device.Services.StorageServices.X_CATAWAMPUS-ORG_FlashMedia.{i}.TotalEraseBlocks
+Device.Services.StorageServices.X_CATAWAMPUS-ORG_FlashMedia.{i}.UncorrectedErrors
+Device.Services.StorageServices.X_CATAWAMPUS-ORG_FlashMediaNumberOfEntries
+InternetGatewayDevice.DeviceInfo.AdditionalHardwareVersion
+InternetGatewayDevice.DeviceInfo.AdditionalSoftwareVersion
+InternetGatewayDevice.DeviceInfo.Description
+InternetGatewayDevice.DeviceInfo.HardwareVersion
+InternetGatewayDevice.DeviceInfo.Manufacturer
+InternetGatewayDevice.DeviceInfo.ManufacturerOUI
+InternetGatewayDevice.DeviceInfo.ModelName
+InternetGatewayDevice.DeviceInfo.ModemFirmwareVersion
+InternetGatewayDevice.DeviceInfo.ProductClass
+InternetGatewayDevice.DeviceInfo.SerialNumber
+InternetGatewayDevice.DeviceInfo.SoftwareVersion
+InternetGatewayDevice.DeviceInfo.SpecVersion
+InternetGatewayDevice.DeviceInfo.UpTime
+InternetGatewayDevice.DeviceInfo.VendorConfigFileNumberOfEntries
+InternetGatewayDevice.LANDevice.{i}.LANEthernetInterfaceNumberOfEntries
+InternetGatewayDevice.LANDevice.{i}.LANUSBInterfaceNumberOfEntries
+InternetGatewayDevice.LANDevice.{i}.LANWLANConfigurationNumberOfEntries
+InternetGatewayDevice.LANDeviceNumberOfEntries
+InternetGatewayDevice.ManagementServer.ConnectionRequestPassword
+InternetGatewayDevice.ManagementServer.ConnectionRequestURL
+InternetGatewayDevice.ManagementServer.ConnectionRequestUsername
+InternetGatewayDevice.ManagementServer.DefaultActiveNotificationThrottle
+InternetGatewayDevice.ManagementServer.EnableCWMP
+InternetGatewayDevice.ManagementServer.ParameterKey
+InternetGatewayDevice.ManagementServer.Password
+InternetGatewayDevice.ManagementServer.PeriodicInformEnable
+InternetGatewayDevice.ManagementServer.PeriodicInformInterval
+InternetGatewayDevice.ManagementServer.PeriodicInformTime
+InternetGatewayDevice.ManagementServer.URL
+InternetGatewayDevice.ManagementServer.UpgradesManaged
+InternetGatewayDevice.ManagementServer.Username
+InternetGatewayDevice.PeriodicStatistics.MaxReportSamples
+InternetGatewayDevice.PeriodicStatistics.MinSampleInterval
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.Enable
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.FetchSamples
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.Name
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.CalculationMode
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.Enable
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.Failures
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.HighThreshold
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.LowThreshold
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.Reference
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.SampleMode
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.SampleSeconds
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.SuspectData
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.Values
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.ParameterNumberOfEntries
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.ReportEndTime
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.ReportSamples
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.ReportStartTime
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.SampleInterval
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.SampleSeconds
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.Status
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.TimeReference
+InternetGatewayDevice.PeriodicStatistics.SampleSetNumberOfEntries
+InternetGatewayDevice.Time.CurrentLocalTime
+InternetGatewayDevice.Time.Enable
+InternetGatewayDevice.Time.LocalTimeZoneName
+InternetGatewayDevice.WANDeviceNumberOfEntries
+TraceRoute.DSCP
+TraceRoute.DataBlockSize
+TraceRoute.DiagnosticsState
+TraceRoute.Host
+TraceRoute.Interface
+TraceRoute.MaxHopCount
+TraceRoute.NumberOfTries
+TraceRoute.ResponseTime
+TraceRoute.RouteHopsNumberOfEntries
+TraceRoute.Timeout
+X_CATAWAMPUS-ORG_CATAWAMPUS.RuntimeEnvInfo
+X_GOOGLE-COM_GFIBERTV.Mailbox.Name
+X_GOOGLE-COM_GFIBERTV.Mailbox.Node
+X_GOOGLE-COM_GFIBERTV.Mailbox.NodeList
+X_GOOGLE-COM_GFIBERTV.Mailbox.Value
+X_GOOGLE-COM_GVSB.EpgPrimary
+X_GOOGLE-COM_GVSB.EpgSecondary
+X_GOOGLE-COM_GVSB.GvsbChannelLineup
+X_GOOGLE-COM_GVSB.GvsbKick
+X_GOOGLE-COM_GVSB.GvsbServer
+STBService.{i}.ServiceMonitoring.MainStream.{i}.Total.MPEG2TSStats.TSPacketsReceived
+STBService.{i}.ServiceMonitoring.MainStream.{i}.Total.MPEG2TSStats.PacketDiscontinuityCounter
+STBService.{i}.ServiceMonitoring.MainStream.{i}.Total.DejitteringStats.EmptyBufferTime
+STBService.{i}.ServiceMonitoring.MainStream.{i}.Total.DejitteringStats.Overruns
+STBService.{i}.ServiceMonitoring.MainStream.{i}.Total.DejitteringStats.Underruns
+STBService.{i}.ServiceMonitoring.MainStream.{i}.Total.TCPStats.PacketsReceived
+STBService.{i}.ServiceMonitoring.MainStream.{i}.Total.TCPStats.PacketsRetransmitted
+STBService.{i}.ServiceMonitoring.MainStream.{i}.Total.TCPStats.BytesReceived
+STBService.{i}.Components.HDMI.{i}.DisplayDevice.Status
+STBService.{i}.Components.HDMI.{i}.DisplayDevice.SupportedResolutions
+STBService.{i}.Components.HDMI.{i}.DisplayDevice.PreferredResolution
+STBService.{i}.Components.HDMI.{i}.ResolutionValue
+STBService.{i}.Components.HDMI.{i}.DisplayDevice.EEDID
+STBService.{i}.Components.HDMI.{i}.DisplayDevice.AutoLipSyncSupport
+STBService.{i}.Components.HDMI.{i}.DisplayDevice.VideoLatency
+STBService.{i}.Components.HDMI.{i}.DisplayDevice.HDMI3DPresent
+STBService.{i}.Components.HDMI.{i}.DisplayDevice.CECSupport
diff --git a/data/DataModel_requirement_1.cfg b/data/DataModel_requirement_1.cfg
new file mode 100644
index 0000000..c940323
--- /dev/null
+++ b/data/DataModel_requirement_1.cfg
@@ -0,0 +1,509 @@
+Device.Bridging.
+Device.Bridging.Bridge.{i}.
+Device.Bridging.Bridge.{i}.Port.{i}.
+Device.Bridging.Bridge.{i}.Port.{i}.Stats.
+Device.Bridging.Bridge.{i}.VLANPort.{i}.
+Device.DeviceInfo
+Device.DeviceInfo.AdditionalHardwareVersion
+Device.DeviceInfo.AdditionalSoftwareVersion
+Device.DeviceInfo.Description
+Device.DeviceInfo.HardwareVersion
+Device.DeviceInfo.Manufacturer
+Device.DeviceInfo.ManufacturerOUI
+Device.DeviceInfo.MemoryStatus.
+Device.DeviceInfo.MemoryStatus.Free
+Device.DeviceInfo.MemoryStatus.Total
+Device.DeviceInfo.ModelName
+Device.DeviceInfo.NetworkProperties.
+Device.DeviceInfo.ProcessStatus.
+Device.DeviceInfo.ProcessStatus.CPUUsage
+Device.DeviceInfo.ProcessStatus.Process.{i}.
+Device.DeviceInfo.ProcessStatus.Process.{i}.CPUTime
+Device.DeviceInfo.ProcessStatus.Process.{i}.Command
+Device.DeviceInfo.ProcessStatus.Process.{i}.PID
+Device.DeviceInfo.ProcessStatus.Process.{i}.Priority
+Device.DeviceInfo.ProcessStatus.Process.{i}.Size
+Device.DeviceInfo.ProcessStatus.Process.{i}.State
+Device.DeviceInfo.ProcessStatus.ProcessNumberOfEntries
+Device.DeviceInfo.Processor.{i}.
+Device.DeviceInfo.ProcessorNumberOfEntries
+Device.DeviceInfo.ProductClass
+Device.DeviceInfo.ProxierInfo.
+Device.DeviceInfo.SerialNumber
+Device.DeviceInfo.SoftwareVersion
+Device.DeviceInfo.SupportedDataModel.{i}.
+Device.DeviceInfo.SupportedDataModelNumberOfEntries
+Device.DeviceInfo.TemperatureStatus.
+Device.DeviceInfo.TemperatureStatus.TemperatureSensor.{i}.
+Device.DeviceInfo.TemperatureStatus.TemperatureSensorNumberOfEntries
+Device.DeviceInfo.UpTime
+Device.DeviceInfo.VendorConfigFile.{i}.
+Device.DeviceInfo.VendorConfigFileNumberOfEntries
+Device.DeviceInfo.VendorLogFile.{i}.
+Device.DeviceInfo.VendorLogFileNumberOfEntries
+Device.Ethernet.
+Device.Ethernet.Interface.{i}.
+Device.Ethernet.Interface.{i}.DuplexMode
+Device.Ethernet.Interface.{i}.Enable
+Device.Ethernet.Interface.{i}.LastChange
+Device.Ethernet.Interface.{i}.LowerLayers
+Device.Ethernet.Interface.{i}.MACAddress
+Device.Ethernet.Interface.{i}.MaxBitRate
+Device.Ethernet.Interface.{i}.Name
+Device.Ethernet.Interface.{i}.Stats.
+Device.Ethernet.Interface.{i}.Stats.BroadcastPacketsReceived
+Device.Ethernet.Interface.{i}.Stats.BroadcastPacketsSent
+Device.Ethernet.Interface.{i}.Stats.BytesReceived
+Device.Ethernet.Interface.{i}.Stats.BytesSent
+Device.Ethernet.Interface.{i}.Stats.DiscardPacketsReceived
+Device.Ethernet.Interface.{i}.Stats.DiscardPacketsSent
+Device.Ethernet.Interface.{i}.Stats.ErrorsReceived
+Device.Ethernet.Interface.{i}.Stats.ErrorsSent
+Device.Ethernet.Interface.{i}.Stats.MulticastPacketsReceived
+Device.Ethernet.Interface.{i}.Stats.MulticastPacketsSent
+Device.Ethernet.Interface.{i}.Stats.PacketsReceived
+Device.Ethernet.Interface.{i}.Stats.PacketsSent
+Device.Ethernet.Interface.{i}.Stats.UnicastPacketsReceived
+Device.Ethernet.Interface.{i}.Stats.UnicastPacketsSent
+Device.Ethernet.Interface.{i}.Stats.UnknownProtoPacketsReceived
+Device.Ethernet.Interface.{i}.Status
+Device.Ethernet.Interface.{i}.Upstream
+Device.Ethernet.Interface.{i}.X_CATAWAMPUS-ORG_ActualBitRate
+Device.Ethernet.Interface.{i}.X_CATAWAMPUS-ORG_ActualDuplexMode
+Device.Ethernet.InterfaceNumberOfEntries
+Device.Ethernet.Link.{i}.
+Device.Ethernet.Link.{i}.Stats.
+Device.Ethernet.LinkNumberOfEntries
+Device.Ethernet.RMONStats.{i}.
+Device.Ethernet.VLANTerminationNumberOfEntries
+Device.IP.ActivePort.{i}.
+Device.IP.Diagnostics.DownloadDiagnostics.
+Device.IP.Diagnostics.IPPing.
+Device.IP.Diagnostics.TraceRoute.
+Device.IP.Diagnostics.TraceRoute.RouteHops.{i}.
+Device.IP.Diagnostics.UDPEchoConfig.
+Device.IP.Diagnostics.UploadDiagnostics.
+Device.IP.Interface.{i}.
+Device.IP.Interface.{i}.IPv4Address.{i}.
+Device.IP.Interface.{i}.IPv6Address.{i}.
+Device.IP.Interface.{i}.IPv6Prefix.{i}.
+Device.IP.Interface.{i}.Stats.{i}.
+Device.InterfaceStackNumberOfEntries
+Device.ManagementServer.
+Device.ManagementServer.AutonomousTransferCompletePolicy.
+Device.ManagementServer.CWMPRetryIntervalMultiplier
+Device.ManagementServer.CWMPRetryMinimumWaitInterval
+Device.ManagementServer.ConnectionRequestPassword
+Device.ManagementServer.ConnectionRequestURL
+Device.ManagementServer.ConnectionRequestUsername
+Device.ManagementServer.DUStateChangeComplPolicy.
+Device.ManagementServer.DefaultActiveNotificationThrottle
+Device.ManagementServer.DownloadAvailability.
+Device.ManagementServer.DownloadAvailability.Announcement.
+Device.ManagementServer.DownloadAvailability.Announcement.Group.{i}.
+Device.ManagementServer.DownloadAvailability.Query.
+Device.ManagementServer.EmbeddedDevice.{i}.
+Device.ManagementServer.EnableCWMP
+Device.ManagementServer.ManageableDevice.{i}.
+Device.ManagementServer.ManageableDeviceNumberOfEntries
+Device.ManagementServer.ParameterKey
+Device.ManagementServer.Password
+Device.ManagementServer.PeriodicInformEnable
+Device.ManagementServer.PeriodicInformInterval
+Device.ManagementServer.PeriodicInformTime
+Device.ManagementServer.STUNEnable
+Device.ManagementServer.URL
+Device.ManagementServer.UpgradesManaged
+Device.ManagementServer.Username
+Device.ManagementServer.VirtualDevice.{i}.
+Device.MoCA.
+Device.MoCA.Interface.{i}.AssociatedDeviceNumberOfEntries
+Device.MoCA.Interface.{i}.BackupNC
+Device.MoCA.Interface.{i}.CurrentOperFreq
+Device.MoCA.Interface.{i}.CurrentVersion
+Device.MoCA.Interface.{i}.Enable
+Device.MoCA.Interface.{i}.FirmwareVersion
+Device.MoCA.Interface.{i}.HighestVersion
+Device.MoCA.Interface.{i}.LastChange
+Device.MoCA.Interface.{i}.LastOperFreq
+Device.MoCA.Interface.{i}.LowerLayers
+Device.MoCA.Interface.{i}.MACAddress
+Device.MoCA.Interface.{i}.Name
+Device.MoCA.Interface.{i}.NetworkCoordinator
+Device.MoCA.Interface.{i}.NodeID
+Device.MoCA.Interface.{i}.PacketAggregationCapability
+Device.MoCA.Interface.{i}.PrivacyEnabled
+Device.MoCA.Interface.{i}.QAM256Capable
+Device.MoCA.Interface.{i}.Stats.BroadcastPacketsReceived
+Device.MoCA.Interface.{i}.Stats.BroadcastPacketsSent
+Device.MoCA.Interface.{i}.Stats.BytesReceived
+Device.MoCA.Interface.{i}.Stats.BytesSent
+Device.MoCA.Interface.{i}.Stats.DiscardPacketsReceived
+Device.MoCA.Interface.{i}.Stats.DiscardPacketsSent
+Device.MoCA.Interface.{i}.Stats.ErrorsReceived
+Device.MoCA.Interface.{i}.Stats.ErrorsSent
+Device.MoCA.Interface.{i}.Stats.MulticastPacketsReceived
+Device.MoCA.Interface.{i}.Stats.MulticastPacketsSent
+Device.MoCA.Interface.{i}.Stats.PacketsReceived
+Device.MoCA.Interface.{i}.Stats.PacketsSent
+Device.MoCA.Interface.{i}.Stats.UnicastPacketsReceived
+Device.MoCA.Interface.{i}.Stats.UnicastPacketsSent
+Device.MoCA.Interface.{i}.Stats.UnknownProtoPacketsReceived
+Device.MoCA.Interface.{i}.Status
+Device.MoCA.Interface.{i}.Upstream
+Device.MoCA.InterfaceNumberOfEntries
+Device.MoCA.Interface.{i}.
+Device.MoCA.Interface.{i}.AssociatedDevice.{i}.
+Device.MoCA.Interface.{i}.QoS.
+Device.MoCA.Interface.{i}.QoS.FlowStats.{i}.
+Device.MoCA.Interface.{i}.Stats.
+Device.PeriodicStatistics.MaxReportSamples
+Device.PeriodicStatistics.MinSampleInterval
+Device.PeriodicStatistics.SampleSet.{i}.Enable
+Device.PeriodicStatistics.SampleSet.{i}.FetchSamples
+Device.PeriodicStatistics.SampleSet.{i}.Name
+Device.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.CalculationMode
+Device.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.Enable
+Device.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.Failures
+Device.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.HighThreshold
+Device.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.LowThreshold
+Device.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.Reference
+Device.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.SampleMode
+Device.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.SampleSeconds
+Device.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.SuspectData
+Device.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.Values
+Device.PeriodicStatistics.SampleSet.{i}.ParameterNumberOfEntries
+Device.PeriodicStatistics.SampleSet.{i}.ReportEndTime
+Device.PeriodicStatistics.SampleSet.{i}.ReportSamples
+Device.PeriodicStatistics.SampleSet.{i}.ReportStartTime
+Device.PeriodicStatistics.SampleSet.{i}.SampleInterval
+Device.PeriodicStatistics.SampleSet.{i}.SampleSeconds
+Device.PeriodicStatistics.SampleSet.{i}.Status
+Device.PeriodicStatistics.SampleSet.{i}.TimeReference
+Device.PeriodicStatistics.SampleSetNumberOfEntries
+Device.QoS.
+Device.QoS.App.{i}.
+Device.QoS.Classification.{i}.
+Device.QoS.Flow.{i}.
+Device.QoS.Policer.{i}.
+Device.QoS.Queue.{i}.
+Device.QoS.QueueStats.{i}.
+Device.QoS.Shaper.{i}.
+Device.Services.STBService.{i}.
+Device.Services.STBService.{i}.AVPlayers.
+Device.Services.STBService.{i}.AVPlayers.AVPlayer.{i}.
+Device.Services.STBService.{i}.AVStreams.
+Device.Services.STBService.{i}.AVStreams.AVStream{i}.
+Device.Services.STBService.{i}.Applications.
+Device.Services.STBService.{i}.Applications.AudienceStats.
+Device.Services.STBService.{i}.Applications.AudienceStats.Channel.{i}.
+Device.Services.STBService.{i}.Capabilities.AudienceStats.
+Device.Services.STBService.{i}.Capabilities.AudioDecoder.
+Device.Services.STBService.{i}.Capabilities.AudioOutput.
+Device.Services.STBService.{i}.Capabilities.DRM
+Device.Services.STBService.{i}.Capabilities.FrontEnd.
+Device.Services.STBService.{i}.Capabilities.FrontEnd.IP.
+Device.Services.STBService.{i}.Capabilities.PVR.
+Device.Services.STBService.{i}.Capabilities.ServiceMonitoring.
+Device.Services.STBService.{i}.Capabilities.VideoDecoder.
+Device.Services.STBService.{i}.Capabilities.VideoDecoder.MPEG2Part2.
+Device.Services.STBService.{i}.Capabilities.VideoDecoder.MPEG2Part2.ProfileLevel.{i}.
+Device.Services.STBService.{i}.Capabilities.VideoDecoder.MPEG4Part10.
+Device.Services.STBService.{i}.Capabilities.VideoDecoder.MPEG4Part10.ProfileLevel.{i}.
+Device.Services.STBService.{i}.Capabilities.VideoDecoder.MPEG4Part2.
+Device.Services.STBService.{i}.Capabilities.VideoDecoder.MPEG4Part2.ProfileLevel.{i}.
+Device.Services.STBService.{i}.Capabilities.VideoDecoder.SMPTEVC1.
+Device.Services.STBService.{i}.Capabilities.VideoDecoder.SMPTEVC1.ProfileLevel.{i}.
+Device.Services.STBService.{i}.Capabilities.VideoOutput.
+Device.Services.STBService.{i}.Components.
+Device.Services.STBService.{i}.Components.AudioDecoder.{i}.
+Device.Services.STBService.{i}.Components.AudioOutput.{i}.
+Device.Services.STBService.{i}.Components.DRM.{i}.
+Device.Services.STBService.{i}.Components.FrontEnd.{i}.
+Device.Services.STBService.{i}.Components.FrontEnd.{i}.IP.
+Device.Services.STBService.{i}.Components.FrontEnd.{i}.IP.Dejittering.
+Device.Services.STBService.{i}.Components.FrontEnd.{i}.IP.IGMP.
+Device.Services.STBService.{i}.Components.FrontEnd.{i}.IP.IGMP.ClientGroup.{i}.
+Device.Services.STBService.{i}.Components.FrontEnd.{i}.IP.IGMP.ClientGroupStats.{i}.
+Device.Services.STBService.{i}.Components.FrontEnd.{i}.IP.IGMP.ClientGroupStats.{i}.CurrentDay
+Device.Services.STBService.{i}.Components.FrontEnd.{i}.IP.IGMP.ClientGroupStats.{i}.QuarterHour.
+Device.Services.STBService.{i}.Components.FrontEnd.{i}.IP.IGMP.ClientGroupStats.{i}.Total
+Device.Services.STBService.{i}.Components.FrontEnd.{i}.IP.IGMP.ClientGroup.{i}.GroupAddress
+Device.Services.STBService.{i}.Components.FrontEnd.{i}.IP.IGMP.ClientGroupNumberOfEntries
+Device.Services.STBService.{i}.Components.FrontEnd.{i}.IP.Inbound.{i}.
+Device.Services.STBService.{i}.Components.FrontEnd.{i}.IP.Outbound.{i}.
+Device.Services.STBService.{i}.Components.FrontEndNumberOfEntries
+Device.Services.STBService.{i}.Components.HDMI.{i}.
+Device.Services.STBService.{i}.Components.HDMI.{i}.DisplayDevice
+Device.Services.STBService.{i}.Components.PVR.
+Device.Services.STBService.{i}.Components.PVR.Storage.{i}.
+Device.Services.STBService.{i}.Components.SPDIF.{i}.
+Device.Services.STBService.{i}.Components.VideoDecoder.{i}.
+Device.Services.STBService.{i}.Components.VideoOutput.{i}.
+Device.Services.STBService.{i}.ServiceMonitoring.
+Device.Services.STBService.{i}.ServiceMonitoring.MainStream.{i}.
+Device.Services.STBService.{i}.ServiceMonitoring.MainStream.{i}.Sample.HighLevelMetricStats.
+Device.Services.STBService.{i}.ServiceMonitoring.MainStream.{i}.Sample.VideoResponseStats.
+Device.Services.STBService.{i}.ServiceMonitoring.MainStream.{i}.Total.
+Device.Services.STBService.{i}.ServiceMonitoring.MainStream.{i}.Total.AudioDecoderStats.
+Device.Services.STBService.{i}.ServiceMonitoring.MainStream.{i}.Total.DejitteringStats.
+Device.Services.STBService.{i}.ServiceMonitoring.MainStream.{i}.Total.MPEG2TSStats.
+Device.Services.STBService.{i}.ServiceMonitoring.MainStream.{i}.Total.VideoDecoderStats.
+Device.Services.STBServiceNumberOfEntries
+Device.Services.STBService{i}.Capabilities.
+Device.Services.StorageServices.{i}.
+Device.Services.StorageServices.{i}.LogicalVolume.{i}.
+Device.Services.StorageServices.{i}.LogicalVolume.{i}.Folder.{i}.
+Device.Services.StorageServices.{i}.LogicalVolume.{i}.Folder.{i}.Quota.
+Device.Services.StorageServices.{i}.PhysicalMedium.{i}.
+Device.Services.StorageServices.{i}.StorageArray.{i}.
+Device.Services.StorageServices.Capabilities.FTPCapable
+Device.Services.StorageServices.Capabilities.HTTPCapable
+Device.Services.StorageServices.Capabilities.HTTPSCapable
+Device.Services.StorageServices.Capabilities.HTTPWritable
+Device.Services.StorageServices.Capabilities.SFTPCapable
+Device.Services.StorageServices.Capabilities.SupportedFileSystemTypes
+Device.Services.StorageServices.Capabilities.SupportedNetworkProtocols
+Device.Services.StorageServices.Capabilities.SupportedRaidTypes
+Device.Services.StorageServices.Capabilities.VolumeEncryptionCapable
+Device.Services.StorageServices.Enable
+Device.Services.StorageServices.LogicalVolume.{i}.Capacity
+Device.Services.StorageServices.LogicalVolume.{i}.Enable
+Device.Services.StorageServices.LogicalVolume.{i}.FileSystem
+Device.Services.StorageServices.LogicalVolume.{i}.FolderNumberOfEntries
+Device.Services.StorageServices.LogicalVolume.{i}.Name
+Device.Services.StorageServices.LogicalVolume.{i}.Status
+Device.Services.StorageServices.LogicalVolume.{i}.ThresholdLimit
+Device.Services.StorageServices.LogicalVolume.{i}.UsedSpace
+Device.Services.StorageServices.LogicalVolume.{i}.X_CATAWAMPUS-ORG_ReadOnly
+Device.Services.StorageServices.LogicalVolumeNumberOfEntries
+Device.Services.StorageServices.PhysicalMedium.{i}.Capacity
+Device.Services.StorageServices.PhysicalMedium.{i}.ConnectionType
+Device.Services.StorageServices.PhysicalMedium.{i}.FirmwareVersion
+Device.Services.StorageServices.PhysicalMedium.{i}.Health
+Device.Services.StorageServices.PhysicalMedium.{i}.HotSwappable
+Device.Services.StorageServices.PhysicalMedium.{i}.Model
+Device.Services.StorageServices.PhysicalMedium.{i}.Name
+Device.Services.StorageServices.PhysicalMedium.{i}.Removable
+Device.Services.StorageServices.PhysicalMedium.{i}.SMARTCapable
+Device.Services.StorageServices.PhysicalMedium.{i}.SerialNumber
+Device.Services.StorageServices.PhysicalMedium.{i}.Vendor
+Device.Services.StorageServices.PhysicalMediumNumberOfEntries
+Device.Services.StorageServices.StorageArrayNumberOfEntries
+Device.Services.StorageServices.UserAccountNumberOfEntries
+Device.Services.StorageServices.UserGroupNumberOfEntries
+Device.Services.StorageServices.X_CATAWAMPUS-ORG_FlashMedia.{i}.BadEraseBlocks
+Device.Services.StorageServices.X_CATAWAMPUS-ORG_FlashMedia.{i}.CorrectedErrors
+Device.Services.StorageServices.X_CATAWAMPUS-ORG_FlashMedia.{i}.EraseBlockSize
+Device.Services.StorageServices.X_CATAWAMPUS-ORG_FlashMedia.{i}.IOSize
+Device.Services.StorageServices.X_CATAWAMPUS-ORG_FlashMedia.{i}.MaxEraseCount
+Device.Services.StorageServices.X_CATAWAMPUS-ORG_FlashMedia.{i}.Name
+Device.Services.StorageServices.X_CATAWAMPUS-ORG_FlashMedia.{i}.ReservedEraseBlocks
+Device.Services.StorageServices.X_CATAWAMPUS-ORG_FlashMedia.{i}.SubVolume.{i}.DataBytes
+Device.Services.StorageServices.X_CATAWAMPUS-ORG_FlashMedia.{i}.SubVolume.{i}.Name
+Device.Services.StorageServices.X_CATAWAMPUS-ORG_FlashMedia.{i}.SubVolume.{i}.Status
+Device.Services.StorageServices.X_CATAWAMPUS-ORG_FlashMedia.{i}.SubVolumeNumberOfEntries
+Device.Services.StorageServices.X_CATAWAMPUS-ORG_FlashMedia.{i}.TotalEraseBlocks
+Device.Services.StorageServices.X_CATAWAMPUS-ORG_FlashMedia.{i}.UncorrectedErrors
+Device.Services.StorageServices.X_CATAWAMPUS-ORG_FlashMediaNumberOfEntries
+Device.USB.
+Device.USB.Interface.{i}.
+Device.USB.Interface.{i}.Stats.
+Device.USB.Port.{i}.
+Device.USB.USBHosts.
+Device.USB.USBHosts.Host.{i}.
+Device.USB.USBHosts.Host.{i}.Device.{i}.
+Device.USB.USBHosts.Host.{i}.Device.{i}.Configuration.{i}.
+Device.USB.USBHosts.Host.{i}.Device.{i}.Configuration.{i}.Interface.{i}.
+Device.WiFi
+Device.WiFi.AccessPoint.{i}.
+Device.WiFi.AccessPoint.{i}.Accounting.
+Device.WiFi.AccessPoint.{i}.AssociatedDevice.{i}.
+Device.WiFi.AccessPoint.{i}.Security.
+Device.WiFi.AccessPoint.{i}.WPS.
+Device.WiFi.EndPoint.{i}.
+Device.WiFi.EndPoint.{i}.Profile.{i}.
+Device.WiFi.EndPoint.{i}.Profile.{i}.Security.
+Device.WiFi.EndPoint.{i}.Profile.{i}.WPS.
+Device.WiFi.EndPoint.{i}.Security
+Device.WiFi.EndPoint.{i}.Stats
+Device.WiFi.Radio.{i}.
+Device.WiFi.Radio.{i}.Antenna.
+Device.WiFi.Radio.{i}.Stats.
+Device.WiFi.SSID.{i}.
+Device.WiFi.SSID.{i}.Stats.
+InternetGatewayDevice.
+InternetGatewayDevice.DeviceConfig.
+InternetGatewayDevice.DeviceInfo.
+InternetGatewayDevice.DeviceInfo.AdditionalHardwareVersion
+InternetGatewayDevice.DeviceInfo.AdditionalSoftwareVersion
+InternetGatewayDevice.DeviceInfo.Description
+InternetGatewayDevice.DeviceInfo.HardwareVersion
+InternetGatewayDevice.DeviceInfo.Manufacturer
+InternetGatewayDevice.DeviceInfo.ManufacturerOUI
+InternetGatewayDevice.DeviceInfo.ModelName
+InternetGatewayDevice.DeviceInfo.ModemFirmwareVersion
+InternetGatewayDevice.DeviceInfo.ProductClass
+InternetGatewayDevice.DeviceInfo.SerialNumber
+InternetGatewayDevice.DeviceInfo.SoftwareVersion
+InternetGatewayDevice.DeviceInfo.SpecVersion
+InternetGatewayDevice.DeviceInfo.UpTime
+InternetGatewayDevice.DeviceInfo.VendorConfigFile.{i}.
+InternetGatewayDevice.DeviceInfo.VendorConfigFileNumberOfEntries
+InternetGatewayDevice.IPPingDiagnostics.
+InternetGatewayDevice.LANConfigSecurity.
+InternetGatewayDevice.LANDevice.{i}.
+InternetGatewayDevice.LANDevice.{i}.Hosts.
+InternetGatewayDevice.LANDevice.{i}.Hosts.Host.{i}.
+InternetGatewayDevice.LANDevice.{i}.LANEthernetInterfaceConfig.{i}.
+InternetGatewayDevice.LANDevice.{i}.LANEthernetInterfaceConfig.{i}.Stats.
+InternetGatewayDevice.LANDevice.{i}.LANEthernetInterfaceNumberOfEntries
+InternetGatewayDevice.LANDevice.{i}.LANHostConfigManagement.
+InternetGatewayDevice.LANDevice.{i}.LANHostConfigManagement.IPInterface.{i}.
+InternetGatewayDevice.LANDevice.{i}.LANUSBInterfaceConfig.{i}.
+InternetGatewayDevice.LANDevice.{i}.LANUSBInterfaceConfig.{i}.Stats.
+InternetGatewayDevice.LANDevice.{i}.LANUSBInterfaceNumberOfEntries
+InternetGatewayDevice.LANDevice.{i}.LANWLANConfigurationNumberOfEntries
+InternetGatewayDevice.LANDevice.{i}.WLANConfiguration.{i}.
+InternetGatewayDevice.LANDevice.{i}.WLANConfiguration.{i}.AssociatedDevice.{i}.
+InternetGatewayDevice.LANDevice.{i}.WLANConfiguration.{i}.PreSharedKey.{i}.
+InternetGatewayDevice.LANDevice.{i}.WLANConfiguration.{i}.WEPKey.{i}.
+InternetGatewayDevice.LANDeviceNumberOfEntries
+InternetGatewayDevice.Layer2Bridging.
+InternetGatewayDevice.Layer2Bridging.AvailableInterface.{i}.
+InternetGatewayDevice.Layer2Bridging.Bridge.{i}.
+InternetGatewayDevice.Layer2Bridging.Filter.{i}.
+InternetGatewayDevice.Layer2Bridging.Marking.{i}.
+InternetGatewayDevice.Layer3Forwarding.
+InternetGatewayDevice.Layer3Forwarding.Forwarding.{i}.
+InternetGatewayDevice.ManagementServer.
+InternetGatewayDevice.ManagementServer.ConnectionRequestPassword
+InternetGatewayDevice.ManagementServer.ConnectionRequestURL
+InternetGatewayDevice.ManagementServer.ConnectionRequestUsername
+InternetGatewayDevice.ManagementServer.DefaultActiveNotificationThrottle
+InternetGatewayDevice.ManagementServer.EnableCWMP
+InternetGatewayDevice.ManagementServer.ManageableDevice.{i}.
+InternetGatewayDevice.ManagementServer.ParameterKey
+InternetGatewayDevice.ManagementServer.Password
+InternetGatewayDevice.ManagementServer.PeriodicInformEnable
+InternetGatewayDevice.ManagementServer.PeriodicInformInterval
+InternetGatewayDevice.ManagementServer.PeriodicInformTime
+InternetGatewayDevice.ManagementServer.URL
+InternetGatewayDevice.ManagementServer.UpgradesManaged
+InternetGatewayDevice.ManagementServer.Username
+InternetGatewayDevice.PeriodicStatistics.MaxReportSamples
+InternetGatewayDevice.PeriodicStatistics.MinSampleInterval
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.Enable
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.FetchSamples
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.Name
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.CalculationMode
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.Enable
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.Failures
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.HighThreshold
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.LowThreshold
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.Reference
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.SampleMode
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.SampleSeconds
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.SuspectData
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.Values
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.ParameterNumberOfEntries
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.ReportEndTime
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.ReportSamples
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.ReportStartTime
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.SampleInterval
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.SampleSeconds
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.Status
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.TimeReference
+InternetGatewayDevice.PeriodicStatistics.SampleSetNumberOfEntries
+InternetGatewayDevice.QueueManagement.
+InternetGatewayDevice.QueueManagement.App.{i}.
+InternetGatewayDevice.QueueManagement.Classification.{i}.
+InternetGatewayDevice.QueueManagement.Flow.{i}.
+InternetGatewayDevice.QueueManagement.Policer.{i}.
+InternetGatewayDevice.QueueManagement.Queue.{i}.
+InternetGatewayDevice.Services.
+InternetGatewayDevice.Time.
+InternetGatewayDevice.Time.CurrentLocalTime
+InternetGatewayDevice.Time.Enable
+InternetGatewayDevice.Time.LocalTimeZoneName
+InternetGatewayDevice.UserInterface.
+InternetGatewayDevice.WANDevice.{i}.
+InternetGatewayDevice.WANDevice.{i}.WAN-CommonInterfaceConfig.WANAccessType
+InternetGatewayDevice.WANDevice.{i}.WAN-OpticalInterfaceConfig.
+InternetGatewayDevice.WANDevice.{i}.WAN-OpticalInterfaceConfig.Enable
+InternetGatewayDevice.WANDevice.{i}.WAN-OpticalInterfaceConfig.LowerOpticalThreshold
+InternetGatewayDevice.WANDevice.{i}.WAN-OpticalInterfaceConfig.LowerTransmitPowerThreshold
+InternetGatewayDevice.WANDevice.{i}.WAN-OpticalInterfaceConfig.OpticalSignalLevel
+InternetGatewayDevice.WANDevice.{i}.WAN-OpticalInterfaceConfig.Status
+InternetGatewayDevice.WANDevice.{i}.WAN-OpticalInterfaceConfig.TransmitOpticalLevel
+InternetGatewayDevice.WANDevice.{i}.WAN-OpticalInterfaceConfig.UpperOpticalThreshold
+InternetGatewayDevice.WANDevice.{i}.WAN-OpticalInterfaceConfig.UpperTransmitPowerThreshold
+InternetGatewayDevice.WANDevice.{i}.WANCommonInterfaceConfig.
+InternetGatewayDevice.WANDevice.{i}.WANCommonInterfaceConfig.Connection.{i}.
+InternetGatewayDevice.WANDevice.{i}.WANConnectionDevice.{i}.
+InternetGatewayDevice.WANDevice.{i}.WANConnectionDevice.{i}.WANEthernetLinkConfig.
+InternetGatewayDevice.WANDevice.{i}.WANConnectionDevice.{i}.WANIPConnection.{i}.
+InternetGatewayDevice.WANDevice.{i}.WANConnectionDevice.{i}.WANIPConnection.{i}.PortMapping.{i}.
+InternetGatewayDevice.WANDevice.{i}.WANConnectionDevice.{i}.WANIPConnection.{i}.Stats.
+InternetGatewayDevice.WANDevice.{i}.WANEthernetInterfaceConfig.
+InternetGatewayDevice.WANDevice.{i}.WANEthernetInterfaceConfig.Stats.
+InternetGatewayDevice.WANDeviceNumberOfEntries
+TraceRoute.
+TraceRoute.DSCP
+TraceRoute.DataBlockSize
+TraceRoute.DiagnosticsState
+TraceRoute.Host
+TraceRoute.Interface
+TraceRoute.MaxHopCount
+TraceRoute.NumberOfTries
+TraceRoute.ResponseTime
+TraceRoute.RouteHopsNumberOfEntries
+TraceRoute.Timeout
+VoiceService.{i}.
+VoiceService.{i}.Capabilities.
+VoiceService.{i}.Capabilities.Codecs.{i}.
+VoiceService.{i}.Capabilities.SIP.
+VoiceService.{i}.PhyInterface.{i}.
+VoiceService.{i}.PhyInterface.{i}.Tests.
+VoiceService.{i}.VoiceProfile.{i}.
+VoiceService.{i}.VoiceProfile.{i}.ButtonMap.
+VoiceService.{i}.VoiceProfile.{i}.ButtonMap.Button.{i}.
+VoiceService.{i}.VoiceProfile.{i}.FaxT38.
+VoiceService.{i}.VoiceProfile.{i}.Line.{i}.
+VoiceService.{i}.VoiceProfile.{i}.Line.{i}.CallingFeatures.
+VoiceService.{i}.VoiceProfile.{i}.Line.{i}.Codec.
+VoiceService.{i}.VoiceProfile.{i}.Line.{i}.Codec.List.{i}.
+VoiceService.{i}.VoiceProfile.{i}.Line.{i}.Ringer.
+VoiceService.{i}.VoiceProfile.{i}.Line.{i}.Ringer.Description.{i}.
+VoiceService.{i}.VoiceProfile.{i}.Line.{i}.Ringer.Event.{i}.
+VoiceService.{i}.VoiceProfile.{i}.Line.{i}.Ringer.Pattern.{i}.
+VoiceService.{i}.VoiceProfile.{i}.Line.{i}.SIP.
+VoiceService.{i}.VoiceProfile.{i}.Line.{i}.SIP.EventSubscribe.{i}.
+VoiceService.{i}.VoiceProfile.{i}.Line.{i}.Session.{i}.
+VoiceService.{i}.VoiceProfile.{i}.Line.{i}.Stats.
+VoiceService.{i}.VoiceProfile.{i}.Line.{i}.VoiceProcessing.
+VoiceService.{i}.VoiceProfile.{i}.NumberingPlan.
+VoiceService.{i}.VoiceProfile.{i}.NumberingPlan.PrefixInfo.{i}.
+VoiceService.{i}.VoiceProfile.{i}.RTP.
+VoiceService.{i}.VoiceProfile.{i}.RTP.RTCP.
+VoiceService.{i}.VoiceProfile.{i}.SIP.
+VoiceService.{i}.VoiceProfile.{i}.SIP.EventSubscribe.{i}.
+VoiceService.{i}.VoiceProfile.{i}.SIP.ResponseMap.{i}.
+VoiceService.{i}.VoiceProfile.{i}.ServiceProviderInfo.
+VoiceService.{i}.VoiceProfile.{i}.Tone.
+VoiceService.{i}.VoiceProfile.{i}.Tone.Description.{i}.
+VoiceService.{i}.VoiceProfile.{i}.Tone.Event.{i}.
+VoiceService.{i}.VoiceProfile.{i}.Tone.Pattern.{i}.
+X_CATAWAMPUS-ORG_CATAWAMPUS.
+X_CATAWAMPUS-ORG_CATAWAMPUS.RuntimeEnvInfo
+X_GOOGLE-COM_GFIBERTV.
+X_GOOGLE-COM_GFIBERTV.Mailbox.Name
+X_GOOGLE-COM_GFIBERTV.Mailbox.Node
+X_GOOGLE-COM_GFIBERTV.Mailbox.NodeList
+X_GOOGLE-COM_GFIBERTV.Mailbox.Value
+X_GOOGLE-COM_GVSB.
+X_GOOGLE-COM_GVSB.EpgPrimary
+X_GOOGLE-COM_GVSB.EpgSecondary
+X_GOOGLE-COM_GVSB.GvsbChannelLineup
+X_GOOGLE-COM_GVSB.GvsbKick
+X_GOOGLE-COM_GVSB.GvsbServer