suite to test statistic manager and operational data 56/10256/13
authorPeter Gubka <pgubka@cisco.com>
Mon, 25 Aug 2014 17:52:45 +0000 (19:52 +0200)
committerPeter Gubka <pgubka@cisco.com>
Mon, 8 Sep 2014 07:28:47 +0000 (09:28 +0200)
xml files are updated that priority is unigue id
test cases use all xml files which are present in 070 suite,
using python2.6 format numbering

Change-Id: I0041295bc5a43cce9c776ab1d12fed0cfbfe5722
Signed-off-by: Peter Gubka <pgubka@cisco.com>
94 files changed:
test/csit/libraries/XmlComparator.py [new file with mode: 0644]
test/csit/libraries/ipaddr.py [new file with mode: 0644]
test/csit/suites/base-of13/075__Flows_OF13_Stat_Manager/010_SM_add_upd_del_flows.txt [new file with mode: 0644]
test/csit/suites/base-of13/075__Flows_OF13_Stat_Manager/__init__.txt [new file with mode: 0644]
test/csit/variables/xmls/f1.xml
test/csit/variables/xmls/f10.xml
test/csit/variables/xmls/f101.xml
test/csit/variables/xmls/f102.xml
test/csit/variables/xmls/f103.xml
test/csit/variables/xmls/f104.xml
test/csit/variables/xmls/f105.xml
test/csit/variables/xmls/f106.xml
test/csit/variables/xmls/f107.xml
test/csit/variables/xmls/f108.xml
test/csit/variables/xmls/f109.xml
test/csit/variables/xmls/f11.xml
test/csit/variables/xmls/f110.xml
test/csit/variables/xmls/f111.xml
test/csit/variables/xmls/f112.xml
test/csit/variables/xmls/f113.xml
test/csit/variables/xmls/f114.xml
test/csit/variables/xmls/f12.xml
test/csit/variables/xmls/f13.xml
test/csit/variables/xmls/f14.xml
test/csit/variables/xmls/f15.xml
test/csit/variables/xmls/f16.xml
test/csit/variables/xmls/f17.xml
test/csit/variables/xmls/f18.xml
test/csit/variables/xmls/f19.xml
test/csit/variables/xmls/f2.xml
test/csit/variables/xmls/f20.xml
test/csit/variables/xmls/f201.xml
test/csit/variables/xmls/f202.xml
test/csit/variables/xmls/f203.xml
test/csit/variables/xmls/f204.xml
test/csit/variables/xmls/f205.xml
test/csit/variables/xmls/f206.xml
test/csit/variables/xmls/f207.xml
test/csit/variables/xmls/f208.xml
test/csit/variables/xmls/f209.xml
test/csit/variables/xmls/f21.xml
test/csit/variables/xmls/f210.xml
test/csit/variables/xmls/f211.xml
test/csit/variables/xmls/f212.xml
test/csit/variables/xmls/f213.xml
test/csit/variables/xmls/f214.xml
test/csit/variables/xmls/f215.xml
test/csit/variables/xmls/f216.xml
test/csit/variables/xmls/f217.xml
test/csit/variables/xmls/f218.xml
test/csit/variables/xmls/f219.xml
test/csit/variables/xmls/f22.xml
test/csit/variables/xmls/f220.xml
test/csit/variables/xmls/f221.xml
test/csit/variables/xmls/f23.xml
test/csit/variables/xmls/f24.xml
test/csit/variables/xmls/f25.xml
test/csit/variables/xmls/f26.xml
test/csit/variables/xmls/f27.xml
test/csit/variables/xmls/f28.xml
test/csit/variables/xmls/f29.xml
test/csit/variables/xmls/f3.xml
test/csit/variables/xmls/f30.xml
test/csit/variables/xmls/f31.xml
test/csit/variables/xmls/f32.xml
test/csit/variables/xmls/f33.xml
test/csit/variables/xmls/f34.xml
test/csit/variables/xmls/f35.xml
test/csit/variables/xmls/f36.xml
test/csit/variables/xmls/f37.xml
test/csit/variables/xmls/f38.xml
test/csit/variables/xmls/f39.xml
test/csit/variables/xmls/f4.xml
test/csit/variables/xmls/f40.xml
test/csit/variables/xmls/f41.xml
test/csit/variables/xmls/f42.xml
test/csit/variables/xmls/f43.xml
test/csit/variables/xmls/f44.xml
test/csit/variables/xmls/f45.xml
test/csit/variables/xmls/f46.xml
test/csit/variables/xmls/f47.xml
test/csit/variables/xmls/f48.xml
test/csit/variables/xmls/f49.xml
test/csit/variables/xmls/f5.xml
test/csit/variables/xmls/f6.xml
test/csit/variables/xmls/f7.xml
test/csit/variables/xmls/f8.xml
test/csit/variables/xmls/f9.xml
test/csit/variables/xmls/g1.xml
test/csit/variables/xmls/g2.xml
test/csit/variables/xmls/g3.xml
test/csit/variables/xmls/m1.xml
test/csit/variables/xmls/m2.xml
test/csit/variables/xmls/m3.xml

diff --git a/test/csit/libraries/XmlComparator.py b/test/csit/libraries/XmlComparator.py
new file mode 100644 (file)
index 0000000..f4c32a0
--- /dev/null
@@ -0,0 +1,299 @@
+'''
+Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
+
+This program and the accompanying materials are made available under the
+terms of the Eclipse Public License v1.0 which accompanies this distribution,
+and is available at http://www.eclipse.org/legal/epl-v10.html
+
+Created on May 21, 2014
+
+@author: <a href="mailto:vdemcak@cisco.com">Vaclav Demcak</a>
+'''
+from xml.dom.minidom import Element
+import ipaddr
+import xml.dom.minidom as md
+import re
+import copy
+
+
+
+KEY_NOT_FOUND = '<KEY_NOT_FOUND>'  # KeyNotFound for dictDiff
+
+class XMLtoDictParserTools():
+
+
+    @staticmethod
+    def parseTreeToDict( node, returnedDict = None, ignoreList = [] ):
+        """
+        Return Dictionary representation of the xml Tree DOM Element.
+        Repeated tags are put to the array sorted by key (id or order)
+        otherwise is the value represented by tag key name.
+        @param node: DOM Element 
+        @param returnedDict : dictionary (default value None)
+        @param ignereList : list of ignored tags for the xml Tree DOM Element
+                            (default value is empty list)
+        @return: dict representation for the input DOM Element
+        """
+        returnedDict = {} if returnedDict is None else returnedDict
+        if ( node.nodeType == Element.ELEMENT_NODE ) :
+            nodeKey = ( node.localName ).encode( 'utf-8', 'ignore' )
+            if nodeKey not in ignoreList :
+                if node.childNodes is not None :
+                    childDict = {}
+                    for child in node.childNodes :
+                        if child.nodeType == Element.TEXT_NODE :
+                            nodeValue = ( child.nodeValue ).encode( 'utf-8', 'ignore' )
+                            if ( len( nodeValue.strip( ' \t\n\r' ) ) ) > 0 :
+                                XMLtoDictParserTools.addDictValue( returnedDict, nodeKey, nodeValue )
+                                nodeKey = None
+                                break
+                        elif child.nodeType == Element.ELEMENT_NODE :
+                            childDict = XMLtoDictParserTools.parseTreeToDict( child, childDict, ignoreList )
+
+                    XMLtoDictParserTools.addDictValue( returnedDict, nodeKey, childDict )
+
+        return returnedDict
+
+    @staticmethod
+    def addDictValue( m_dict, key, value ):
+
+        def _allign_address(value):
+            """unifies output"""
+            n = ipaddr.IPNetwork(value)
+            return '{0}/{1}'.format(n.network.exploded, n.prefixlen)
+
+        def _convert_numbers(value):
+            if value.startswith("0x"):
+                return str(long(value,16))
+            return str(long(value))
+
+        if key is not None :
+            if ( isinstance( value, str ) ) :
+                # we need to predict possible differences
+                # for same value in upper or lower case
+                value = value.lower()
+            if key not in m_dict :
+                #lets add mask for ips withot mask
+                if key in ['ipv4-destination', 'ipv4-source', 'ipv6-destination', 'ipv6-source', 'ipv6-nd-target']:
+                    nvalue = _allign_address(value)
+                    m_dict[key] = nvalue
+                elif key in ['tunnel-mask','type']:
+                    nvalue = _convert_numbers(value)
+                    m_dict[key] = nvalue
+                else:
+                    m_dict[key] = value
+            else :
+                exist_value = m_dict.get( key )
+                if ( type( exist_value ) is dict ) :
+                    list_values = [exist_value, value]
+                    key_for_sort = XMLtoDictParserTools.searchKey( exist_value )
+                    if key_for_sort is not None :
+                        list_values = sorted( list_values, key = lambda k: k[key_for_sort] )
+                    m_dict[key] = list_values
+                elif ( isinstance( exist_value, list ) ) :
+                    exist_value.append( value )
+                    list_values = exist_value
+                    key_for_sort = XMLtoDictParserTools.searchKey( value )
+                    if key_for_sort is not None :
+                        list_values = sorted( list_values, key = lambda k: k[key_for_sort] )
+                    m_dict[key] = list_values
+                else :
+                    m_dict[key] += value
+
+
+    @staticmethod
+    def searchKey( dictionary ):
+        """
+        Return an order key for the array ordering. OF_13
+        allows only two possible kind of the order keys
+        'order' or '*-id'
+        @param dictionary: dictionary with data
+        @return: the array order key 
+        """
+        subKeyStr = ['-id', 'order']
+        for substr in subKeyStr :
+            for key in dictionary:
+                if key == substr :
+                    return key
+                elif key.endswith( substr ):
+                    return key
+        return None
+
+
+    @staticmethod
+    def getDifferenceDict( original_dict, responded_dict ):
+        """ 
+        Return a dict of keys that differ with another config object.  If a value is
+        not found in one fo the configs, it will be represented by KEY_NOT_FOUND.
+        @param original_dict:   Fist dictionary to diff.
+        @param responded_dict:  Second dictionary to diff.
+        @return diff:   Dict of Key => (original_dict.val, responded_dict.val)
+                        Dict of Key => (original_key, KEY_NOT_FOUND)
+                        Dict of Key => (KEY_NOT_FOUNE, original_key)
+        """
+        diff = {}
+        # Check all keys in original_dict dict
+        for key in original_dict.keys():
+            if ( not responded_dict.has_key( key ) ):
+                # missing key in responded dict
+                diff[key] = ( key, KEY_NOT_FOUND )
+            # check values of the dictionaries
+            elif ( original_dict[key] != responded_dict[key] ):
+                # values are not the same #
+
+                orig_dict_val = original_dict[key]
+                resp_dict_val = responded_dict[key]
+
+                # check value is instance of dictionary
+                if isinstance( orig_dict_val, dict ) and isinstance( resp_dict_val, dict ):
+                    sub_dif = XMLtoDictParserTools.getDifferenceDict( orig_dict_val, resp_dict_val )
+                    if sub_dif :
+                        diff[key] = sub_dif
+
+                # check value is instance of list
+                # TODO - > change a basic comparator to compare by id or order
+                elif isinstance( orig_dict_val, list ) and isinstance( resp_dict_val, list ) :
+                    sub_list_diff = {}
+                    # the list lengths
+                    orig_i, resp_i = len( orig_dict_val ), len( resp_dict_val )
+                    # define a max iteration length (less from both)
+                    min_index = orig_i if orig_i < resp_i else resp_i
+                    for index in range ( 0, min_index, 1 ) :
+                        if ( orig_dict_val[index] != resp_dict_val[index] ) :
+                            sub_list_diff[index] = ( orig_dict_val[index], resp_dict_val[index] )
+                    if ( orig_i > min_index ) :
+                        # original is longer as responded dict
+                        for index in range ( min_index, orig_i, 1 ):
+                            sub_list_diff[index] = ( orig_dict_val[index], None )
+                    elif ( resp_i > min_index ) :
+                        # responded dict is longer as original
+                        for index in range ( min_index, resp_i, 1 ) :
+                            sub_list_diff[index] = ( None, resp_dict_val[index] )
+                    if sub_list_diff :
+                        diff[key] = sub_list_diff
+
+                else :
+                    diff[key] = ( original_dict[key], responded_dict[key] )
+
+        # Check all keys in responded_dict dict to find missing
+        for key in responded_dict.keys():
+            if ( not original_dict.has_key( key ) ):
+                diff[key] = ( KEY_NOT_FOUND, key )
+        return diff
+
+IGNORED_TAGS_FOR_OPERATIONAL_COMPARISON = ['id', 'flow-name', 'barrier', 'cookie_mask', 'installHw', 'flags', 'strict', 'byte-count', 'duration', 'packet-count', 'in-port', 'vlan-id-present', 'out_group', 'out_port', 'hard-timeout', 'idle-timeout', 'flow-statistics', 'cookie']
+
+IGNORED_PATHS_FOR_OC = [(['flow', 'instructions', 'instruction', 'apply-actions', 'action', 'controller-action' ], True),
+                        (['flow', 'instructions', 'instruction', 'clear-actions', 'action'], False),
+                        (['flow', 'instructions', 'instruction', 'apply-actions', 'action', 'push-vlan-action', 'vlan-id'], False),
+                        (['flow', 'instructions', 'instruction', 'apply-actions', 'action', 'drop-action'], True),
+                        (['flow', 'instructions', 'instruction', 'apply-actions', 'action', 'flood-action'], True),
+                       ]
+
+TAGS_TO_ADD_FOR_OC = [(['flow', 'instructions', 'instruction', 'apply-actions', 'action', 'output-action'], 'max-length' , '0'),
+                     ]
+
+
+TAGS_TO_MODIFY_FOR_OC = [(['flow', 'match','metadata'], 'metadata', 'metadata-mask'),
+                        ]
+
+class XmlComparator:
+
+    def is_flow_configured(self, requested_flow, configured_flows):
+
+        orig_tree = md.parseString(requested_flow)
+        xml_resp_stream = configured_flows.encode( 'utf-8', 'ignore' )
+        xml_resp_tree = md.parseString( xml_resp_stream  )
+        nodeListOperFlows = xml_resp_tree.getElementsByTagNameNS("*", 'flow' )
+        origDict = XMLtoDictParserTools.parseTreeToDict( orig_tree._get_documentElement() )
+
+        reportDict = {}
+        index = 0
+        for node in nodeListOperFlows :
+            nodeDict = XMLtoDictParserTools.parseTreeToDict( node)
+            XMLtoDictParserTools.addDictValue( reportDict, index, nodeDict )
+            index += 1
+            #print nodeDict
+            #print origDict
+            if nodeDict == origDict :
+                return True, ''
+            if nodeDict['flow']['priority'] == origDict['flow']['priority']:
+                return False, 'Flow found with diferences {0}'.format(XMLtoDictParserTools.getDifferenceDict(nodeDict, origDict))
+        return False, ''
+
+    def is_flow_operational2(self, requested_flow, oper_resp):
+        def _rem_unimplemented_tags(tagpath, recurs, tdict):
+            #print "_rem_unimplemented_tags", tagpath, tdict
+            if len(tagpath) > 1 and tagpath[0] in tdict:
+                 _rem_unimplemented_tags(tagpath[1:], recurs,  tdict[tagpath[0]])
+
+            #when not to delete anything
+            if len(tagpath) == 1 and tagpath[0] not in tdict:
+                return
+            if len(tagpath) == 0:
+                return
+
+            #when to delete
+            if len(tagpath) == 1 and tagpath[0] in tdict:
+                del tdict[tagpath[0]]
+            if len(tagpath) > 1 and recurs==True and tagpath[0] in tdict and tdict[tagpath[0]] == {}:
+                del tdict[tagpath[0]]
+            if tdict.keys() == ['order']:
+                del tdict['order']
+            #print "leaving", tdict
+
+        def _add_tags(tagpath, newtag, value, tdict):
+            '''if whole tagpath exists and the tag is not present, it is added with given value'''
+            #print "_add_tags", tagpath, newtag, value, tdict
+            if len(tagpath) > 0 and tagpath[0] in tdict:
+                _add_tags(tagpath[1:], newtag, value, tdict[tagpath[0]])
+            elif len(tagpath) == 0 and  newtag not in tdict:
+                tdict[newtag] = value
+
+        def _to_be_modified_tags(tagpath, tag, related_tag, tdict):
+            '''if whole tagpath exists and the tag is not present, it is added with given value'''
+            #print "_to_be_modified_tags", tagpath, tag, related_tag, tdict
+            if len(tagpath) > 0 and tagpath[0] in tdict:
+                _to_be_modified_tags(tagpath[1:], tag, related_tag, tdict[tagpath[0]])
+            elif len(tagpath) == 0 and  tag in tdict and related_tag in tdict:
+                tdict[tag] = str(long(tdict[tag]) & long(tdict[related_tag]))
+
+
+        orig_tree = md.parseString(requested_flow)
+        xml_resp_stream = oper_resp.encode( 'utf-8', 'ignore' )
+        xml_resp_tree = md.parseString( xml_resp_stream )
+        nodeListOperFlows = xml_resp_tree.getElementsByTagNameNS( "*", 'flow' )
+        origDict = XMLtoDictParserTools.parseTreeToDict( orig_tree._get_documentElement(),
+                                                  ignoreList = IGNORED_TAGS_FOR_OPERATIONAL_COMPARISON )
+
+        #origDict['flow-statistics'] = origDict.pop( 'flow' )
+        reportDict = {}
+        index = 0
+        for node in nodeListOperFlows :
+            nodeDict = XMLtoDictParserTools.parseTreeToDict( node,
+                                                            ignoreList = IGNORED_TAGS_FOR_OPERATIONAL_COMPARISON )
+            XMLtoDictParserTools.addDictValue( reportDict, index, nodeDict )
+            index += 1
+            #print nodeDict
+            #print origDict
+            #print reportDict
+            if nodeDict == origDict :
+                return True, ''
+            if nodeDict['flow']['priority'] == origDict['flow']['priority']:
+                for p in IGNORED_PATHS_FOR_OC:
+                    td = copy.copy(origDict)
+                    _rem_unimplemented_tags(p[0], p[1],  td)
+                    for (p,t,v) in TAGS_TO_ADD_FOR_OC:
+                        _add_tags( p, t, v, td)
+                    for (p,t, rt) in TAGS_TO_MODIFY_FOR_OC:
+                        _to_be_modified_tags( p, t, rt, td)
+
+                    #print "comparing1", nodeDict
+                    #print "comparing2", td
+                    if nodeDict == td:
+                        return True, ''
+                if nodeDict == origDict:
+                    return True, ''
+                return False, 'Flow found with diferences {0}'.format(XMLtoDictParserTools.getDifferenceDict(nodeDict, origDict))
+        return False, ''
+
diff --git a/test/csit/libraries/ipaddr.py b/test/csit/libraries/ipaddr.py
new file mode 100644 (file)
index 0000000..ad27ae9
--- /dev/null
@@ -0,0 +1,1897 @@
+#!/usr/bin/python
+#
+# Copyright 2007 Google Inc.
+#  Licensed to PSF under a Contributor Agreement.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied. See the License for the specific language governing
+# permissions and limitations under the License.
+
+"""A fast, lightweight IPv4/IPv6 manipulation library in Python.
+
+This library is used to create/poke/manipulate IPv4 and IPv6 addresses
+and networks.
+
+"""
+
+__version__ = '2.1.10'
+
+import struct
+
+IPV4LENGTH = 32
+IPV6LENGTH = 128
+
+
+class AddressValueError(ValueError):
+    """A Value Error related to the address."""
+
+
+class NetmaskValueError(ValueError):
+    """A Value Error related to the netmask."""
+
+
+def IPAddress(address, version=None):
+    """Take an IP string/int and return an object of the correct type.
+
+    Args:
+        address: A string or integer, the IP address.  Either IPv4 or
+          IPv6 addresses may be supplied; integers less than 2**32 will
+          be considered to be IPv4 by default.
+        version: An Integer, 4 or 6. If set, don't try to automatically
+          determine what the IP address type is. important for things
+          like IPAddress(1), which could be IPv4, '0.0.0.1',  or IPv6,
+          '::1'.
+
+    Returns:
+        An IPv4Address or IPv6Address object.
+
+    Raises:
+        ValueError: if the string passed isn't either a v4 or a v6
+          address.
+
+    """
+    if version:
+        if version == 4:
+            return IPv4Address(address)
+        elif version == 6:
+            return IPv6Address(address)
+
+    try:
+        return IPv4Address(address)
+    except (AddressValueError, NetmaskValueError):
+        pass
+
+    try:
+        return IPv6Address(address)
+    except (AddressValueError, NetmaskValueError):
+        pass
+
+    raise ValueError('%r does not appear to be an IPv4 or IPv6 address' %
+                     address)
+
+
+def IPNetwork(address, version=None, strict=False):
+    """Take an IP string/int and return an object of the correct type.
+
+    Args:
+        address: A string or integer, the IP address.  Either IPv4 or
+          IPv6 addresses may be supplied; integers less than 2**32 will
+          be considered to be IPv4 by default.
+        version: An Integer, if set, don't try to automatically
+          determine what the IP address type is. important for things
+          like IPNetwork(1), which could be IPv4, '0.0.0.1/32', or IPv6,
+          '::1/128'.
+
+    Returns:
+        An IPv4Network or IPv6Network object.
+
+    Raises:
+        ValueError: if the string passed isn't either a v4 or a v6
+          address. Or if a strict network was requested and a strict
+          network wasn't given.
+
+    """
+    if version:
+        if version == 4:
+            return IPv4Network(address, strict)
+        elif version == 6:
+            return IPv6Network(address, strict)
+
+    try:
+        return IPv4Network(address, strict)
+    except (AddressValueError, NetmaskValueError):
+        pass
+
+    try:
+        return IPv6Network(address, strict)
+    except (AddressValueError, NetmaskValueError):
+        pass
+
+    raise ValueError('%r does not appear to be an IPv4 or IPv6 network' %
+                     address)
+
+
+def v4_int_to_packed(address):
+    """The binary representation of this address.
+
+    Args:
+        address: An integer representation of an IPv4 IP address.
+
+    Returns:
+        The binary representation of this address.
+
+    Raises:
+        ValueError: If the integer is too large to be an IPv4 IP
+          address.
+    """
+    if address > _BaseV4._ALL_ONES:
+        raise ValueError('Address too large for IPv4')
+    return Bytes(struct.pack('!I', address))
+
+
+def v6_int_to_packed(address):
+    """The binary representation of this address.
+
+    Args:
+        address: An integer representation of an IPv4 IP address.
+
+    Returns:
+        The binary representation of this address.
+    """
+    return Bytes(struct.pack('!QQ', address >> 64, address & (2**64 - 1)))
+
+
+def _find_address_range(addresses):
+    """Find a sequence of addresses.
+
+    Args:
+        addresses: a list of IPv4 or IPv6 addresses.
+
+    Returns:
+        A tuple containing the first and last IP addresses in the sequence.
+
+    """
+    first = last = addresses[0]
+    for ip in addresses[1:]:
+        if ip._ip == last._ip + 1:
+            last = ip
+        else:
+            break
+    return (first, last)
+
+def _get_prefix_length(number1, number2, bits):
+    """Get the number of leading bits that are same for two numbers.
+
+    Args:
+        number1: an integer.
+        number2: another integer.
+        bits: the maximum number of bits to compare.
+
+    Returns:
+        The number of leading bits that are the same for two numbers.
+
+    """
+    for i in range(bits):
+        if number1 >> i == number2 >> i:
+            return bits - i
+    return 0
+
+def _count_righthand_zero_bits(number, bits):
+    """Count the number of zero bits on the right hand side.
+
+    Args:
+        number: an integer.
+        bits: maximum number of bits to count.
+
+    Returns:
+        The number of zero bits on the right hand side of the number.
+
+    """
+    if number == 0:
+        return bits
+    for i in range(bits):
+        if (number >> i) % 2:
+            return i
+
+def summarize_address_range(first, last):
+    """Summarize a network range given the first and last IP addresses.
+
+    Example:
+        >>> summarize_address_range(IPv4Address('1.1.1.0'),
+            IPv4Address('1.1.1.130'))
+        [IPv4Network('1.1.1.0/25'), IPv4Network('1.1.1.128/31'),
+        IPv4Network('1.1.1.130/32')]
+
+    Args:
+        first: the first IPv4Address or IPv6Address in the range.
+        last: the last IPv4Address or IPv6Address in the range.
+
+    Returns:
+        The address range collapsed to a list of IPv4Network's or
+        IPv6Network's.
+
+    Raise:
+        TypeError:
+            If the first and last objects are not IP addresses.
+            If the first and last objects are not the same version.
+        ValueError:
+            If the last object is not greater than the first.
+            If the version is not 4 or 6.
+
+    """
+    if not (isinstance(first, _BaseIP) and isinstance(last, _BaseIP)):
+        raise TypeError('first and last must be IP addresses, not networks')
+    if first.version != last.version:
+        raise TypeError("%s and %s are not of the same version" % (
+                str(first), str(last)))
+    if first > last:
+        raise ValueError('last IP address must be greater than first')
+
+    networks = []
+
+    if first.version == 4:
+        ip = IPv4Network
+    elif first.version == 6:
+        ip = IPv6Network
+    else:
+        raise ValueError('unknown IP version')
+
+    ip_bits = first._max_prefixlen
+    first_int = first._ip
+    last_int = last._ip
+    while first_int <= last_int:
+        nbits = _count_righthand_zero_bits(first_int, ip_bits)
+        current = None
+        while nbits >= 0:
+            addend = 2**nbits - 1
+            current = first_int + addend
+            nbits -= 1
+            if current <= last_int:
+                break
+        prefix = _get_prefix_length(first_int, current, ip_bits)
+        net = ip('%s/%d' % (str(first), prefix))
+        networks.append(net)
+        if current == ip._ALL_ONES:
+            break
+        first_int = current + 1
+        first = IPAddress(first_int, version=first._version)
+    return networks
+
+def _collapse_address_list_recursive(addresses):
+    """Loops through the addresses, collapsing concurrent netblocks.
+
+    Example:
+
+        ip1 = IPv4Network('1.1.0.0/24')
+        ip2 = IPv4Network('1.1.1.0/24')
+        ip3 = IPv4Network('1.1.2.0/24')
+        ip4 = IPv4Network('1.1.3.0/24')
+        ip5 = IPv4Network('1.1.4.0/24')
+        ip6 = IPv4Network('1.1.0.1/22')
+
+        _collapse_address_list_recursive([ip1, ip2, ip3, ip4, ip5, ip6]) ->
+          [IPv4Network('1.1.0.0/22'), IPv4Network('1.1.4.0/24')]
+
+        This shouldn't be called directly; it is called via
+          collapse_address_list([]).
+
+    Args:
+        addresses: A list of IPv4Network's or IPv6Network's
+
+    Returns:
+        A list of IPv4Network's or IPv6Network's depending on what we were
+        passed.
+
+    """
+    ret_array = []
+    optimized = False
+
+    for cur_addr in addresses:
+        if not ret_array:
+            ret_array.append(cur_addr)
+            continue
+        if cur_addr in ret_array[-1]:
+            optimized = True
+        elif cur_addr == ret_array[-1].supernet().subnet()[1]:
+            ret_array.append(ret_array.pop().supernet())
+            optimized = True
+        else:
+            ret_array.append(cur_addr)
+
+    if optimized:
+        return _collapse_address_list_recursive(ret_array)
+
+    return ret_array
+
+
+def collapse_address_list(addresses):
+    """Collapse a list of IP objects.
+
+    Example:
+        collapse_address_list([IPv4('1.1.0.0/24'), IPv4('1.1.1.0/24')]) ->
+          [IPv4('1.1.0.0/23')]
+
+    Args:
+        addresses: A list of IPv4Network or IPv6Network objects.
+
+    Returns:
+        A list of IPv4Network or IPv6Network objects depending on what we
+        were passed.
+
+    Raises:
+        TypeError: If passed a list of mixed version objects.
+
+    """
+    i = 0
+    addrs = []
+    ips = []
+    nets = []
+
+    # split IP addresses and networks
+    for ip in addresses:
+        if isinstance(ip, _BaseIP):
+            if ips and ips[-1]._version != ip._version:
+                raise TypeError("%s and %s are not of the same version" % (
+                        str(ip), str(ips[-1])))
+            ips.append(ip)
+        elif ip._prefixlen == ip._max_prefixlen:
+            if ips and ips[-1]._version != ip._version:
+                raise TypeError("%s and %s are not of the same version" % (
+                        str(ip), str(ips[-1])))
+            ips.append(ip.ip)
+        else:
+            if nets and nets[-1]._version != ip._version:
+                raise TypeError("%s and %s are not of the same version" % (
+                        str(ip), str(ips[-1])))
+            nets.append(ip)
+
+    # sort and dedup
+    ips = sorted(set(ips))
+    nets = sorted(set(nets))
+
+    while i < len(ips):
+        (first, last) = _find_address_range(ips[i:])
+        i = ips.index(last) + 1
+        addrs.extend(summarize_address_range(first, last))
+
+    return _collapse_address_list_recursive(sorted(
+        addrs + nets, key=_BaseNet._get_networks_key))
+
+# backwards compatibility
+CollapseAddrList = collapse_address_list
+
+# We need to distinguish between the string and packed-bytes representations
+# of an IP address.  For example, b'0::1' is the IPv4 address 48.58.58.49,
+# while '0::1' is an IPv6 address.
+#
+# In Python 3, the native 'bytes' type already provides this functionality,
+# so we use it directly.  For earlier implementations where bytes is not a
+# distinct type, we create a subclass of str to serve as a tag.
+#
+# Usage example (Python 2):
+#   ip = ipaddr.IPAddress(ipaddr.Bytes('xxxx'))
+#
+# Usage example (Python 3):
+#   ip = ipaddr.IPAddress(b'xxxx')
+try:
+    if bytes is str:
+        raise TypeError("bytes is not a distinct type")
+    Bytes = bytes
+except (NameError, TypeError):
+    class Bytes(str):
+        def __repr__(self):
+            return 'Bytes(%s)' % str.__repr__(self)
+
+def get_mixed_type_key(obj):
+    """Return a key suitable for sorting between networks and addresses.
+
+    Address and Network objects are not sortable by default; they're
+    fundamentally different so the expression
+
+        IPv4Address('1.1.1.1') <= IPv4Network('1.1.1.1/24')
+
+    doesn't make any sense.  There are some times however, where you may wish
+    to have ipaddr sort these for you anyway. If you need to do this, you
+    can use this function as the key= argument to sorted().
+
+    Args:
+      obj: either a Network or Address object.
+    Returns:
+      appropriate key.
+
+    """
+    if isinstance(obj, _BaseNet):
+        return obj._get_networks_key()
+    elif isinstance(obj, _BaseIP):
+        return obj._get_address_key()
+    return NotImplemented
+
+class _IPAddrBase(object):
+
+    """The mother class."""
+
+    def __index__(self):
+        return self._ip
+
+    def __int__(self):
+        return self._ip
+
+    def __hex__(self):
+        return hex(self._ip)
+
+    @property
+    def exploded(self):
+        """Return the longhand version of the IP address as a string."""
+        return self._explode_shorthand_ip_string()
+
+    @property
+    def compressed(self):
+        """Return the shorthand version of the IP address as a string."""
+        return str(self)
+
+
+class _BaseIP(_IPAddrBase):
+
+    """A generic IP object.
+
+    This IP class contains the version independent methods which are
+    used by single IP addresses.
+
+    """
+
+    def __eq__(self, other):
+        try:
+            return (self._ip == other._ip
+                    and self._version == other._version)
+        except AttributeError:
+            return NotImplemented
+
+    def __ne__(self, other):
+        eq = self.__eq__(other)
+        if eq is NotImplemented:
+            return NotImplemented
+        return not eq
+
+    def __le__(self, other):
+        gt = self.__gt__(other)
+        if gt is NotImplemented:
+            return NotImplemented
+        return not gt
+
+    def __ge__(self, other):
+        lt = self.__lt__(other)
+        if lt is NotImplemented:
+            return NotImplemented
+        return not lt
+
+    def __lt__(self, other):
+        if self._version != other._version:
+            raise TypeError('%s and %s are not of the same version' % (
+                    str(self), str(other)))
+        if not isinstance(other, _BaseIP):
+            raise TypeError('%s and %s are not of the same type' % (
+                    str(self), str(other)))
+        if self._ip != other._ip:
+            return self._ip < other._ip
+        return False
+
+    def __gt__(self, other):
+        if self._version != other._version:
+            raise TypeError('%s and %s are not of the same version' % (
+                    str(self), str(other)))
+        if not isinstance(other, _BaseIP):
+            raise TypeError('%s and %s are not of the same type' % (
+                    str(self), str(other)))
+        if self._ip != other._ip:
+            return self._ip > other._ip
+        return False
+
+    # Shorthand for Integer addition and subtraction. This is not
+    # meant to ever support addition/subtraction of addresses.
+    def __add__(self, other):
+        if not isinstance(other, int):
+            return NotImplemented
+        return IPAddress(int(self) + other, version=self._version)
+
+    def __sub__(self, other):
+        if not isinstance(other, int):
+            return NotImplemented
+        return IPAddress(int(self) - other, version=self._version)
+
+    def __repr__(self):
+        return '%s(%r)' % (self.__class__.__name__, str(self))
+
+    def __str__(self):
+        return  '%s' % self._string_from_ip_int(self._ip)
+
+    def __hash__(self):
+        return hash(hex(long(self._ip)))
+
+    def _get_address_key(self):
+        return (self._version, self)
+
+    @property
+    def version(self):
+        raise NotImplementedError('BaseIP has no version')
+
+
+class _BaseNet(_IPAddrBase):
+
+    """A generic IP object.
+
+    This IP class contains the version independent methods which are
+    used by networks.
+
+    """
+
+    def __init__(self, address):
+        self._cache = {}
+
+    def __repr__(self):
+        return '%s(%r)' % (self.__class__.__name__, str(self))
+
+    def iterhosts(self):
+        """Generate Iterator over usable hosts in a network.
+
+           This is like __iter__ except it doesn't return the network
+           or broadcast addresses.
+
+        """
+        cur = int(self.network) + 1
+        bcast = int(self.broadcast) - 1
+        while cur <= bcast:
+            cur += 1
+            yield IPAddress(cur - 1, version=self._version)
+
+    def __iter__(self):
+        cur = int(self.network)
+        bcast = int(self.broadcast)
+        while cur <= bcast:
+            cur += 1
+            yield IPAddress(cur - 1, version=self._version)
+
+    def __getitem__(self, n):
+        network = int(self.network)
+        broadcast = int(self.broadcast)
+        if n >= 0:
+            if network + n > broadcast:
+                raise IndexError
+            return IPAddress(network + n, version=self._version)
+        else:
+            n += 1
+            if broadcast + n < network:
+                raise IndexError
+            return IPAddress(broadcast + n, version=self._version)
+
+    def __lt__(self, other):
+        if self._version != other._version:
+            raise TypeError('%s and %s are not of the same version' % (
+                    str(self), str(other)))
+        if not isinstance(other, _BaseNet):
+            raise TypeError('%s and %s are not of the same type' % (
+                    str(self), str(other)))
+        if self.network != other.network:
+            return self.network < other.network
+        if self.netmask != other.netmask:
+            return self.netmask < other.netmask
+        return False
+
+    def __gt__(self, other):
+        if self._version != other._version:
+            raise TypeError('%s and %s are not of the same version' % (
+                    str(self), str(other)))
+        if not isinstance(other, _BaseNet):
+            raise TypeError('%s and %s are not of the same type' % (
+                    str(self), str(other)))
+        if self.network != other.network:
+            return self.network > other.network
+        if self.netmask != other.netmask:
+            return self.netmask > other.netmask
+        return False
+
+    def __le__(self, other):
+        gt = self.__gt__(other)
+        if gt is NotImplemented:
+            return NotImplemented
+        return not gt
+
+    def __ge__(self, other):
+        lt = self.__lt__(other)
+        if lt is NotImplemented:
+            return NotImplemented
+        return not lt
+
+    def __eq__(self, other):
+        try:
+            return (self._version == other._version
+                    and self.network == other.network
+                    and int(self.netmask) == int(other.netmask))
+        except AttributeError:
+            if isinstance(other, _BaseIP):
+                return (self._version == other._version
+                        and self._ip == other._ip)
+
+    def __ne__(self, other):
+        eq = self.__eq__(other)
+        if eq is NotImplemented:
+            return NotImplemented
+        return not eq
+
+    def __str__(self):
+        return  '%s/%s' % (str(self.ip),
+                           str(self._prefixlen))
+
+    def __hash__(self):
+        return hash(int(self.network) ^ int(self.netmask))
+
+    def __contains__(self, other):
+        # always false if one is v4 and the other is v6.
+        if self._version != other._version:
+          return False
+        # dealing with another network.
+        if isinstance(other, _BaseNet):
+            return (self.network <= other.network and
+                    self.broadcast >= other.broadcast)
+        # dealing with another address
+        else:
+            return (int(self.network) <= int(other._ip) <=
+                    int(self.broadcast))
+
+    def overlaps(self, other):
+        """Tell if self is partly contained in other."""
+        return self.network in other or self.broadcast in other or (
+            other.network in self or other.broadcast in self)
+
+    @property
+    def network(self):
+        x = self._cache.get('network')
+        if x is None:
+            x = IPAddress(self._ip & int(self.netmask), version=self._version)
+            self._cache['network'] = x
+        return x
+
+    @property
+    def broadcast(self):
+        x = self._cache.get('broadcast')
+        if x is None:
+            x = IPAddress(self._ip | int(self.hostmask), version=self._version)
+            self._cache['broadcast'] = x
+        return x
+
+    @property
+    def hostmask(self):
+        x = self._cache.get('hostmask')
+        if x is None:
+            x = IPAddress(int(self.netmask) ^ self._ALL_ONES,
+                          version=self._version)
+            self._cache['hostmask'] = x
+        return x
+
+    @property
+    def with_prefixlen(self):
+        return '%s/%d' % (str(self.ip), self._prefixlen)
+
+    @property
+    def with_netmask(self):
+        return '%s/%s' % (str(self.ip), str(self.netmask))
+
+    @property
+    def with_hostmask(self):
+        return '%s/%s' % (str(self.ip), str(self.hostmask))
+
+    @property
+    def numhosts(self):
+        """Number of hosts in the current subnet."""
+        return int(self.broadcast) - int(self.network) + 1
+
+    @property
+    def version(self):
+        raise NotImplementedError('BaseNet has no version')
+
+    @property
+    def prefixlen(self):
+        return self._prefixlen
+
+    def address_exclude(self, other):
+        """Remove an address from a larger block.
+
+        For example:
+
+            addr1 = IPNetwork('10.1.1.0/24')
+            addr2 = IPNetwork('10.1.1.0/26')
+            addr1.address_exclude(addr2) =
+                [IPNetwork('10.1.1.64/26'), IPNetwork('10.1.1.128/25')]
+
+        or IPv6:
+
+            addr1 = IPNetwork('::1/32')
+            addr2 = IPNetwork('::1/128')
+            addr1.address_exclude(addr2) = [IPNetwork('::0/128'),
+                IPNetwork('::2/127'),
+                IPNetwork('::4/126'),
+                IPNetwork('::8/125'),
+                ...
+                IPNetwork('0:0:8000::/33')]
+
+        Args:
+            other: An IPvXNetwork object of the same type.
+
+        Returns:
+            A sorted list of IPvXNetwork objects addresses which is self
+            minus other.
+
+        Raises:
+            TypeError: If self and other are of difffering address
+              versions, or if other is not a network object.
+            ValueError: If other is not completely contained by self.
+
+        """
+        if not self._version == other._version:
+            raise TypeError("%s and %s are not of the same version" % (
+                str(self), str(other)))
+
+        if not isinstance(other, _BaseNet):
+            raise TypeError("%s is not a network object" % str(other))
+
+        if other not in self:
+            raise ValueError('%s not contained in %s' % (str(other),
+                                                         str(self)))
+        if other == self:
+            return []
+
+        ret_addrs = []
+
+        # Make sure we're comparing the network of other.
+        other = IPNetwork('%s/%s' % (str(other.network), str(other.prefixlen)),
+                   version=other._version)
+
+        s1, s2 = self.subnet()
+        while s1 != other and s2 != other:
+            if other in s1:
+                ret_addrs.append(s2)
+                s1, s2 = s1.subnet()
+            elif other in s2:
+                ret_addrs.append(s1)
+                s1, s2 = s2.subnet()
+            else:
+                # If we got here, there's a bug somewhere.
+                assert True == False, ('Error performing exclusion: '
+                                       's1: %s s2: %s other: %s' %
+                                       (str(s1), str(s2), str(other)))
+        if s1 == other:
+            ret_addrs.append(s2)
+        elif s2 == other:
+            ret_addrs.append(s1)
+        else:
+            # If we got here, there's a bug somewhere.
+            assert True == False, ('Error performing exclusion: '
+                                   's1: %s s2: %s other: %s' %
+                                   (str(s1), str(s2), str(other)))
+
+        return sorted(ret_addrs, key=_BaseNet._get_networks_key)
+
+    def compare_networks(self, other):
+        """Compare two IP objects.
+
+        This is only concerned about the comparison of the integer
+        representation of the network addresses.  This means that the
+        host bits aren't considered at all in this method.  If you want
+        to compare host bits, you can easily enough do a
+        'HostA._ip < HostB._ip'
+
+        Args:
+            other: An IP object.
+
+        Returns:
+            If the IP versions of self and other are the same, returns:
+
+            -1 if self < other:
+              eg: IPv4('1.1.1.0/24') < IPv4('1.1.2.0/24')
+              IPv6('1080::200C:417A') < IPv6('1080::200B:417B')
+            0 if self == other
+              eg: IPv4('1.1.1.1/24') == IPv4('1.1.1.2/24')
+              IPv6('1080::200C:417A/96') == IPv6('1080::200C:417B/96')
+            1 if self > other
+              eg: IPv4('1.1.1.0/24') > IPv4('1.1.0.0/24')
+              IPv6('1080::1:200C:417A/112') >
+              IPv6('1080::0:200C:417A/112')
+
+            If the IP versions of self and other are different, returns:
+
+            -1 if self._version < other._version
+              eg: IPv4('10.0.0.1/24') < IPv6('::1/128')
+            1 if self._version > other._version
+              eg: IPv6('::1/128') > IPv4('255.255.255.0/24')
+
+        """
+        if self._version < other._version:
+            return -1
+        if self._version > other._version:
+            return 1
+        # self._version == other._version below here:
+        if self.network < other.network:
+            return -1
+        if self.network > other.network:
+            return 1
+        # self.network == other.network below here:
+        if self.netmask < other.netmask:
+            return -1
+        if self.netmask > other.netmask:
+            return 1
+        # self.network == other.network and self.netmask == other.netmask
+        return 0
+
+    def _get_networks_key(self):
+        """Network-only key function.
+
+        Returns an object that identifies this address' network and
+        netmask. This function is a suitable "key" argument for sorted()
+        and list.sort().
+
+        """
+        return (self._version, self.network, self.netmask)
+
+    def _ip_int_from_prefix(self, prefixlen=None):
+        """Turn the prefix length netmask into a int for comparison.
+
+        Args:
+            prefixlen: An integer, the prefix length.
+
+        Returns:
+            An integer.
+
+        """
+        if not prefixlen and prefixlen != 0:
+            prefixlen = self._prefixlen
+        return self._ALL_ONES ^ (self._ALL_ONES >> prefixlen)
+
+    def _prefix_from_ip_int(self, ip_int, mask=32):
+        """Return prefix length from the decimal netmask.
+
+        Args:
+            ip_int: An integer, the IP address.
+            mask: The netmask.  Defaults to 32.
+
+        Returns:
+            An integer, the prefix length.
+
+        """
+        while mask:
+            if ip_int & 1 == 1:
+                break
+            ip_int >>= 1
+            mask -= 1
+
+        return mask
+
+    def _ip_string_from_prefix(self, prefixlen=None):
+        """Turn a prefix length into a dotted decimal string.
+
+        Args:
+            prefixlen: An integer, the netmask prefix length.
+
+        Returns:
+            A string, the dotted decimal netmask string.
+
+        """
+        if not prefixlen:
+            prefixlen = self._prefixlen
+        return self._string_from_ip_int(self._ip_int_from_prefix(prefixlen))
+
+    def iter_subnets(self, prefixlen_diff=1, new_prefix=None):
+        """The subnets which join to make the current subnet.
+
+        In the case that self contains only one IP
+        (self._prefixlen == 32 for IPv4 or self._prefixlen == 128
+        for IPv6), return a list with just ourself.
+
+        Args:
+            prefixlen_diff: An integer, the amount the prefix length
+              should be increased by. This should not be set if
+              new_prefix is also set.
+            new_prefix: The desired new prefix length. This must be a
+              larger number (smaller prefix) than the existing prefix.
+              This should not be set if prefixlen_diff is also set.
+
+        Returns:
+            An iterator of IPv(4|6) objects.
+
+        Raises:
+            ValueError: The prefixlen_diff is too small or too large.
+                OR
+            prefixlen_diff and new_prefix are both set or new_prefix
+              is a smaller number than the current prefix (smaller
+              number means a larger network)
+
+        """
+        if self._prefixlen == self._max_prefixlen:
+            yield self
+            return
+
+        if new_prefix is not None:
+            if new_prefix < self._prefixlen:
+                raise ValueError('new prefix must be longer')
+            if prefixlen_diff != 1:
+                raise ValueError('cannot set prefixlen_diff and new_prefix')
+            prefixlen_diff = new_prefix - self._prefixlen
+
+        if prefixlen_diff < 0:
+            raise ValueError('prefix length diff must be > 0')
+        new_prefixlen = self._prefixlen + prefixlen_diff
+
+        if not self._is_valid_netmask(str(new_prefixlen)):
+            raise ValueError(
+                'prefix length diff %d is invalid for netblock %s' % (
+                    new_prefixlen, str(self)))
+
+        first = IPNetwork('%s/%s' % (str(self.network),
+                                     str(self._prefixlen + prefixlen_diff)),
+                         version=self._version)
+
+        yield first
+        current = first
+        while True:
+            broadcast = current.broadcast
+            if broadcast == self.broadcast:
+                return
+            new_addr = IPAddress(int(broadcast) + 1, version=self._version)
+            current = IPNetwork('%s/%s' % (str(new_addr), str(new_prefixlen)),
+                                version=self._version)
+
+            yield current
+
+    def masked(self):
+        """Return the network object with the host bits masked out."""
+        return IPNetwork('%s/%d' % (self.network, self._prefixlen),
+                         version=self._version)
+
+    def subnet(self, prefixlen_diff=1, new_prefix=None):
+        """Return a list of subnets, rather than an iterator."""
+        return list(self.iter_subnets(prefixlen_diff, new_prefix))
+
+    def supernet(self, prefixlen_diff=1, new_prefix=None):
+        """The supernet containing the current network.
+
+        Args:
+            prefixlen_diff: An integer, the amount the prefix length of
+              the network should be decreased by.  For example, given a
+              /24 network and a prefixlen_diff of 3, a supernet with a
+              /21 netmask is returned.
+
+        Returns:
+            An IPv4 network object.
+
+        Raises:
+            ValueError: If self.prefixlen - prefixlen_diff < 0. I.e., you have a
+              negative prefix length.
+                OR
+            If prefixlen_diff and new_prefix are both set or new_prefix is a
+              larger number than the current prefix (larger number means a
+              smaller network)
+
+        """
+        if self._prefixlen == 0:
+            return self
+
+        if new_prefix is not None:
+            if new_prefix > self._prefixlen:
+                raise ValueError('new prefix must be shorter')
+            if prefixlen_diff != 1:
+                raise ValueError('cannot set prefixlen_diff and new_prefix')
+            prefixlen_diff = self._prefixlen - new_prefix
+
+
+        if self.prefixlen - prefixlen_diff < 0:
+            raise ValueError(
+                'current prefixlen is %d, cannot have a prefixlen_diff of %d' %
+                (self.prefixlen, prefixlen_diff))
+        return IPNetwork('%s/%s' % (str(self.network),
+                                    str(self.prefixlen - prefixlen_diff)),
+                         version=self._version)
+
+    # backwards compatibility
+    Subnet = subnet
+    Supernet = supernet
+    AddressExclude = address_exclude
+    CompareNetworks = compare_networks
+    Contains = __contains__
+
+
+class _BaseV4(object):
+
+    """Base IPv4 object.
+
+    The following methods are used by IPv4 objects in both single IP
+    addresses and networks.
+
+    """
+
+    # Equivalent to 255.255.255.255 or 32 bits of 1's.
+    _ALL_ONES = (2**IPV4LENGTH) - 1
+    _DECIMAL_DIGITS = frozenset('0123456789')
+
+    def __init__(self, address):
+        self._version = 4
+        self._max_prefixlen = IPV4LENGTH
+
+    def _explode_shorthand_ip_string(self):
+        return str(self)
+
+    def _ip_int_from_string(self, ip_str):
+        """Turn the given IP string into an integer for comparison.
+
+        Args:
+            ip_str: A string, the IP ip_str.
+
+        Returns:
+            The IP ip_str as an integer.
+
+        Raises:
+            AddressValueError: if ip_str isn't a valid IPv4 Address.
+
+        """
+        octets = ip_str.split('.')
+        if len(octets) != 4:
+            raise AddressValueError(ip_str)
+
+        packed_ip = 0
+        for oc in octets:
+            try:
+                packed_ip = (packed_ip << 8) | self._parse_octet(oc)
+            except ValueError:
+                raise AddressValueError(ip_str)
+        return packed_ip
+
+    def _parse_octet(self, octet_str):
+        """Convert a decimal octet into an integer.
+
+        Args:
+            octet_str: A string, the number to parse.
+
+        Returns:
+            The octet as an integer.
+
+        Raises:
+            ValueError: if the octet isn't strictly a decimal from [0..255].
+
+        """
+        # Whitelist the characters, since int() allows a lot of bizarre stuff.
+        if not self._DECIMAL_DIGITS.issuperset(octet_str):
+            raise ValueError
+        octet_int = int(octet_str, 10)
+        # Disallow leading zeroes, because no clear standard exists on
+        # whether these should be interpreted as decimal or octal.
+        if octet_int > 255 or (octet_str[0] == '0' and len(octet_str) > 1):
+            raise ValueError
+        return octet_int
+
+    def _string_from_ip_int(self, ip_int):
+        """Turns a 32-bit integer into dotted decimal notation.
+
+        Args:
+            ip_int: An integer, the IP address.
+
+        Returns:
+            The IP address as a string in dotted decimal notation.
+
+        """
+        octets = []
+        for _ in xrange(4):
+            octets.insert(0, str(ip_int & 0xFF))
+            ip_int >>= 8
+        return '.'.join(octets)
+
+    @property
+    def max_prefixlen(self):
+        return self._max_prefixlen
+
+    @property
+    def packed(self):
+        """The binary representation of this address."""
+        return v4_int_to_packed(self._ip)
+
+    @property
+    def version(self):
+        return self._version
+
+    @property
+    def is_reserved(self):
+       """Test if the address is otherwise IETF reserved.
+
+        Returns:
+            A boolean, True if the address is within the
+            reserved IPv4 Network range.
+
+       """
+       return self in IPv4Network('240.0.0.0/4')
+
+    @property
+    def is_private(self):
+        """Test if this address is allocated for private networks.
+
+        Returns:
+            A boolean, True if the address is reserved per RFC 1918.
+
+        """
+        return (self in IPv4Network('10.0.0.0/8') or
+                self in IPv4Network('172.16.0.0/12') or
+                self in IPv4Network('192.168.0.0/16'))
+
+    @property
+    def is_multicast(self):
+        """Test if the address is reserved for multicast use.
+
+        Returns:
+            A boolean, True if the address is multicast.
+            See RFC 3171 for details.
+
+        """
+        return self in IPv4Network('224.0.0.0/4')
+
+    @property
+    def is_unspecified(self):
+        """Test if the address is unspecified.
+
+        Returns:
+            A boolean, True if this is the unspecified address as defined in
+            RFC 5735 3.
+
+        """
+        return self in IPv4Network('0.0.0.0')
+
+    @property
+    def is_loopback(self):
+        """Test if the address is a loopback address.
+
+        Returns:
+            A boolean, True if the address is a loopback per RFC 3330.
+
+        """
+        return self in IPv4Network('127.0.0.0/8')
+
+    @property
+    def is_link_local(self):
+        """Test if the address is reserved for link-local.
+
+        Returns:
+            A boolean, True if the address is link-local per RFC 3927.
+
+        """
+        return self in IPv4Network('169.254.0.0/16')
+
+
+class IPv4Address(_BaseV4, _BaseIP):
+
+    """Represent and manipulate single IPv4 Addresses."""
+
+    def __init__(self, address):
+
+        """
+        Args:
+            address: A string or integer representing the IP
+              '192.168.1.1'
+
+              Additionally, an integer can be passed, so
+              IPv4Address('192.168.1.1') == IPv4Address(3232235777).
+              or, more generally
+              IPv4Address(int(IPv4Address('192.168.1.1'))) ==
+                IPv4Address('192.168.1.1')
+
+        Raises:
+            AddressValueError: If ipaddr isn't a valid IPv4 address.
+
+        """
+        _BaseV4.__init__(self, address)
+
+        # Efficient constructor from integer.
+        if isinstance(address, (int, long)):
+            self._ip = address
+            if address < 0 or address > self._ALL_ONES:
+                raise AddressValueError(address)
+            return
+
+        # Constructing from a packed address
+        if isinstance(address, Bytes):
+            try:
+                self._ip, = struct.unpack('!I', address)
+            except struct.error:
+                raise AddressValueError(address)  # Wrong length.
+            return
+
+        # Assume input argument to be string or any object representation
+        # which converts into a formatted IP string.
+        addr_str = str(address)
+        self._ip = self._ip_int_from_string(addr_str)
+
+
+class IPv4Network(_BaseV4, _BaseNet):
+
+    """This class represents and manipulates 32-bit IPv4 networks.
+
+    Attributes: [examples for IPv4Network('1.2.3.4/27')]
+        ._ip: 16909060
+        .ip: IPv4Address('1.2.3.4')
+        .network: IPv4Address('1.2.3.0')
+        .hostmask: IPv4Address('0.0.0.31')
+        .broadcast: IPv4Address('1.2.3.31')
+        .netmask: IPv4Address('255.255.255.224')
+        .prefixlen: 27
+
+    """
+
+    # the valid octets for host and netmasks. only useful for IPv4.
+    _valid_mask_octets = set((255, 254, 252, 248, 240, 224, 192, 128, 0))
+
+    def __init__(self, address, strict=False):
+        """Instantiate a new IPv4 network object.
+
+        Args:
+            address: A string or integer representing the IP [& network].
+              '192.168.1.1/24'
+              '192.168.1.1/255.255.255.0'
+              '192.168.1.1/0.0.0.255'
+              are all functionally the same in IPv4. Similarly,
+              '192.168.1.1'
+              '192.168.1.1/255.255.255.255'
+              '192.168.1.1/32'
+              are also functionaly equivalent. That is to say, failing to
+              provide a subnetmask will create an object with a mask of /32.
+
+              If the mask (portion after the / in the argument) is given in
+              dotted quad form, it is treated as a netmask if it starts with a
+              non-zero field (e.g. /255.0.0.0 == /8) and as a hostmask if it
+              starts with a zero field (e.g. 0.255.255.255 == /8), with the
+              single exception of an all-zero mask which is treated as a
+              netmask == /0. If no mask is given, a default of /32 is used.
+
+              Additionally, an integer can be passed, so
+              IPv4Network('192.168.1.1') == IPv4Network(3232235777).
+              or, more generally
+              IPv4Network(int(IPv4Network('192.168.1.1'))) ==
+                IPv4Network('192.168.1.1')
+
+            strict: A boolean. If true, ensure that we have been passed
+              A true network address, eg, 192.168.1.0/24 and not an
+              IP address on a network, eg, 192.168.1.1/24.
+
+        Raises:
+            AddressValueError: If ipaddr isn't a valid IPv4 address.
+            NetmaskValueError: If the netmask isn't valid for
+              an IPv4 address.
+            ValueError: If strict was True and a network address was not
+              supplied.
+
+        """
+        _BaseNet.__init__(self, address)
+        _BaseV4.__init__(self, address)
+
+        # Constructing from an integer or packed bytes.
+        if isinstance(address, (int, long, Bytes)):
+            self.ip = IPv4Address(address)
+            self._ip = self.ip._ip
+            self._prefixlen = self._max_prefixlen
+            self.netmask = IPv4Address(self._ALL_ONES)
+            return
+
+        # Assume input argument to be string or any object representation
+        # which converts into a formatted IP prefix string.
+        addr = str(address).split('/')
+
+        if len(addr) > 2:
+            raise AddressValueError(address)
+
+        self._ip = self._ip_int_from_string(addr[0])
+        self.ip = IPv4Address(self._ip)
+
+        if len(addr) == 2:
+            mask = addr[1].split('.')
+            if len(mask) == 4:
+                # We have dotted decimal netmask.
+                if self._is_valid_netmask(addr[1]):
+                    self.netmask = IPv4Address(self._ip_int_from_string(
+                            addr[1]))
+                elif self._is_hostmask(addr[1]):
+                    self.netmask = IPv4Address(
+                        self._ip_int_from_string(addr[1]) ^ self._ALL_ONES)
+                else:
+                    raise NetmaskValueError('%s is not a valid netmask'
+                                                     % addr[1])
+
+                self._prefixlen = self._prefix_from_ip_int(int(self.netmask))
+            else:
+                # We have a netmask in prefix length form.
+                if not self._is_valid_netmask(addr[1]):
+                    raise NetmaskValueError(addr[1])
+                self._prefixlen = int(addr[1])
+                self.netmask = IPv4Address(self._ip_int_from_prefix(
+                    self._prefixlen))
+        else:
+            self._prefixlen = self._max_prefixlen
+            self.netmask = IPv4Address(self._ip_int_from_prefix(
+                self._prefixlen))
+        if strict:
+            if self.ip != self.network:
+                raise ValueError('%s has host bits set' %
+                                 self.ip)
+        if self._prefixlen == (self._max_prefixlen - 1):
+            self.iterhosts = self.__iter__
+
+    def _is_hostmask(self, ip_str):
+        """Test if the IP string is a hostmask (rather than a netmask).
+
+        Args:
+            ip_str: A string, the potential hostmask.
+
+        Returns:
+            A boolean, True if the IP string is a hostmask.
+
+        """
+        bits = ip_str.split('.')
+        try:
+            parts = [int(x) for x in bits if int(x) in self._valid_mask_octets]
+        except ValueError:
+            return False
+        if len(parts) != len(bits):
+            return False
+        if parts[0] < parts[-1]:
+            return True
+        return False
+
+    def _is_valid_netmask(self, netmask):
+        """Verify that the netmask is valid.
+
+        Args:
+            netmask: A string, either a prefix or dotted decimal
+              netmask.
+
+        Returns:
+            A boolean, True if the prefix represents a valid IPv4
+            netmask.
+
+        """
+        mask = netmask.split('.')
+        if len(mask) == 4:
+            if [x for x in mask if int(x) not in self._valid_mask_octets]:
+                return False
+            if [y for idx, y in enumerate(mask) if idx > 0 and
+                y > mask[idx - 1]]:
+                return False
+            return True
+        try:
+            netmask = int(netmask)
+        except ValueError:
+            return False
+        return 0 <= netmask <= self._max_prefixlen
+
+    # backwards compatibility
+    IsRFC1918 = lambda self: self.is_private
+    IsMulticast = lambda self: self.is_multicast
+    IsLoopback = lambda self: self.is_loopback
+    IsLinkLocal = lambda self: self.is_link_local
+
+
+class _BaseV6(object):
+
+    """Base IPv6 object.
+
+    The following methods are used by IPv6 objects in both single IP
+    addresses and networks.
+
+    """
+
+    _ALL_ONES = (2**IPV6LENGTH) - 1
+    _HEXTET_COUNT = 8
+    _HEX_DIGITS = frozenset('0123456789ABCDEFabcdef')
+
+    def __init__(self, address):
+        self._version = 6
+        self._max_prefixlen = IPV6LENGTH
+
+    def _ip_int_from_string(self, ip_str):
+        """Turn an IPv6 ip_str into an integer.
+
+        Args:
+            ip_str: A string, the IPv6 ip_str.
+
+        Returns:
+            A long, the IPv6 ip_str.
+
+        Raises:
+            AddressValueError: if ip_str isn't a valid IPv6 Address.
+
+        """
+        parts = ip_str.split(':')
+
+        # An IPv6 address needs at least 2 colons (3 parts).
+        if len(parts) < 3:
+            raise AddressValueError(ip_str)
+
+        # If the address has an IPv4-style suffix, convert it to hexadecimal.
+        if '.' in parts[-1]:
+            ipv4_int = IPv4Address(parts.pop())._ip
+            parts.append('%x' % ((ipv4_int >> 16) & 0xFFFF))
+            parts.append('%x' % (ipv4_int & 0xFFFF))
+
+        # An IPv6 address can't have more than 8 colons (9 parts).
+        if len(parts) > self._HEXTET_COUNT + 1:
+            raise AddressValueError(ip_str)
+
+        # Disregarding the endpoints, find '::' with nothing in between.
+        # This indicates that a run of zeroes has been skipped.
+        try:
+            skip_index, = (
+                [i for i in xrange(1, len(parts) - 1) if not parts[i]] or
+                [None])
+        except ValueError:
+            # Can't have more than one '::'
+            raise AddressValueError(ip_str)
+
+        # parts_hi is the number of parts to copy from above/before the '::'
+        # parts_lo is the number of parts to copy from below/after the '::'
+        if skip_index is not None:
+            # If we found a '::', then check if it also covers the endpoints.
+            parts_hi = skip_index
+            parts_lo = len(parts) - skip_index - 1
+            if not parts[0]:
+                parts_hi -= 1
+                if parts_hi:
+                    raise AddressValueError(ip_str)  # ^: requires ^::
+            if not parts[-1]:
+                parts_lo -= 1
+                if parts_lo:
+                    raise AddressValueError(ip_str)  # :$ requires ::$
+            parts_skipped = self._HEXTET_COUNT - (parts_hi + parts_lo)
+            if parts_skipped < 1:
+                raise AddressValueError(ip_str)
+        else:
+            # Otherwise, allocate the entire address to parts_hi.  The endpoints
+            # could still be empty, but _parse_hextet() will check for that.
+            if len(parts) != self._HEXTET_COUNT:
+                raise AddressValueError(ip_str)
+            parts_hi = len(parts)
+            parts_lo = 0
+            parts_skipped = 0
+
+        try:
+            # Now, parse the hextets into a 128-bit integer.
+            ip_int = 0L
+            for i in xrange(parts_hi):
+                ip_int <<= 16
+                ip_int |= self._parse_hextet(parts[i])
+            ip_int <<= 16 * parts_skipped
+            for i in xrange(-parts_lo, 0):
+                ip_int <<= 16
+                ip_int |= self._parse_hextet(parts[i])
+            return ip_int
+        except ValueError:
+            raise AddressValueError(ip_str)
+
+    def _parse_hextet(self, hextet_str):
+        """Convert an IPv6 hextet string into an integer.
+
+        Args:
+            hextet_str: A string, the number to parse.
+
+        Returns:
+            The hextet as an integer.
+
+        Raises:
+            ValueError: if the input isn't strictly a hex number from [0..FFFF].
+
+        """
+        # Whitelist the characters, since int() allows a lot of bizarre stuff.
+        if not self._HEX_DIGITS.issuperset(hextet_str):
+            raise ValueError
+        hextet_int = int(hextet_str, 16)
+        if hextet_int > 0xFFFF:
+            raise ValueError
+        return hextet_int
+
+    def _compress_hextets(self, hextets):
+        """Compresses a list of hextets.
+
+        Compresses a list of strings, replacing the longest continuous
+        sequence of "0" in the list with "" and adding empty strings at
+        the beginning or at the end of the string such that subsequently
+        calling ":".join(hextets) will produce the compressed version of
+        the IPv6 address.
+
+        Args:
+            hextets: A list of strings, the hextets to compress.
+
+        Returns:
+            A list of strings.
+
+        """
+        best_doublecolon_start = -1
+        best_doublecolon_len = 0
+        doublecolon_start = -1
+        doublecolon_len = 0
+        for index in range(len(hextets)):
+            if hextets[index] == '0':
+                doublecolon_len += 1
+                if doublecolon_start == -1:
+                    # Start of a sequence of zeros.
+                    doublecolon_start = index
+                if doublecolon_len > best_doublecolon_len:
+                    # This is the longest sequence of zeros so far.
+                    best_doublecolon_len = doublecolon_len
+                    best_doublecolon_start = doublecolon_start
+            else:
+                doublecolon_len = 0
+                doublecolon_start = -1
+
+        if best_doublecolon_len > 1:
+            best_doublecolon_end = (best_doublecolon_start +
+                                    best_doublecolon_len)
+            # For zeros at the end of the address.
+            if best_doublecolon_end == len(hextets):
+                hextets += ['']
+            hextets[best_doublecolon_start:best_doublecolon_end] = ['']
+            # For zeros at the beginning of the address.
+            if best_doublecolon_start == 0:
+                hextets = [''] + hextets
+
+        return hextets
+
+    def _string_from_ip_int(self, ip_int=None):
+        """Turns a 128-bit integer into hexadecimal notation.
+
+        Args:
+            ip_int: An integer, the IP address.
+
+        Returns:
+            A string, the hexadecimal representation of the address.
+
+        Raises:
+            ValueError: The address is bigger than 128 bits of all ones.
+
+        """
+        if not ip_int and ip_int != 0:
+            ip_int = int(self._ip)
+
+        if ip_int > self._ALL_ONES:
+            raise ValueError('IPv6 address is too large')
+
+        hex_str = '%032x' % ip_int
+        hextets = []
+        for x in range(0, 32, 4):
+            hextets.append('%x' % int(hex_str[x:x+4], 16))
+
+        hextets = self._compress_hextets(hextets)
+        return ':'.join(hextets)
+
+    def _explode_shorthand_ip_string(self):
+        """Expand a shortened IPv6 address.
+
+        Args:
+            ip_str: A string, the IPv6 address.
+
+        Returns:
+            A string, the expanded IPv6 address.
+
+        """
+        if isinstance(self, _BaseNet):
+            ip_str = str(self.ip)
+        else:
+            ip_str = str(self)
+
+        ip_int = self._ip_int_from_string(ip_str)
+        parts = []
+        for i in xrange(self._HEXTET_COUNT):
+            parts.append('%04x' % (ip_int & 0xFFFF))
+            ip_int >>= 16
+        parts.reverse()
+        if isinstance(self, _BaseNet):
+            return '%s/%d' % (':'.join(parts), self.prefixlen)
+        return ':'.join(parts)
+
+    @property
+    def max_prefixlen(self):
+        return self._max_prefixlen
+
+    @property
+    def packed(self):
+        """The binary representation of this address."""
+        return v6_int_to_packed(self._ip)
+
+    @property
+    def version(self):
+        return self._version
+
+    @property
+    def is_multicast(self):
+        """Test if the address is reserved for multicast use.
+
+        Returns:
+            A boolean, True if the address is a multicast address.
+            See RFC 2373 2.7 for details.
+
+        """
+        return self in IPv6Network('ff00::/8')
+
+    @property
+    def is_reserved(self):
+        """Test if the address is otherwise IETF reserved.
+
+        Returns:
+            A boolean, True if the address is within one of the
+            reserved IPv6 Network ranges.
+
+        """
+        return (self in IPv6Network('::/8') or
+                self in IPv6Network('100::/8') or
+                self in IPv6Network('200::/7') or
+                self in IPv6Network('400::/6') or
+                self in IPv6Network('800::/5') or
+                self in IPv6Network('1000::/4') or
+                self in IPv6Network('4000::/3') or
+                self in IPv6Network('6000::/3') or
+                self in IPv6Network('8000::/3') or
+                self in IPv6Network('A000::/3') or
+                self in IPv6Network('C000::/3') or
+                self in IPv6Network('E000::/4') or
+                self in IPv6Network('F000::/5') or
+                self in IPv6Network('F800::/6') or
+                self in IPv6Network('FE00::/9'))
+
+    @property
+    def is_unspecified(self):
+        """Test if the address is unspecified.
+
+        Returns:
+            A boolean, True if this is the unspecified address as defined in
+            RFC 2373 2.5.2.
+
+        """
+        return self._ip == 0 and getattr(self, '_prefixlen', 128) == 128
+
+    @property
+    def is_loopback(self):
+        """Test if the address is a loopback address.
+
+        Returns:
+            A boolean, True if the address is a loopback address as defined in
+            RFC 2373 2.5.3.
+
+        """
+        return self._ip == 1 and getattr(self, '_prefixlen', 128) == 128
+
+    @property
+    def is_link_local(self):
+        """Test if the address is reserved for link-local.
+
+        Returns:
+            A boolean, True if the address is reserved per RFC 4291.
+
+        """
+        return self in IPv6Network('fe80::/10')
+
+    @property
+    def is_site_local(self):
+        """Test if the address is reserved for site-local.
+
+        Note that the site-local address space has been deprecated by RFC 3879.
+        Use is_private to test if this address is in the space of unique local
+        addresses as defined by RFC 4193.
+
+        Returns:
+            A boolean, True if the address is reserved per RFC 3513 2.5.6.
+
+        """
+        return self in IPv6Network('fec0::/10')
+
+    @property
+    def is_private(self):
+        """Test if this address is allocated for private networks.
+
+        Returns:
+            A boolean, True if the address is reserved per RFC 4193.
+
+        """
+        return self in IPv6Network('fc00::/7')
+
+    @property
+    def ipv4_mapped(self):
+        """Return the IPv4 mapped address.
+
+        Returns:
+            If the IPv6 address is a v4 mapped address, return the
+            IPv4 mapped address. Return None otherwise.
+
+        """
+        if (self._ip >> 32) != 0xFFFF:
+            return None
+        return IPv4Address(self._ip & 0xFFFFFFFF)
+
+    @property
+    def teredo(self):
+        """Tuple of embedded teredo IPs.
+
+        Returns:
+            Tuple of the (server, client) IPs or None if the address
+            doesn't appear to be a teredo address (doesn't start with
+            2001::/32)
+
+        """
+        if (self._ip >> 96) != 0x20010000:
+            return None
+        return (IPv4Address((self._ip >> 64) & 0xFFFFFFFF),
+                IPv4Address(~self._ip & 0xFFFFFFFF))
+
+    @property
+    def sixtofour(self):
+        """Return the IPv4 6to4 embedded address.
+
+        Returns:
+            The IPv4 6to4-embedded address if present or None if the
+            address doesn't appear to contain a 6to4 embedded address.
+
+        """
+        if (self._ip >> 112) != 0x2002:
+            return None
+        return IPv4Address((self._ip >> 80) & 0xFFFFFFFF)
+
+
+class IPv6Address(_BaseV6, _BaseIP):
+
+    """Represent and manipulate single IPv6 Addresses.
+    """
+
+    def __init__(self, address):
+        """Instantiate a new IPv6 address object.
+
+        Args:
+            address: A string or integer representing the IP
+
+              Additionally, an integer can be passed, so
+              IPv6Address('2001:4860::') ==
+                IPv6Address(42541956101370907050197289607612071936L).
+              or, more generally
+              IPv6Address(IPv6Address('2001:4860::')._ip) ==
+                IPv6Address('2001:4860::')
+
+        Raises:
+            AddressValueError: If address isn't a valid IPv6 address.
+
+        """
+        _BaseV6.__init__(self, address)
+
+        # Efficient constructor from integer.
+        if isinstance(address, (int, long)):
+            self._ip = address
+            if address < 0 or address > self._ALL_ONES:
+                raise AddressValueError(address)
+            return
+
+        # Constructing from a packed address
+        if isinstance(address, Bytes):
+            try:
+                hi, lo = struct.unpack('!QQ', address)
+            except struct.error:
+                raise AddressValueError(address)  # Wrong length.
+            self._ip = (hi << 64) | lo
+            return
+
+        # Assume input argument to be string or any object representation
+        # which converts into a formatted IP string.
+        addr_str = str(address)
+        if not addr_str:
+            raise AddressValueError('')
+
+        self._ip = self._ip_int_from_string(addr_str)
+
+
+class IPv6Network(_BaseV6, _BaseNet):
+
+    """This class represents and manipulates 128-bit IPv6 networks.
+
+    Attributes: [examples for IPv6('2001:658:22A:CAFE:200::1/64')]
+        .ip: IPv6Address('2001:658:22a:cafe:200::1')
+        .network: IPv6Address('2001:658:22a:cafe::')
+        .hostmask: IPv6Address('::ffff:ffff:ffff:ffff')
+        .broadcast: IPv6Address('2001:658:22a:cafe:ffff:ffff:ffff:ffff')
+        .netmask: IPv6Address('ffff:ffff:ffff:ffff::')
+        .prefixlen: 64
+
+    """
+
+
+    def __init__(self, address, strict=False):
+        """Instantiate a new IPv6 Network object.
+
+        Args:
+            address: A string or integer representing the IPv6 network or the IP
+              and prefix/netmask.
+              '2001:4860::/128'
+              '2001:4860:0000:0000:0000:0000:0000:0000/128'
+              '2001:4860::'
+              are all functionally the same in IPv6.  That is to say,
+              failing to provide a subnetmask will create an object with
+              a mask of /128.
+
+              Additionally, an integer can be passed, so
+              IPv6Network('2001:4860::') ==
+                IPv6Network(42541956101370907050197289607612071936L).
+              or, more generally
+              IPv6Network(IPv6Network('2001:4860::')._ip) ==
+                IPv6Network('2001:4860::')
+
+            strict: A boolean. If true, ensure that we have been passed
+              A true network address, eg, 192.168.1.0/24 and not an
+              IP address on a network, eg, 192.168.1.1/24.
+
+        Raises:
+            AddressValueError: If address isn't a valid IPv6 address.
+            NetmaskValueError: If the netmask isn't valid for
+              an IPv6 address.
+            ValueError: If strict was True and a network address was not
+              supplied.
+
+        """
+        _BaseNet.__init__(self, address)
+        _BaseV6.__init__(self, address)
+
+        # Constructing from an integer or packed bytes.
+        if isinstance(address, (int, long, Bytes)):
+            self.ip = IPv6Address(address)
+            self._ip = self.ip._ip
+            self._prefixlen = self._max_prefixlen
+            self.netmask = IPv6Address(self._ALL_ONES)
+            return
+
+        # Assume input argument to be string or any object representation
+        # which converts into a formatted IP prefix string.
+        addr = str(address).split('/')
+
+        if len(addr) > 2:
+            raise AddressValueError(address)
+
+        self._ip = self._ip_int_from_string(addr[0])
+        self.ip = IPv6Address(self._ip)
+
+        if len(addr) == 2:
+            if self._is_valid_netmask(addr[1]):
+                self._prefixlen = int(addr[1])
+            else:
+                raise NetmaskValueError(addr[1])
+        else:
+            self._prefixlen = self._max_prefixlen
+
+        self.netmask = IPv6Address(self._ip_int_from_prefix(self._prefixlen))
+
+        if strict:
+            if self.ip != self.network:
+                raise ValueError('%s has host bits set' %
+                                 self.ip)
+        if self._prefixlen == (self._max_prefixlen - 1):
+            self.iterhosts = self.__iter__
+
+    def _is_valid_netmask(self, prefixlen):
+        """Verify that the netmask/prefixlen is valid.
+
+        Args:
+            prefixlen: A string, the netmask in prefix length format.
+
+        Returns:
+            A boolean, True if the prefix represents a valid IPv6
+            netmask.
+
+        """
+        try:
+            prefixlen = int(prefixlen)
+        except ValueError:
+            return False
+        return 0 <= prefixlen <= self._max_prefixlen
+
+    @property
+    def with_netmask(self):
+        return self.with_prefixlen
diff --git a/test/csit/suites/base-of13/075__Flows_OF13_Stat_Manager/010_SM_add_upd_del_flows.txt b/test/csit/suites/base-of13/075__Flows_OF13_Stat_Manager/010_SM_add_upd_del_flows.txt
new file mode 100644 (file)
index 0000000..2666d05
--- /dev/null
@@ -0,0 +1,251 @@
+*** Settings ***
+Documentation     Test suite for Stats Manager flows collection
+Library        OperatingSystem
+Library        Collections
+Library        XML
+Library        ../../../libraries/XmlComparator.py
+Variables      ../../../variables/Variables.py
+Library        ../../../libraries/RequestsLibrary.py
+Library        ../../../libraries/Common.py
+Suite Setup       Initialization Phase
+Suite Teardown    Teardown Phase
+
+
+*** Variables ***
+${XmlsDir}=       ${CURDIR}/../../../variables/xmls
+${switch_idx}=    1
+${switch_name}=   s${switch_idx}
+@{xml_files}=     f1.xml  f2.xml  f3.xml  f5.xml  f7.xml  f8.xml  f9.xml  f10.xml  f11.xml  f12.xml  f13.xml  f14.xml  f17.xml  f19.xml  f24.xml
+
+
+*** Test Cases ***
+Test Add Flows
+   [Documentation]    Add all flows and waits for SM to collect data
+     :FOR   ${flowfile}   IN   @{xml_files}
+     \       Log   ${flowfile}
+     \       Init Flow Variables  ${flowfile}
+     \       Run Keyword And Continue On Failure   Add Flow
+     Sleep  30s
+Test Is Flow 1 Added
+    [Documentation]    Checks if flow is configured and operational
+      Init Flow Variables       f1.xml
+      Check Config Flow         ${True}
+      Check Operational Table   ${True}
+Test Is Flow 2 Added
+    [Documentation]    Checks if flow is configured and operational
+      Init Flow Variables       f2.xml
+      Check Config Flow         ${True}
+      Check Operational Table   ${True}
+Test Is Flow 3 Added
+    [Documentation]    Checks if flow is configured and operational
+      Init Flow Variables       f3.xml
+      Check Config Flow         ${True}
+      Check Operational Table   ${True}
+Test Is Flow 5 Added
+    [Documentation]    Checks if flow is configured and operational
+      Init Flow Variables       f5.xml
+      Check Config Flow         ${True}
+      Check Operational Table   ${True}
+Test Is Flow 7 Added
+    [Documentation]    Checks if flow is configured and operational
+      Init Flow Variables       f7.xml
+      Check Config Flow         ${True}
+      Check Operational Table   ${True}
+Test Is Flow 8 Added
+    [Documentation]    Checks if flow is configured and operational
+      Init Flow Variables       f8.xml
+      Check Config Flow         ${True}
+      Check Operational Table   ${True}
+Test Is Flow 9 Added
+    [Documentation]    Checks if flow is configured and operational
+      Init Flow Variables       f9.xml
+      Check Config Flow         ${True}
+      Check Operational Table   ${True}
+Test Is Flow 10 Added
+    [Documentation]    Checks if flow is configured and operational
+      Init Flow Variables       f10.xml
+      Check Config Flow         ${True}
+      Check Operational Table   ${True}
+Test Is Flow 11 Added
+    [Documentation]    Checks if flow is configured and operational
+      Init Flow Variables       f11.xml
+      Check Config Flow         ${True}
+      Check Operational Table   ${True}
+Test Is Flow 12 Added
+    [Documentation]    Checks if flow is configured and operational
+      Init Flow Variables       f12.xml
+      Check Config Flow         ${True}
+      Check Operational Table   ${True}
+Test Is Flow 13 Added
+    [Documentation]    Checks if flow is configured and operational
+      Init Flow Variables       f13.xml
+      Check Config Flow         ${True}
+      Check Operational Table   ${True}
+Test Is Flow 14 Added
+    [Documentation]    Checks if flow is configured and operational
+      Init Flow Variables       f14.xml
+      Check Config Flow         ${True}
+      Check Operational Table   ${True}
+Test Is Flow 17 Added
+    [Documentation]    Checks if flow is configured and operational
+      Init Flow Variables       f17.xml
+      Check Config Flow         ${True}
+      Check Operational Table   ${True}
+Test Is Flow 19 Added
+    [Documentation]    Checks if flow is configured and operational
+      Init Flow Variables       f19.xml
+      Check Config Flow         ${True}
+      Check Operational Table   ${True}
+Test Is Flow 24 Added
+    [Documentation]    Checks if flow is configured and operational
+      Init Flow Variables       f24.xml
+      Check Config Flow         ${True}
+      Check Operational Table   ${True}
+Test Delete Flows
+   [Documentation]    Delete all flows and waits for SM to collect data
+     :FOR   ${flowfile}   IN   @{xml_files}
+     \       Log   ${flowfile}
+     \       Init Flow Variables   ${flowfile}
+     \       Run Keyword And Continue On Failure   Delete Flow
+     Sleep  40s
+Test Is Flow 1 Deleted
+    [Documentation]    Checks if flow is not configured and operational 
+      Init Flow Variables       f1.xml
+      Check Config Flow         ${False}
+      Check Operational Table   ${False}
+Test Is Flow 2 Deleted
+    [Documentation]    Checks if flow is not configured and operational 
+      Init Flow Variables       f2.xml
+      Check Config Flow         ${False}
+      Check Operational Table   ${False}
+Test Is Flow 3 Deleted
+    [Documentation]    Checks if flow is not configured and operational 
+      Init Flow Variables       f3.xml
+      Check Config Flow         ${False}
+      Check Operational Table   ${False}
+Test Is Flow 5 Deleted
+    [Documentation]    Checks if flow is not configured and operational 
+      Init Flow Variables       f5.xml
+      Check Config Flow         ${False}
+      Check Operational Table   ${False}
+Test Is Flow 7 Deleted
+    [Documentation]    Checks if flow is not configured and operational 
+      Init Flow Variables       f7.xml
+      Check Config Flow         ${False}
+      Check Operational Table   ${False}
+Test Is Flow 8 Deleted
+    [Documentation]    Checks if flow is not configured and operational 
+      Init Flow Variables       f8.xml
+      Check Config Flow         ${False}
+      Check Operational Table   ${False}
+Test Is Flow 9 Deleted
+    [Documentation]    Checks if flow is not configured and operational 
+      Init Flow Variables       f9.xml
+      Check Config Flow         ${False}
+      Check Operational Table   ${False}
+Test Is Flow 10 Deleted
+    [Documentation]    Checks if flow is not configured and operational 
+      Init Flow Variables       f10.xml
+      Check Config Flow         ${False}
+      Check Operational Table   ${False}
+Test Is Flow 11 Deleted
+    [Documentation]    Checks if flow is not configured and operational 
+      Init Flow Variables       f11.xml
+      Check Config Flow         ${False}
+      Check Operational Table   ${False}
+Test Is Flow 12 Deleted
+    [Documentation]    Checks if flow is not configured and operational 
+      Init Flow Variables       f12.xml
+      Check Config Flow         ${False}
+      Check Operational Table   ${False}
+Test Is Flow 13 Deleted
+    [Documentation]    Checks if flow is not configured and operational 
+      Init Flow Variables       f13.xml
+      Check Config Flow         ${False}
+      Check Operational Table   ${False}
+Test Is Flow 14 Deleted
+    [Documentation]    Checks if flow is not configured and operational 
+      Init Flow Variables       f14.xml
+      Check Config Flow         ${False}
+      Check Operational Table   ${False}
+Test Is Flow 17 Deleted
+    [Documentation]    Checks if flow is not configured and operational 
+      Init Flow Variables       f17.xml
+      Check Config Flow         ${False}
+      Check Operational Table   ${False}
+Test Is Flow 19 Deleted
+    [Documentation]    Checks if flow is not configured and operational 
+      Init Flow Variables       f19.xml
+      Check Config Flow         ${False}
+      Check Operational Table   ${False}
+Test Is Flow 24 Deleted
+    [Documentation]    Checks if flow is not configured and operational 
+      Init Flow Variables       f24.xml
+      Check Config Flow         ${False}
+      Check Operational Table   ${False}
+
+
+*** Keywords ***
+Init Flow Variables   [Arguments]   ${file}
+      ${data}=       Get File     ${XmlsDir}/${file}
+      ${xmlroot}=    Parse Xml    ${XmlsDir}/${file}
+      ${table_id}=   Get Element Text   ${xmlroot}   table_id
+      ${flow_id}=    Get Element Text   ${xmlroot}   id
+      ${flow_priority}=    Get Element Text   ${xmlroot}   priority
+      Set Suite Variable   ${table_id}
+      Set Suite Variable   ${flow_id}
+      Set Suite Variable   ${flow_priority}
+      Set Suite Variable   ${data}
+      Set Suite Variable   ${xmlroot}
+Check Config Flow   [Arguments]   ${expected}
+         ${presence_flow}   ${msg}=      Flow Presence Config Flow
+         ${msgf}=   Get Presence Failure Message    config    ${expected}    ${presence_flow}   ${msg} 
+         Should Be Equal    ${expected}  ${presence_flow}   msg=${msgf}
+Flow Presence Config Flow
+         ${headers}=     Create Dictionary   Accept   application/xml
+         ${resp}=   Get  session  /restconf/config/opendaylight-inventory:nodes/node/openflow:${switch_idx}/table/${table_id}/flow/${flow_id}  headers=${headers}
+         Log  ${resp}
+         Log  ${resp.content}
+         Return From Keyword If   ${resp.status_code}!=200  ${False}   ${EMPTY}
+         ${pres}  ${msg}=  Is Flow Configured  ${data}  ${resp.content}
+         Run Keyword If   '''${msg}'''!='${EMPTY}'   Log   ${msg}
+         Return From Keyword   ${pres}   ${msg}
+Check Operational Table  [Arguments]  ${expected}
+         ${presence_table}  ${msg}=  Flow Presence Operational Table
+         ${msgf}=   Get Presence Failure Message    config    ${expected}    ${presence_table}   ${msg} 
+         Should Be Equal  ${expected}  ${presence_table}  msg=${msgf}
+Flow Presence Operational Table 
+         ${headers}=      Create Dictionary   Accept   application/xml
+         ${resp}=   Get   session   /restconf/operational/opendaylight-inventory:nodes/node/openflow:${switch_idx}/table/${table_id}   headers=${headers}
+         Log   ${resp}
+         Log   ${resp.content}
+         Return From Keyword If    ${resp.status_code}!=200   ${False}   ${EMPTY}
+         ${pres}   ${msg}=   Is Flow Operational2   ${data}   ${resp.content}
+         Run Keyword If   '''${msg}'''!='${EMPTY}'   Log   ${msg}
+         Return From Keyword   ${pres}   ${msg}
+Add Flow
+      Log             ${data}
+      ${resp}=        Putxml    session   /restconf/config/opendaylight-inventory:nodes/node/openflow:${switch_idx}/table/${table_id}/flow/${flow_id}   data=${data}
+      ${msg}=  Set Variable   Adding flow for /restconf/config/opendaylight-inventory:nodes/node/openflow:${switch_idx}/table/${table_id}/flow/${flow_id} failed, http response ${resp.status_code} received.
+      Should Be Equal As Strings   ${resp.status_code}   200   msg=${msg}
+Delete Flow
+      ${resp}=  Delete   session   /restconf/config/opendaylight-inventory:nodes/node/openflow:${switch_idx}/table/${table_id}/flow/${flow_id}
+      ${msg}=  Set Variable  Delete flow for /restconf/config/opendaylight-inventory:nodes/node/openflow:${switch_idx}/table/${table_id}/flow/${flow_id} failed, http response ${resp.status_code} received.
+      Should Be Equal As Strings   ${resp.status_code}   200   msg=${msg}
+Delete All Flows
+   [Documentation]    Deletes all flows
+     :FOR   ${flowfile}   IN   @{xml_files}
+     \       Log   ${flowfile}
+     \       Init Flow Variables   ${flowfile}
+     \       Delete Flow
+Initialization Phase
+  [Documentation]   Initiate tcp connection with controller
+     Create Session   session   http://${CONTROLLER}:${PORT}   auth=${AUTH}   headers=${HEADERS_XML}
+Teardown Phase
+  [Documentation]   Closes tcp connection with controller and removes flows
+     Delete All Sessions
+Get Presence Failure Message   [Arguments]   ${ds}   ${expected}   ${presence}  ${diffmsg}
+         Return From Keyword If   '''${diffmsg}'''!='${EMPTY}'  Flow found in ${ds} data store but: ${diffmsg}
+         ${msgf}=   Set Variable If   ${expected}==${True}   The flow is expected in operational data store, but   The flow is not expected in operational data store, but
+         ${msgp}=   Set Variable If   ${presence}==${True}   it is present.   it is not present.
+         Return From Keyword   ${msgf} ${msgp}
diff --git a/test/csit/suites/base-of13/075__Flows_OF13_Stat_Manager/__init__.txt b/test/csit/suites/base-of13/075__Flows_OF13_Stat_Manager/__init__.txt
new file mode 100644 (file)
index 0000000..e1c2c23
--- /dev/null
@@ -0,0 +1,29 @@
+*** Settings ***
+Documentation     Test suite for the OpenDaylight base edition with of13, aimed for statistics manager
+Suite Setup       Start Suite
+Suite Teardown    Stop Suite
+Library           SSHLibrary
+
+*** Variables ***
+${start}          sudo mn --controller=remote,ip=${CONTROLLER} --topo tree,1 --switch ovsk,protocols=OpenFlow13
+
+*** Keywords ***
+Start Suite
+    Log    Start the test on the base edition
+    Open Connection    ${MININET}    prompt=>
+    Login With Public Key    ${MININET_USER}    ${USER_HOME}/.ssh/id_rsa    any
+    Write    sudo ovs-vsctl set-manager ptcp:6644
+    Write    sudo mn -c
+    Sleep    2
+    Write    ${start}
+    Sleep    20
+    Read
+
+Stop Suite
+    Log    Stop the test on the base edition
+    Read
+    Write    exit
+    Sleep    2
+    Read
+    Close Connection
+
index e3545971af38e8d84ec7524ecc460c0e7d5a5077..13b66cb8f70c4f71a4bd0f51c49dbf4dd8de216e 100644 (file)
         </ethernet-match>
         <ipv4-destination>10.0.1.0/24</ipv4-destination>
     </match>
-    <hard-timeout>12</hard-timeout>
     <cookie>1</cookie>
-    <idle-timeout>34</idle-timeout>
     <flow-name>FooXf1</flow-name>
-    <priority>2</priority>
+    <priority>1</priority>
     <barrier>false</barrier>
-</flow>
+</flow>
\ No newline at end of file
index 3b1c133daa225c5f96ed36f71ab9294a97544d27..43c8a23beb3b0e616ad3c46d2c8119500d22b33c 100644 (file)
         <sctp-destination-port>384</sctp-destination-port>
         <in-port>0</in-port>
     </match>
-    <hard-timeout>1200</hard-timeout>
     <cookie>10</cookie>
-    <idle-timeout>3400</idle-timeout>
     <flow-name>FooXf10</flow-name>
-    <priority>2</priority>
+    <priority>10</priority>
     <barrier>false</barrier>
-</flow>
+</flow>
\ No newline at end of file
index 4db119e0e76a7a9cd63b2f7dda5cf043980e35de..5aa44f7ece43f55f27ae28a4dd00e6d2bffcf2ec 100644 (file)
@@ -6,9 +6,7 @@
     <cookie_mask>255</cookie_mask>
     <cookie>101</cookie>
     <table_id>2</table_id>
-    <priority>2</priority>
-    <hard-timeout>1200</hard-timeout>
-    <idle-timeout>3400</idle-timeout>
+    <priority>101</priority>
     <installHw>false</installHw>
     <instructions>
         <instruction>
@@ -43,5 +41,4 @@
         <tcp-source-port>183</tcp-source-port>
         <tcp-destination-port>8080</tcp-destination-port>
     </match>
-</flow>
-
+</flow>
\ No newline at end of file
index 68610ae4e9f24391b72470059024faa459c60cfb..57b7a3dc06cae3220e075d52bb4467061a88ab08 100644 (file)
@@ -6,9 +6,7 @@
     <cookie_mask>255</cookie_mask>
     <cookie>102</cookie>
     <table_id>2</table_id>
-    <priority>2</priority>
-    <hard-timeout>1200</hard-timeout>
-    <idle-timeout>3400</idle-timeout>
+    <priority>102</priority>
     <installHw>false</installHw>
     <instructions>
         <instruction>
@@ -46,5 +44,4 @@
         <tcp-source-port>25364</tcp-source-port>
         <tcp-destination-port>8080</tcp-destination-port>
     </match>
-</flow>
-
+</flow>
\ No newline at end of file
index c692b736e9158b4d51f4ce69b8fb4f971e49b713..e809debbaa4804b82da2f311145b02d4cec96755 100644 (file)
@@ -6,9 +6,7 @@
     <cookie_mask>255</cookie_mask>
     <cookie>103</cookie>
     <table_id>2</table_id>
-    <priority>2</priority>
-    <hard-timeout>1200</hard-timeout>
-    <idle-timeout>3400</idle-timeout>
+    <priority>103</priority>
     <installHw>false</installHw>
     <instructions>
         <instruction>
@@ -46,5 +44,4 @@
         <tcp-source-port>25364</tcp-source-port>
         <tcp-destination-port>8080</tcp-destination-port>
     </match>
-</flow>
-
+</flow>
\ No newline at end of file
index 9d8635774ab6e3b4966716aac74f13d7d60c510e..3fc40418d9a14da88c7ddc188c512fc71f5d4e48 100644 (file)
@@ -6,9 +6,7 @@
     <cookie_mask>255</cookie_mask>
     <cookie>104</cookie>
     <table_id>2</table_id>
-    <priority>2</priority>
-    <hard-timeout>1200</hard-timeout>
-    <idle-timeout>3400</idle-timeout>
+    <priority>104</priority>
     <installHw>false</installHw>
     <instructions>
         <instruction>
@@ -43,5 +41,4 @@
         <tcp-source-port>183</tcp-source-port>
         <tcp-destination-port>8080</tcp-destination-port>
     </match>
-</flow>
-
+</flow>
\ No newline at end of file
index ef286a6e41e00ad956cb72ad694d0ea17252d54c..dc1caaabed9254da6d57cc2a5b70aed4b84f0648 100644 (file)
@@ -6,9 +6,7 @@
     <cookie_mask>255</cookie_mask>
     <cookie>105</cookie>
     <table_id>2</table_id>
-    <priority>2</priority>
-    <hard-timeout>1200</hard-timeout>
-    <idle-timeout>3400</idle-timeout>
+    <priority>105</priority>
     <installHw>false</installHw>
     <instructions>
         <instruction>
@@ -43,5 +41,4 @@
         <tcp-source-port>20345</tcp-source-port>
         <tcp-destination-port>80</tcp-destination-port>
     </match>
-</flow>
-
+</flow>
\ No newline at end of file
index 5cac20d8508ee3cad66e31c90089ddb5a3c3928b..bfd290f5a5ea33bd9f1fea0914861ae362507c7c 100644 (file)
@@ -6,9 +6,7 @@
     <cookie_mask>255</cookie_mask>
     <cookie>106</cookie>
     <table_id>2</table_id>
-    <priority>2</priority>
-    <hard-timeout>1200</hard-timeout>
-    <idle-timeout>3400</idle-timeout>
+    <priority>106</priority>
     <installHw>false</installHw>
     <instructions>
         <instruction>
@@ -43,5 +41,4 @@
         <tcp-source-port>20345</tcp-source-port>
         <tcp-destination-port>80</tcp-destination-port>
     </match>
-</flow>
-
+</flow>
\ No newline at end of file
index 2fecf76a1928ee195d6978b45d14faa54bbe0a83..8f6899d00f00dd25613e578be4f37304cefcf710 100644 (file)
@@ -6,9 +6,7 @@
     <cookie_mask>255</cookie_mask>
     <cookie>107</cookie>
     <table_id>2</table_id>
-    <priority>2</priority>
-    <hard-timeout>1200</hard-timeout>
-    <idle-timeout>3400</idle-timeout>
+    <priority>107</priority>
     <installHw>false</installHw>
     <instructions>
         <instruction>
@@ -47,5 +45,4 @@
         <udp-destination-port>8080</udp-destination-port>
         <in-port>0</in-port>
     </match>
-</flow>
-
+</flow>
\ No newline at end of file
index 425f6ca939e5ecbbedbb61fab2225e8bdd369f22..427a54676e3273e715bbd6c9ed432d702c21fc89 100644 (file)
@@ -6,9 +6,7 @@
     <cookie_mask>255</cookie_mask>
     <cookie>108</cookie>
     <table_id>2</table_id>
-    <priority>2</priority>
-    <hard-timeout>1200</hard-timeout>
-    <idle-timeout>3400</idle-timeout>
+    <priority>108</priority>
     <installHw>false</installHw>
     <instructions>
         <instruction>
@@ -47,5 +45,4 @@
         <udp-destination-port>8080</udp-destination-port>
         <in-port>0</in-port>
     </match>
-</flow>
-
+</flow>
\ No newline at end of file
index 6424a515d29168bfbc60255f903ee61fa77b5071..4dc9b86f39ae64844515fb231c53d2f823f6c89d 100644 (file)
@@ -6,9 +6,7 @@
     <cookie_mask>255</cookie_mask>
     <cookie>109</cookie>
     <table_id>2</table_id>
-    <priority>2</priority>
-    <hard-timeout>1200</hard-timeout>
-    <idle-timeout>3400</idle-timeout>
+    <priority>109</priority>
     <installHw>false</installHw>
     <instructions>
         <instruction>
@@ -47,5 +45,4 @@
         <udp-destination-port>8080</udp-destination-port>
         <in-port>0</in-port>
     </match>
-</flow>
-
+</flow>
\ No newline at end of file
index bb2ad0cfd0f1c30b38ca8a52ebbb11469d0184c7..fb319079f3c69fd8383395dfd58eb9f7d2093a6a 100644 (file)
         </icmpv4-match>
         <in-port>0</in-port>
     </match>
-    <hard-timeout>1200</hard-timeout>
     <cookie>11</cookie>
-    <idle-timeout>3400</idle-timeout>
     <flow-name>FooXf11</flow-name>
-    <priority>2</priority>
-</flow>
-
+    <priority>11</priority>
+</flow>
\ No newline at end of file
index 7242ea73a00f1e89856414c33b9ea5b0ec877a56..2da1f8e24dd56de0b8b7edb40af1d548004e0893 100644 (file)
@@ -6,9 +6,7 @@
     <cookie_mask>255</cookie_mask>
     <cookie>201</cookie>
     <table_id>2</table_id>
-    <priority>2</priority>
-    <hard-timeout>1200</hard-timeout>
-    <idle-timeout>3400</idle-timeout>
+    <priority>110</priority>
     <installHw>false</installHw>
     <instructions>
         <instruction>
@@ -39,5 +37,4 @@
         <tcp-source-port>183</tcp-source-port>
         <tcp-destination-port>8080</tcp-destination-port>
     </match>
-</flow>
-
+</flow>
\ No newline at end of file
index e04131554127954addf3ed229883be085d4e7e04..405eb173bb76d7f6522df5ea896775233bbfa566 100644 (file)
         </ethernet-match>
         <ipv4-destination>10.0.0.1/24</ipv4-destination>
     </match>
-    <hard-timeout>12</hard-timeout>
     <cookie>10</cookie>
-    <idle-timeout>34</idle-timeout>
     <flow-name>pop-vlan-action</flow-name>
-    <priority>2</priority>
+    <priority>111</priority>
     <barrier>false</barrier>
-</flow>
+</flow>
\ No newline at end of file
index 90b94bb4dad3e1b893191ef0cb1e041f9f940e5b..5b33737b209a94d7f44b2d7c28d8575495e4f1df 100644 (file)
@@ -6,9 +6,7 @@
     <cookie_mask>255</cookie_mask>
     <cookie>101</cookie>
     <table_id>2</table_id>
-    <priority>2</priority>
-    <hard-timeout>1200</hard-timeout>
-    <idle-timeout>3400</idle-timeout>
+    <priority>112</priority>
     <installHw>false</installHw>
     <instructions>
         <instruction>
@@ -42,5 +40,4 @@
         <tcp-source-port>183</tcp-source-port>
         <tcp-destination-port>8080</tcp-destination-port>
     </match>
-</flow>
-
+</flow>
\ No newline at end of file
index f6b241141a04a4a2337e364f557f5153be464fea..0dc120b98a7817a7a80c6d397d28469824a6a5aa 100644 (file)
@@ -6,9 +6,7 @@
     <cookie_mask>255</cookie_mask>
     <cookie>401</cookie>
     <table_id>2</table_id>
-    <priority>8</priority>
-    <hard-timeout>1200</hard-timeout>
-    <idle-timeout>3400</idle-timeout>
+    <priority>113</priority>
     <installHw>false</installHw>
     <instructions>
         <instruction>
@@ -46,5 +44,4 @@
         <udp-destination-port>8080</udp-destination-port>
         <in-port>0</in-port>
     </match>
-</flow>
-
+</flow>
\ No newline at end of file
index 1a902b5632186bc6ac923b3a8c1b9286e6427e46..a3d1df27f768b7cb85822bda24cd12231d6fca85 100644 (file)
@@ -6,9 +6,7 @@
     <cookie_mask>255</cookie_mask>
     <cookie>889</cookie>
     <table_id>2</table_id>
-    <priority>8</priority>
-    <hard-timeout>1200</hard-timeout>
-    <idle-timeout>3400</idle-timeout>
+    <priority>114</priority>
     <installHw>false</installHw>
     <instructions>
         <instruction>
@@ -46,5 +44,4 @@
         <udp-destination-port>8080</udp-destination-port>
         <in-port>0</in-port>
     </match>
-</flow>
-
+</flow>
\ No newline at end of file
index dca57b44f60f4f60b84586bd6f147c7116b07661..c7fdad09443423377ae7ca650de4998ceab111aa 100644 (file)
         </ethernet-match>
         <arp-op>1</arp-op>
     </match>
-    <hard-timeout>12</hard-timeout>
     <cookie>12</cookie>
-    <idle-timeout>34</idle-timeout>
     <flow-name>FooXf12</flow-name>
-    <priority>2</priority>
+    <priority>12</priority>
     <barrier>false</barrier>
-</flow>
+</flow>
\ No newline at end of file
index d0ec611927f6b193a3b519e74bf34d77c4fe08f0..4941ef03c44560aab656a4a88c0ec6b3c5328d3e 100644 (file)
         <arp-source-transport-address>192.168.4.1</arp-source-transport-address>
         <arp-target-transport-address>10.21.22.23</arp-target-transport-address>
     </match>
-    <hard-timeout>12</hard-timeout>
     <cookie>13</cookie>
-    <idle-timeout>34</idle-timeout>
     <flow-name>FooXf13</flow-name>
-    <priority>2</priority>
+    <priority>13</priority>
     <barrier>false</barrier>
-</flow>
-
+</flow>
\ No newline at end of file
index 53ae6c8de4376c43acfcc4c1c33c71461c4ad0f1..1200583283b4bf23ef525429b000bd291502b261 100644 (file)
             <address>FE:DC:BA:98:76:54</address>
         </arp-target-hardware-address>
     </match>
-    <hard-timeout>12</hard-timeout>
     <cookie>14</cookie>
-    <idle-timeout>34</idle-timeout>
     <flow-name>FooXf14</flow-name>
-    <priority>2</priority>
+    <priority>14</priority>
     <barrier>false</barrier>
-</flow>
-
+</flow>
\ No newline at end of file
index ebd7e052ab9679c4a4f8b786187b2c1d2166f046..03920d8e5ccc138d82e56e328d43c268ea8b1fe7 100644 (file)
             </vlan-id>
         </vlan-match>
     </match>
-    <hard-timeout>1200</hard-timeout>
     <cookie>15</cookie>
-    <idle-timeout>3400</idle-timeout>
     <flow-name>FooXf15</flow-name>
-    <priority>2</priority>
+    <priority>15</priority>
     <barrier>false</barrier>
-</flow>
-
+</flow>
\ No newline at end of file
index 1dcd447d5cefeb7ec62e8f851fe717d9f08d464c..04bafd64e8642433975cb1bd4196624903b53cfa 100644 (file)
@@ -4,9 +4,7 @@
     <id>139</id>
     <cookie_mask>255</cookie_mask>
     <cookie>16</cookie>
-    <hard-timeout>1200</hard-timeout>
-    <idle-timeout>3400</idle-timeout>
-    <priority>2</priority>
+    <priority>16</priority>
     <table_id>2</table_id>
     <strict>false</strict>
     <instructions>
@@ -40,4 +38,4 @@
             <vlan-pcp>3</vlan-pcp>
         </vlan-match>
     </match>
-</flow>
+</flow>
\ No newline at end of file
index e2b1dec75755a3e7f59313b1163ad49fff2a6279..b7cf879f04e8c717ece54817463eb2a8fa274599 100644 (file)
@@ -4,9 +4,7 @@
     <id>140</id>
     <cookie_mask>255</cookie_mask>
     <cookie>17</cookie>
-    <hard-timeout>1200</hard-timeout>
-    <idle-timeout>3400</idle-timeout>
-    <priority>2</priority>
+    <priority>17</priority>
     <table_id>2</table_id>
     <strict>false</strict>
     <instructions>
@@ -38,4 +36,4 @@
             <mpls-bos>1</mpls-bos>
         </protocol-match-fields>
     </match>
-</flow>
+</flow>
\ No newline at end of file
index dc2804bbc18ebfdcee840a573e4e1f521da3a9b5..604cbc7d776672188834869c5607d6c932c47142 100644 (file)
@@ -6,9 +6,7 @@
     <cookie_mask>255</cookie_mask>
     <cookie>18</cookie>
     <table_id>2</table_id>
-    <priority>2</priority>
-    <hard-timeout>1200</hard-timeout>
-    <idle-timeout>3400</idle-timeout>
+    <priority>18</priority>
     <installHw>false</installHw>
     <instructions>
         <instruction>
@@ -30,5 +28,4 @@
         <ipv6-source>fe80::2acf:e9ff:fe21:6431/128</ipv6-source>
         <ipv6-destination>aabb:1234:2acf:e9ff::fe21:6431/64</ipv6-destination>
     </match>
-</flow>
-
+</flow>
\ No newline at end of file
index 789b9f9bd649b9da26c4331b6a708e4d37e13f8e..f5c414fc6ba5400c53392ff9f84eaae67fdcff1b 100644 (file)
@@ -6,9 +6,7 @@
     <cookie_mask>255</cookie_mask>
     <cookie>19</cookie>
     <table_id>2</table_id>
-    <priority>1</priority>
-    <hard-timeout>1200</hard-timeout>
-    <idle-timeout>3400</idle-timeout>
+    <priority>19</priority>
     <installHw>false</installHw>
     <instructions>
         <instruction>
@@ -29,4 +27,4 @@
             <metadata>12345</metadata>
         </metadata>
     </match>
-</flow>
+</flow>
\ No newline at end of file
index f56c0191eff0989feba22058e18b909b854c3020..c65bfcacf78c26c03f2d2aeedce1892faf14b885 100644 (file)
         </ethernet-match>
         <ipv4-source>10.0.0.1</ipv4-source>
     </match>
-    <hard-timeout>12</hard-timeout>
     <cookie>2</cookie>
-    <idle-timeout>34</idle-timeout>
     <flow-name>FooXf2</flow-name>
     <priority>2</priority>
     <barrier>false</barrier>
-</flow>
+</flow>
\ No newline at end of file
index 6e200d872b5c8752aef5610a798b43278796e630..7bda37af7ad0924198ef8248a2b6b5383bb71b23 100644 (file)
@@ -6,9 +6,7 @@
     <cookie_mask>255</cookie_mask>
     <cookie>20</cookie>
     <table_id>2</table_id>
-    <priority>2</priority>
-    <hard-timeout>1200</hard-timeout>
-    <idle-timeout>3400</idle-timeout>
+    <priority>20</priority>
     <installHw>false</installHw>
     <instructions>
         <instruction>
@@ -29,4 +27,4 @@
             <metadata-mask>1234578</metadata-mask>
         </metadata>
     </match>
-</flow>
+</flow>
\ No newline at end of file
index f1f7f46a2a6b100729206e49ea0d9527987840f4..b79244736d15fcde708496d39545f85785d49fd1 100644 (file)
@@ -6,9 +6,7 @@
     <cookie_mask>255</cookie_mask>
     <cookie>101</cookie>
     <table_id>2</table_id>
-    <priority>2</priority>
-    <hard-timeout>1200</hard-timeout>
-    <idle-timeout>3400</idle-timeout>
+    <priority>201</priority>
     <installHw>false</installHw>
     <instructions>
         <instruction>
@@ -41,5 +39,4 @@
         <tcp-source-port>183</tcp-source-port>
         <tcp-destination-port>8080</tcp-destination-port>
     </match>
-</flow>
-
+</flow>
\ No newline at end of file
index 21abaa3480c0a674b6839f1aee0939b33e05e268..1ddaf579f524244cf6c06b4354c563e02741a4f2 100644 (file)
@@ -6,9 +6,7 @@
     <cookie_mask>255</cookie_mask>
     <cookie>101</cookie>
     <table_id>2</table_id>
-    <priority>2</priority>
-    <hard-timeout>1200</hard-timeout>
-    <idle-timeout>3400</idle-timeout>
+    <priority>202</priority>
     <installHw>false</installHw>
     <instructions>
         <instruction>
@@ -41,5 +39,4 @@
         <tcp-source-port>183</tcp-source-port>
         <tcp-destination-port>8080</tcp-destination-port>
     </match>
-</flow>
-
+</flow>
\ No newline at end of file
index 6779409a62ac5f300b5aae65af60931429865714..37032e60e6529e971ca675cc02b26960f7fe01bf 100644 (file)
@@ -6,9 +6,7 @@
     <cookie_mask>255</cookie_mask>
     <cookie>101</cookie>
     <table_id>2</table_id>
-    <priority>2</priority>
-    <hard-timeout>1200</hard-timeout>
-    <idle-timeout>3400</idle-timeout>
+    <priority>203</priority>
     <installHw>false</installHw>
     <instructions>
         <instruction>
@@ -41,5 +39,4 @@
         <udp-source-port>183</udp-source-port>
         <udp-destination-port>8080</udp-destination-port>
     </match>
-</flow>
-
+</flow>
\ No newline at end of file
index 0b2901ac262b2a8127fe7c745d696abbd71c3c9a..1c9a718daea38e78986272837be00b63f6dbdc50 100644 (file)
@@ -6,9 +6,7 @@
     <cookie_mask>255</cookie_mask>
     <cookie>101</cookie>
     <table_id>2</table_id>
-    <priority>2</priority>
-    <hard-timeout>1200</hard-timeout>
-    <idle-timeout>3400</idle-timeout>
+    <priority>204</priority>
     <installHw>false</installHw>
     <instructions>
         <instruction>
@@ -41,5 +39,4 @@
         <udp-source-port>183</udp-source-port>
         <udp-destination-port>8080</udp-destination-port>
     </match>
-</flow>
-
+</flow>
\ No newline at end of file
index e12cb03cec5be2fd602292aeeef0b0d13b1028a1..2cc249c5c8ee696ba4af05f1799a7650d8c47b53 100644 (file)
         <sctp-destination-port>384</sctp-destination-port>
         <in-port>0</in-port>
     </match>
-    <hard-timeout>1200</hard-timeout>
     <cookie>10</cookie>
-    <idle-timeout>3400</idle-timeout>
     <flow-name>sctp-source-port-action</flow-name>
-    <priority>2</priority>
+    <priority>205</priority>
     <barrier>false</barrier>
-</flow>
+</flow>
\ No newline at end of file
index b1bf083ce92321dac97c50e69b395a56e99f81af..5b6a0543cad491d2f6aef29b0412b59db52990ac 100644 (file)
         <sctp-destination-port>384</sctp-destination-port>
         <in-port>0</in-port>
     </match>
-    <hard-timeout>1200</hard-timeout>
     <cookie>10</cookie>
-    <idle-timeout>3400</idle-timeout>
     <flow-name>sctp-destination-port</flow-name>
-    <priority>2</priority>
+    <priority>206</priority>
     <barrier>false</barrier>
-</flow>
+</flow>
\ No newline at end of file
index da1e2771f73014cecc90902dbe851058bccabc6f..a8efda6c025f09f34cbdbe6f32a8f57b210623a2 100644 (file)
@@ -6,9 +6,7 @@
     <cookie_mask>255</cookie_mask>
     <cookie>101</cookie>
     <table_id>2</table_id>
-    <priority>2</priority>
-    <hard-timeout>1200</hard-timeout>
-    <idle-timeout>3400</idle-timeout>
+    <priority>207</priority>
     <installHw>false</installHw>
     <instructions>
         <instruction>
@@ -42,5 +40,4 @@
         <tcp-source-port>183</tcp-source-port>
         <tcp-destination-port>8080</tcp-destination-port>
     </match>
-</flow>
-
+</flow>
\ No newline at end of file
index c05acdc481e5b66bb1607e575613ff2bf8190b0c..0ed364899b5f0c8f0b3a46e8b416c25ded746a0e 100644 (file)
@@ -6,9 +6,7 @@
     <cookie_mask>255</cookie_mask>
     <cookie>101</cookie>
     <table_id>2</table_id>
-    <priority>2</priority>
-    <hard-timeout>1200</hard-timeout>
-    <idle-timeout>3400</idle-timeout>
+    <priority>208</priority>
     <installHw>false</installHw>
     <instructions>
         <instruction>
@@ -42,5 +40,4 @@
         <tcp-source-port>183</tcp-source-port>
         <tcp-destination-port>8080</tcp-destination-port>
     </match>
-</flow>
-
+</flow>
\ No newline at end of file
index 6465bcca02ec70e38b32fa2b867219fcfeb8cdb5..617d33ba5893715fb53554a1d87e4088930e3390 100644 (file)
@@ -6,9 +6,7 @@
     <cookie_mask>255</cookie_mask>
     <cookie>101</cookie>
     <table_id>2</table_id>
-    <priority>2</priority>
-    <hard-timeout>1200</hard-timeout>
-    <idle-timeout>3400</idle-timeout>
+    <priority>209</priority>
     <installHw>false</installHw>
     <instructions>
         <instruction>
@@ -44,5 +42,4 @@
         <tcp-source-port>183</tcp-source-port>
         <tcp-destination-port>8080</tcp-destination-port>
     </match>
-</flow>
-
+</flow>
\ No newline at end of file
index 9357a8d4f349372d202818cedb46a1f84e4666d8..f7105884ba1b4a7e15d5e1483fd641a53184f36e 100644 (file)
@@ -6,9 +6,7 @@
     <cookie_mask>255</cookie_mask>
     <cookie>21</cookie>
     <table_id>2</table_id>
-    <priority>2</priority>
-    <hard-timeout>1200</hard-timeout>
-    <idle-timeout>3400</idle-timeout>
+    <priority>21</priority>
     <installHw>false</installHw>
     <instructions>
         <instruction>
@@ -40,4 +38,4 @@
         <udp-source-port>25364</udp-source-port>
         <udp-destination-port>8080</udp-destination-port>
     </match>
-</flow>
+</flow>
\ No newline at end of file
index cdcebb0f546c7000c7556c673aade9354131dc4b..fcd469080216f7fb6147c71291c76398c43a3c91 100644 (file)
@@ -1,39 +1,37 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>\r
-<flow xmlns="urn:opendaylight:flow:inventory">\r
-    <strict>false</strict>\r
-    <flow-name>set-field-ipv4-dst</flow-name>\r
-    <id>256</id>\r
-    <cookie_mask>255</cookie_mask>\r
-    <cookie>101</cookie>\r
-    <table_id>2</table_id>\r
-    <priority>2</priority>\r
-    <hard-timeout>1200</hard-timeout>\r
-    <idle-timeout>3400</idle-timeout>\r
-    <installHw>false</installHw>\r
-    <instructions>\r
-        <instruction>\r
-            <order>0</order>\r
-            <apply-actions>\r
-                <action>\r
-                    <order>0</order>\r
-                    <set-field>\r
-                        <ipv4-destination>10.2.3.4</ipv4-destination>\r
-                    </set-field>\r
-                </action>\r
-            </apply-actions>\r
-        </instruction>\r
-    </instructions>\r
-    <match>\r
-        <ethernet-match>\r
-            <ethernet-type>\r
-                <type>2048</type>\r
-            </ethernet-type>\r
-        </ethernet-match>\r
-        <ipv4-source>10.1.2.3/24</ipv4-source>\r
-        <ipv4-destination>20.4.5.6/16</ipv4-destination>\r
-               <ip-match>\r
-            <ip-protocol>56</ip-protocol>\r
-            <ip-ecn>1</ip-ecn>\r
-        </ip-match>\r
-    </match>\r
-</flow>\r
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<flow xmlns="urn:opendaylight:flow:inventory">
+    <strict>false</strict>
+    <flow-name>set-field-ipv4-dst</flow-name>
+    <id>256</id>
+    <cookie_mask>255</cookie_mask>
+    <cookie>101</cookie>
+    <table_id>2</table_id>
+    <priority>210</priority>
+    <installHw>false</installHw>
+    <instructions>
+        <instruction>
+            <order>0</order>
+            <apply-actions>
+                <action>
+                    <order>0</order>
+                    <set-field>
+                        <ipv4-destination>10.2.3.4</ipv4-destination>
+                    </set-field>
+                </action>
+            </apply-actions>
+        </instruction>
+    </instructions>
+    <match>
+        <ethernet-match>
+            <ethernet-type>
+                <type>2048</type>
+            </ethernet-type>
+        </ethernet-match>
+        <ipv4-source>10.1.2.3/24</ipv4-source>
+        <ipv4-destination>20.4.5.6/16</ipv4-destination>
+               <ip-match>
+            <ip-protocol>56</ip-protocol>
+            <ip-ecn>1</ip-ecn>
+        </ip-match>
+    </match>
+</flow>
\ No newline at end of file
index 7750e72d46329f2d74e9e477532fa8c9479d8889..6d6072e966b770fbf7d95b23c1105410054b1adf 100644 (file)
@@ -1,39 +1,37 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>\r
-<flow xmlns="urn:opendaylight:flow:inventory">\r
-    <strict>false</strict>\r
-    <flow-name>set-field-ipv4-src</flow-name>\r
-    <id>256</id>\r
-    <cookie_mask>255</cookie_mask>\r
-    <cookie>101</cookie>\r
-    <table_id>2</table_id>\r
-    <priority>2</priority>\r
-    <hard-timeout>1200</hard-timeout>\r
-    <idle-timeout>3400</idle-timeout>\r
-    <installHw>false</installHw>\r
-    <instructions>\r
-        <instruction>\r
-            <order>0</order>\r
-            <apply-actions>\r
-                <action>\r
-                    <order>0</order>\r
-                    <set-field>\r
-                       <ipv4-source>20.1.2.3</ipv4-source>\r
-                    </set-field>\r
-                </action>\r
-            </apply-actions>\r
-        </instruction>\r
-    </instructions>\r
-    <match>\r
-        <ethernet-match>\r
-            <ethernet-type>\r
-                <type>2048</type>\r
-            </ethernet-type>\r
-        </ethernet-match>\r
-        <ipv4-source>10.1.2.3/24</ipv4-source>\r
-        <ipv4-destination>20.4.5.6/16</ipv4-destination>\r
-               <ip-match>\r
-            <ip-protocol>56</ip-protocol>\r
-            <ip-ecn>1</ip-ecn>\r
-        </ip-match>\r
-    </match>\r
-</flow>\r
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<flow xmlns="urn:opendaylight:flow:inventory">
+    <strict>false</strict>
+    <flow-name>set-field-ipv4-src</flow-name>
+    <id>256</id>
+    <cookie_mask>255</cookie_mask>
+    <cookie>101</cookie>
+    <table_id>2</table_id>
+    <priority>211</priority>
+    <installHw>false</installHw>
+    <instructions>
+        <instruction>
+            <order>0</order>
+            <apply-actions>
+                <action>
+                    <order>0</order>
+                    <set-field>
+                       <ipv4-source>20.1.2.3</ipv4-source>
+                    </set-field>
+                </action>
+            </apply-actions>
+        </instruction>
+    </instructions>
+    <match>
+        <ethernet-match>
+            <ethernet-type>
+                <type>2048</type>
+            </ethernet-type>
+        </ethernet-match>
+        <ipv4-source>10.1.2.3/24</ipv4-source>
+        <ipv4-destination>20.4.5.6/16</ipv4-destination>
+               <ip-match>
+            <ip-protocol>56</ip-protocol>
+            <ip-ecn>1</ip-ecn>
+        </ip-match>
+    </match>
+</flow>
\ No newline at end of file
index 95e1532ee274957e20fafa96db93751583ab91b5..4e109e84927eae275f35dde9c8c2a662844e9c7f 100644 (file)
@@ -6,9 +6,7 @@
     <cookie_mask>255</cookie_mask>
     <cookie>101</cookie>
     <table_id>2</table_id>
-    <priority>2</priority>
-    <hard-timeout>1200</hard-timeout>
-    <idle-timeout>3400</idle-timeout>
+    <priority>212</priority>
     <installHw>false</installHw>
     <instructions>
         <instruction>
@@ -39,4 +37,4 @@
            <ip-ecn>1</ip-ecn>
         </ip-match>
     </match>
-</flow>
+</flow>
\ No newline at end of file
index a632f3bd0cd07ab44fab7997213369c643f7bed8..af65fd7096dede6630251650ec339c2070a5f285 100644 (file)
@@ -1,42 +1,40 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>\r
-<flow xmlns="urn:opendaylight:flow:inventory">\r
-    <strict>false</strict>\r
-    <flow-name>set-field-ip-dscp</flow-name>\r
-    <id>256</id>\r
-    <cookie_mask>255</cookie_mask>\r
-    <cookie>101</cookie>\r
-    <table_id>2</table_id>\r
-    <priority>2</priority>\r
-    <hard-timeout>1200</hard-timeout>\r
-    <idle-timeout>3400</idle-timeout>\r
-    <installHw>false</installHw>\r
-    <instructions>\r
-        <instruction>\r
-            <order>0</order>\r
-            <apply-actions>\r
-                <action>\r
-                    <order>0</order>\r
-                    <set-field>\r
-                   <ip-match>\r
-                       <ip-dscp>8</ip-dscp>\r
-                   </ip-match>\r
-                    </set-field>\r
-                </actin>\r
-            </apply-actions>\r
-        </instruction>\r
-    </instructions>\r
-    <match>\r
-        <ethernet-match>\r
-            <ethernet-type>\r
-                <type>2048</type>\r
-            </ethernet-type>\r
-        </ethernet-match>\r
-        <ipv4-source>10.1.2.3/24</ipv4-source>\r
-        <ipv4-destination>20.4.5.6/16</ipv4-destination>\r
-               <ip-match>\r
-            <ip-protocol>56</ip-protocol>\r
-            <ip-dscp>60</ip-dscp> \r
-           <ip-ecn>1</ip-ecn>\r
-        </ip-match>\r
-    </match>\r
-</flow>\r
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<flow xmlns="urn:opendaylight:flow:inventory">
+    <strict>false</strict>
+    <flow-name>set-field-ip-dscp</flow-name>
+    <id>256</id>
+    <cookie_mask>255</cookie_mask>
+    <cookie>101</cookie>
+    <table_id>2</table_id>
+    <priority>213</priority>
+    <installHw>false</installHw>
+    <instructions>
+        <instruction>
+            <order>0</order>
+            <apply-actions>
+                <action>
+                    <order>0</order>
+                    <set-field>
+                   <ip-match>
+                       <ip-dscp>8</ip-dscp>
+                   </ip-match>
+                    </set-field>
+                </actin>
+            </apply-actions>
+        </instruction>
+    </instructions>
+    <match>
+        <ethernet-match>
+            <ethernet-type>
+                <type>2048</type>
+            </ethernet-type>
+        </ethernet-match>
+        <ipv4-source>10.1.2.3/24</ipv4-source>
+        <ipv4-destination>20.4.5.6/16</ipv4-destination>
+               <ip-match>
+            <ip-protocol>56</ip-protocol>
+            <ip-dscp>60</ip-dscp> 
+           <ip-ecn>1</ip-ecn>
+        </ip-match>
+    </match>
+</flow>
\ No newline at end of file
index 5b236a7198035e1ecec42ab8cfd65295574aafe9..2d14b77b17645b8bb730920c456aa0a3117736e6 100644 (file)
@@ -1,42 +1,40 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>\r
-<flow xmlns="urn:opendaylight:flow:inventory">\r
-    <strict>false</strict>\r
-    <flow-name>set-field-ip-ecn</flow-name>\r
-    <id>256</id>\r
-    <cookie_mask>255</cookie_mask>\r
-    <cookie>101</cookie>\r
-    <table_id>2</table_id>\r
-    <priority>2</priority>\r
-    <hard-timeout>1200</hard-timeout>\r
-    <idle-timeout>3400</idle-timeout>\r
-    <installHw>false</installHw>\r
-    <instructions>\r
-        <instruction>\r
-            <order>0</order>\r
-            <apply-actions>\r
-                <action>\r
-                    <order>0</order>\r
-                    <set-field>\r
-                   <ip-match>\r
-                       <ip-ecn>2</ip-ecn>\r
-                   </ip-match>\r
-                    </set-field>\r
-                </action>\r
-            </apply-actions>\r
-        </instruction>\r
-    </instructions>\r
-    <match>\r
-        <ethernet-match>\r
-            <ethernet-type>\r
-                <type>2048</type>\r
-            </ethernet-type>\r
-        </ethernet-match>\r
-        <ipv4-source>10.1.2.3/24</ipv4-source>\r
-        <ipv4-destination>20.4.5.6/16</ipv4-destination>\r
-               <ip-match>\r
-            <ip-protocol>56</ip-protocol>\r
-            <ip-dscp>60</ip-dscp> \r
-           <ip-ecn>1</ip-ecn>\r
-        </ip-match>\r
-    </match>\r
-</flow>\r
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<flow xmlns="urn:opendaylight:flow:inventory">
+    <strict>false</strict>
+    <flow-name>set-field-ip-ecn</flow-name>
+    <id>256</id>
+    <cookie_mask>255</cookie_mask>
+    <cookie>101</cookie>
+    <table_id>2</table_id>
+    <priority>214</priority>
+    <installHw>false</installHw>
+    <instructions>
+        <instruction>
+            <order>0</order>
+            <apply-actions>
+                <action>
+                    <order>0</order>
+                    <set-field>
+                   <ip-match>
+                       <ip-ecn>2</ip-ecn>
+                   </ip-match>
+                    </set-field>
+                </action>
+            </apply-actions>
+        </instruction>
+    </instructions>
+    <match>
+        <ethernet-match>
+            <ethernet-type>
+                <type>2048</type>
+            </ethernet-type>
+        </ethernet-match>
+        <ipv4-source>10.1.2.3/24</ipv4-source>
+        <ipv4-destination>20.4.5.6/16</ipv4-destination>
+               <ip-match>
+            <ip-protocol>56</ip-protocol>
+            <ip-dscp>60</ip-dscp> 
+           <ip-ecn>1</ip-ecn>
+        </ip-match>
+    </match>
+</flow>
\ No newline at end of file
index 992d867e6998cd3ce30b490a2538db617cdc187b..67abb02617a23089bd83c88a61e39fb5bddf27e3 100644 (file)
@@ -1,39 +1,37 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>\r
-<flow \r
-    xmlns="urn:opendaylight:flow:inventory">\r
-    <strict>false</strict>\r
-    <instructions>\r
-        <instruction>\r
-            <order>0</order>\r
-            <apply-actions>\r
-                <action>\r
-                    <order>0</order>\r
-                    <push-pbb-action>\r
-                        <ethernet-type>35047</ethernet-type>\r
-                    </push-pbb-action>\r
-                </action>\r
-            </apply-actions>\r
-        </instruction>\r
-    </instructions>\r
-    <table_id>2</table_id>\r
-    <id>172</id>\r
-    <cookie_mask>10</cookie_mask>\r
-    <out_port>10</out_port>\r
-    <installHw>false</installHw>\r
-    <out_group>2</out_group>\r
-    <match>\r
-        <vlan-match>\r
-            <vlan-id>\r
-                <vlan-id>10</vlan-id>\r
-                <vlan-id-present>true</vlan-id-present>\r
-            </vlan-id>\r
-            <vlan-pcp>3</vlan-pcp>\r
-        </vlan-match>\r
-    </match>\r
-    <hard-timeout>0</hard-timeout>\r
-    <cookie>10</cookie>\r
-    <idle-timeout>0</idle-timeout>\r
-    <flow-name>flow-instruction-apply-actions-push-pbb</flow-name>\r
-    <priority>2</priority>\r
-    <barrier>false</barrier>\r
-</flow>\r
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<flow 
+    xmlns="urn:opendaylight:flow:inventory">
+    <strict>false</strict>
+    <instructions>
+        <instruction>
+            <order>0</order>
+            <apply-actions>
+                <action>
+                    <order>0</order>
+                    <push-pbb-action>
+                        <ethernet-type>35047</ethernet-type>
+                    </push-pbb-action>
+                </action>
+            </apply-actions>
+        </instruction>
+    </instructions>
+    <table_id>2</table_id>
+    <id>172</id>
+    <cookie_mask>10</cookie_mask>
+    <out_port>10</out_port>
+    <installHw>false</installHw>
+    <out_group>2</out_group>
+    <match>
+        <vlan-match>
+            <vlan-id>
+                <vlan-id>10</vlan-id>
+                <vlan-id-present>true</vlan-id-present>
+            </vlan-id>
+            <vlan-pcp>3</vlan-pcp>
+        </vlan-match>
+    </match>
+    <cookie>10</cookie>
+    <flow-name>flow-instruction-apply-actions-push-pbb</flow-name>
+    <priority>215</priority>
+    <barrier>false</barrier>
+</flow>
\ No newline at end of file
index 8a0256528b1971e31a2473d5c5fd7c9c6b03d2af..fa95c3da70c1b1bde034f6b51a0a841541b518a2 100644 (file)
@@ -1,37 +1,35 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>\r
-<flow \r
-    xmlns="urn:opendaylight:flow:inventory">\r
-    <strict>false</strict>\r
-    <instructions>\r
-        <instruction>\r
-            <order>0</order>\r
-            <apply-actions>\r
-                <action>\r
-                    <order>0</order>\r
-                    <pop-pbb-action/>\r
-                </action>\r
-            </apply-actions>\r
-        </instruction>\r
-    </instructions>\r
-    <table_id>2</table_id>\r
-    <id>172</id>\r
-    <cookie_mask>10</cookie_mask>\r
-    <out_port>10</out_port>\r
-    <installHw>false</installHw>\r
-    <out_group>2</out_group>\r
-    <match>\r
-        <vlan-match>\r
-            <vlan-id>\r
-                <vlan-id>10</vlan-id>\r
-                <vlan-id-present>true</vlan-id-present>\r
-            </vlan-id>\r
-            <vlan-pcp>3</vlan-pcp>\r
-        </vlan-match>\r
-    </match>\r
-    <hard-timeout>0</hard-timeout>\r
-    <cookie>10</cookie>\r
-    <idle-timeout>0</idle-timeout>\r
-    <flow-name>flow-instruction-apply-actions-pop-pbb</flow-name>\r
-    <priority>2</priority>\r
-    <barrier>false</barrier>\r
-</flow>\r
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<flow 
+    xmlns="urn:opendaylight:flow:inventory">
+    <strict>false</strict>
+    <instructions>
+        <instruction>
+            <order>0</order>
+            <apply-actions>
+                <action>
+                    <order>0</order>
+                    <pop-pbb-action/>
+                </action>
+            </apply-actions>
+        </instruction>
+    </instructions>
+    <table_id>2</table_id>
+    <id>172</id>
+    <cookie_mask>10</cookie_mask>
+    <out_port>10</out_port>
+    <installHw>false</installHw>
+    <out_group>2</out_group>
+    <match>
+        <vlan-match>
+            <vlan-id>
+                <vlan-id>10</vlan-id>
+                <vlan-id-present>true</vlan-id-present>
+            </vlan-id>
+            <vlan-pcp>3</vlan-pcp>
+        </vlan-match>
+    </match>
+    <cookie>10</cookie>
+    <flow-name>flow-instruction-apply-actions-pop-pbb</flow-name>
+    <priority>216</priority>
+    <barrier>false</barrier>
+</flow>
\ No newline at end of file
index 6540d36546db7857c1dad0941f20fda9355fc2d2..8ecfb2fcf3157023a89395732f4a18944c965dc1 100644 (file)
@@ -1,34 +1,32 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>\r
-<flow \r
-    xmlns="urn:opendaylight:flow:inventory">\r
-    <strict>false</strict>\r
-    <instructions>\r
-        <instruction>\r
-            <order>0</order>\r
-            <meter>\r
-                <meter-id>1</meter-id>\r
-            </meter>\r
-        </instruction>\r
-    </instructions>\r
-    <table_id>2</table_id>\r
-    <id>172</id>\r
-    <cookie_mask>10</cookie_mask>\r
-    <out_port>10</out_port>\r
-    <installHw>false</installHw>\r
-    <out_group>2</out_group>\r
-    <match>\r
-        <vlan-match>\r
-            <vlan-id>\r
-                <vlan-id>10</vlan-id>\r
-                <vlan-id-present>true</vlan-id-present>\r
-            </vlan-id>\r
-            <vlan-pcp>3</vlan-pcp>\r
-        </vlan-match>\r
-    </match>\r
-    <hard-timeout>0</hard-timeout>\r
-   <cookie>10</cookie>\r
-    <idle-timeout>0</idle-timeout>\r
-    <flow-name>flow-instruction-meter-id</flow-name>\r
-    <priority>2</priority>\r
-    <barrier>false</barrier>\r
-</flow>\r
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<flow 
+    xmlns="urn:opendaylight:flow:inventory">
+    <strict>false</strict>
+    <instructions>
+        <instruction>
+            <order>0</order>
+            <meter>
+                <meter-id>1</meter-id>
+            </meter>
+        </instruction>
+    </instructions>
+    <table_id>2</table_id>
+    <id>172</id>
+    <cookie_mask>10</cookie_mask>
+    <out_port>10</out_port>
+    <installHw>false</installHw>
+    <out_group>2</out_group>
+    <match>
+        <vlan-match>
+            <vlan-id>
+                <vlan-id>10</vlan-id>
+                <vlan-id-present>true</vlan-id-present>
+            </vlan-id>
+            <vlan-pcp>3</vlan-pcp>
+        </vlan-match>
+    </match>
+   <cookie>10</cookie>
+    <flow-name>flow-instruction-meter-id</flow-name>
+    <priority>217</priority>
+    <barrier>false</barrier>
+</flow>
\ No newline at end of file
index 6a116d50b60aebda7448fcf1dd98e469bda1e67d..d983f75e1e04f8ec3df1b428a3e99f0cc1f5775f 100644 (file)
@@ -1,30 +1,28 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>\r
-<flow xmlns="urn:opendaylight:flow:inventory">\r
-    <strict>false</strict>\r
-    <instructions>\r
-        <instruction>\r
-                    <order>0</order>\r
-            <go-to-table>\r
-                <table_id>3</table_id>\r
-            </go-to-table>\r
-        </instruction>\r
-    </instructions>\r
-    <table_id>2</table_id>\r
-    <id>171</id>\r
-    <cookie_mask>10</cookie_mask>\r
-    <out_port>10</out_port>\r
-    <installHw>false</installHw>\r
-    <out_group>2</out_group>\r
-    <match>\r
-        <tunnel>\r
-            <tunnel-mask>6B6f7d120c</tunnel-mask>\r
-            <tunnel-id>10668</tunnel-id>\r
-        </tunnel>\r
-    </match>\r
-    <hard-timeout>12</hard-timeout>\r
-    <cookie>10</cookie>\r
-    <idle-timeout>34</idle-timeout>\r
-    <flow-name>flow-instruction-go-to-table</flow-name>\r
-    <priority>2</priority>\r
-    <barrier>false</barrier>\r
-</flow>\r
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<flow xmlns="urn:opendaylight:flow:inventory">
+    <strict>false</strict>
+    <instructions>
+        <instruction>
+                    <order>0</order>
+            <go-to-table>
+                <table_id>3</table_id>
+            </go-to-table>
+        </instruction>
+    </instructions>
+    <table_id>2</table_id>
+    <id>171</id>
+    <cookie_mask>10</cookie_mask>
+    <out_port>10</out_port>
+    <installHw>false</installHw>
+    <out_group>2</out_group>
+    <match>
+        <tunnel>
+            <tunnel-mask>6B6f7d120c</tunnel-mask>
+            <tunnel-id>10668</tunnel-id>
+        </tunnel>
+    </match>
+    <cookie>10</cookie>
+    <flow-name>flow-instruction-go-to-table</flow-name>
+    <priority>218</priority>
+    <barrier>false</barrier>
+</flow>
\ No newline at end of file
index 5f9227d322c2d5fec804f87678790e3aee987914..9f89d82ca42e3b40b9cc5068f58db9ce74f38a6b 100644 (file)
@@ -1,39 +1,37 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>\r
-<flow xmlns="urn:opendaylight:flow:inventory">\r
-    <strict>false</strict>\r
-    <instructions>\r
-        <instruction>\r
-               <order>0</order>\r
-               <clear-actions>\r
-               <action>\r
-                    <order>0</order>\r
-                    <output-action>\r
-                        <output-node-connector>INPORT</output-node-connector>\r
-                        <max-length>60</max-length>\r
-                    </output-action>\r
-                </action>\r
-               </clear-actions>\r
-       </instruction>\r
-    </instructions>\r
-    <table_id>2</table_id>\r
-    <id>172</id>\r
-    <cookie_mask>10</cookie_mask>\r
-    <out_port>10</out_port>\r
-    <installHw>false</installHw>\r
-    <out_group>2</out_group>\r
-    <match>\r
-        <vlan-match>\r
-            <vlan-id>\r
-                <vlan-id>10</vlan-id>\r
-                <vlan-id-present>true</vlan-id-present>\r
-            </vlan-id>\r
-            <vlan-pcp>3</vlan-pcp>\r
-        </vlan-match>\r
-    </match>\r
-    <hard-timeout>0</hard-timeout>\r
-    <cookie>10</cookie>\r
-    <idle-timeout>0</idle-timeout>\r
-    <flow-name>flow-instruction-clear-actions</flow-name>\r
-    <priority>2</priority>\r
-    <barrier>false</barrier>\r
-</flow>\r
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<flow xmlns="urn:opendaylight:flow:inventory">
+    <strict>false</strict>
+    <instructions>
+        <instruction>
+               <order>0</order>
+               <clear-actions>
+               <action>
+                    <order>0</order>
+                    <output-action>
+                        <output-node-connector>INPORT</output-node-connector>
+                        <max-length>60</max-length>
+                    </output-action>
+                </action>
+               </clear-actions>
+       </instruction>
+    </instructions>
+    <table_id>2</table_id>
+    <id>172</id>
+    <cookie_mask>10</cookie_mask>
+    <out_port>10</out_port>
+    <installHw>false</installHw>
+    <out_group>2</out_group>
+    <match>
+        <vlan-match>
+            <vlan-id>
+                <vlan-id>10</vlan-id>
+                <vlan-id-present>true</vlan-id-present>
+            </vlan-id>
+            <vlan-pcp>3</vlan-pcp>
+        </vlan-match>
+    </match>
+    <cookie>10</cookie>
+    <flow-name>flow-instruction-clear-actions</flow-name>
+    <priority>219</priority>
+    <barrier>false</barrier>
+</flow>
\ No newline at end of file
index 1eb84586b86cf39469765c67c6afe86586027e8e..054c2e281ced48fbf06213c03aa6b8c81bdc6c21 100644 (file)
@@ -6,9 +6,7 @@
     <cookie_mask>255</cookie_mask>
     <cookie>22</cookie>
     <table_id>2</table_id>
-    <priority>2</priority>
-    <hard-timeout>1200</hard-timeout>
-    <idle-timeout>3400</idle-timeout>
+    <priority>22</priority>
     <installHw>false</installHw>
     <instructions>
         <instruction>
@@ -40,5 +38,4 @@
         <tcp-source-port>183</tcp-source-port>
         <tcp-destination-port>8080</tcp-destination-port>
     </match>
-</flow>
-
+</flow>
\ No newline at end of file
index 8a9c9ac2042884c939347c0359fca884a74ada03..45887ae004b2c6bfefcebc571b7081a30b3ec9a2 100644 (file)
@@ -1,33 +1,31 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>\r
-<flow xmlns="urn:opendaylight:flow:inventory">\r
-    <strict>false</strict>\r
-    <instructions>\r
-        <instruction>\r
-                    <order>0</order>\r
-            <write-metadata>\r
-                <metadata-mask>12</metadata-mask>\r
-                <metadata>10</metadata>\r
-            </write-metadata>\r
-        </instruction>\r
-    </instructions>\r
-    <table_id>2</table_id>\r
-    <id>150</id>\r
-    <cookie_mask>10</cookie_mask>\r
-    <out_port>10</out_port>\r
-    <installHw>false</installHw>\r
-    <out_group>2</out_group>\r
-    <match>\r
-        <ethernet-match>\r
-            <ethernet-type>\r
-                <type>2048</type>\r
-            </ethernet-type>\r
-        </ethernet-match>\r
-        <ipv4-destination>10.0.0.1/24</ipv4-destination>\r
-    </match>\r
-    <hard-timeout>12</hard-timeout>\r
-    <cookie>10</cookie>\r
-    <idle-timeout>34</idle-timeout>\r
-    <flow-name>flow-instruction-write-metadata</flow-name>\r
-    <priority>2</priority>\r
-    <barrier>false</barrier>\r
-</flow>\r
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<flow xmlns="urn:opendaylight:flow:inventory">
+    <strict>false</strict>
+    <instructions>
+        <instruction>
+                    <order>0</order>
+            <write-metadata>
+                <metadata-mask>12</metadata-mask>
+                <metadata>10</metadata>
+            </write-metadata>
+        </instruction>
+    </instructions>
+    <table_id>2</table_id>
+    <id>150</id>
+    <cookie_mask>10</cookie_mask>
+    <out_port>10</out_port>
+    <installHw>false</installHw>
+    <out_group>2</out_group>
+    <match>
+        <ethernet-match>
+            <ethernet-type>
+                <type>2048</type>
+            </ethernet-type>
+        </ethernet-match>
+        <ipv4-destination>10.0.0.1/24</ipv4-destination>
+    </match>
+    <cookie>10</cookie>
+    <flow-name>flow-instruction-write-metadata</flow-name>
+    <priority>220</priority>
+    <barrier>false</barrier>
+</flow>
\ No newline at end of file
index 42e6ebc153b200bf448a9aadd91707fd4bf774c9..52addc675373a595175da83454972c0731b6d0aa 100644 (file)
@@ -1,45 +1,43 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>\r
-<flow xmlns="urn:opendaylight:flow:inventory">\r
-    <strict>false</strict>\r
-    <instructions>\r
-        <instruction>\r
-            <order>0</order>\r
-           <write-actions>\r
-               <action>\r
-                    <order>0</order>\r
-                   <dec-mpls-ttl/>\r
-                </action>\r
-           </write-actions>\r
-            <apply-actions>\r
-                <action>\r
-                    <order>0</order>\r
-                    <output-action>\r
-                        <output-node-connector>1</output-node-connector>\r
-                        <max-length>60</max-length>\r
-                    </output-action>\r
-                </action>\r
-            </apply-actions>\r
-       </instruction>\r
-    </instructions>\r
-    <table_id>2</table_id>\r
-    <id>172</id>\r
-    <cookie_mask>10</cookie_mask>\r
-    <out_port>10</out_port>\r
-    <installHw>false</installHw>\r
-    <out_group>2</out_group>\r
-    <match>\r
-        <vlan-match>\r
-            <vlan-id>\r
-                <vlan-id>10</vlan-id>\r
-                <vlan-id-present>true</vlan-id-present>\r
-            </vlan-id>\r
-            <vlan-pcp>3</vlan-pcp>\r
-        </vlan-match>\r
-    </match>\r
-    <hard-timeout>0</hard-timeout>\r
-    <cookie>10</cookie>\r
-    <idle-timeout>0</idle-timeout>\r
-    <flow-name>flow-instruction-write-actions</flow-name>\r
-    <priority>2</priority>\r
-    <barrier>false</barrier>\r
-</flow>\r
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<flow xmlns="urn:opendaylight:flow:inventory">
+    <strict>false</strict>
+    <instructions>
+        <instruction>
+            <order>0</order>
+           <write-actions>
+               <action>
+                    <order>0</order>
+                   <dec-mpls-ttl/>
+                </action>
+           </write-actions>
+            <apply-actions>
+                <action>
+                    <order>0</order>
+                    <output-action>
+                        <output-node-connector>1</output-node-connector>
+                        <max-length>60</max-length>
+                    </output-action>
+                </action>
+            </apply-actions>
+       </instruction>
+    </instructions>
+    <table_id>2</table_id>
+    <id>172</id>
+    <cookie_mask>10</cookie_mask>
+    <out_port>10</out_port>
+    <installHw>false</installHw>
+    <out_group>2</out_group>
+    <match>
+        <vlan-match>
+            <vlan-id>
+                <vlan-id>10</vlan-id>
+                <vlan-id-present>true</vlan-id-present>
+            </vlan-id>
+            <vlan-pcp>3</vlan-pcp>
+        </vlan-match>
+    </match>
+    <cookie>10</cookie>
+    <flow-name>flow-instruction-write-actions</flow-name>
+    <priority>221</priority>
+    <barrier>false</barrier>
+</flow>
\ No newline at end of file
index 0f4e119b34b8d228d01b3efff8484926ec26bce5..d4665e127b469938aff09b295819abcfbc059c7c 100644 (file)
@@ -6,9 +6,7 @@
     <cookie_mask>255</cookie_mask>
     <cookie>23</cookie>
     <table_id>2</table_id>
-    <priority>2</priority>
-    <hard-timeout>1200</hard-timeout>
-    <idle-timeout>3400</idle-timeout>
+    <priority>23</priority>
     <installHw>false</installHw>
     <instructions>
         <instruction>
@@ -43,4 +41,4 @@
         <tcp-source-port>183</tcp-source-port>
         <tcp-destination-port>8080</tcp-destination-port>
     </match>
-</flow>
+</flow>
\ No newline at end of file
index 9cd5e74f1a562cf0973a22b6b4c36b07b05ae031..8cabce446ffcfcc34d9b09ed8e9dda4f1f9175cb 100644 (file)
@@ -6,9 +6,7 @@
     <cookie_mask>255</cookie_mask>
     <cookie>24</cookie>
     <table_id>2</table_id>
-    <priority>2</priority>
-    <hard-timeout>1200</hard-timeout>
-    <idle-timeout>3400</idle-timeout>
+    <priority>24</priority>
     <installHw>false</installHw>
     <instructions>
         <instruction>
@@ -28,5 +26,4 @@
             <tunnel-id>2591</tunnel-id>
         </tunnel>
     </match>
-</flow>
-
+</flow>
\ No newline at end of file
index a82539bc620a5a9fb8ff99bf91b6f41c15d5f705..686bd7c7785fe6f4e491aa74d0d7e33374c5dfcc 100644 (file)
@@ -6,9 +6,7 @@
     <cookie_mask>255</cookie_mask>
     <cookie>25</cookie>
     <table_id>2</table_id>
-    <priority>2</priority>
-    <hard-timeout>1200</hard-timeout>
-    <idle-timeout>3400</idle-timeout>
+    <priority>25</priority>
     <installHw>false</installHw>
     <instructions>
         <instruction>
@@ -45,4 +43,4 @@
             <icmpv6-code>3</icmpv6-code>
         </icmpv6-match>
     </match>
-</flow>
+</flow>
\ No newline at end of file
index 59c529758ba1e18508306dabef5911e8a110d9d5..5bf313fb19bbad6c53f992ae30378b65be6c7cc1 100644 (file)
@@ -6,9 +6,7 @@
     <cookie_mask>255</cookie_mask>
     <cookie>26</cookie>
     <table_id>2</table_id>
-    <priority>2</priority>
-    <hard-timeout>1200</hard-timeout>
-    <idle-timeout>3400</idle-timeout>
+    <priority>26</priority>
     <installHw>false</installHw>
     <instructions>
         <instruction>
@@ -43,4 +41,4 @@
         <tcp-source-port>183</tcp-source-port>
         <tcp-destination-port>8080</tcp-destination-port>
     </match>
-</flow>
+</flow>
\ No newline at end of file
index 134e1c97cb33a4097c306d947b2693e98fcbc149..1957495a1aa5229232d37a42553835d020248c5b 100644 (file)
@@ -6,9 +6,7 @@
     <cookie_mask>255</cookie_mask>
     <cookie>27</cookie>
     <table_id>2</table_id>
-    <priority>2</priority>
-    <hard-timeout>1200</hard-timeout>
-    <idle-timeout>3400</idle-timeout>
+    <priority>27</priority>
     <installHw>false</installHw>
     <instructions>
         <instruction>
@@ -46,5 +44,4 @@
         <tcp-source-port>183</tcp-source-port>
         <tcp-destination-port>8080</tcp-destination-port>
     </match>
-</flow>
-
+</flow>
\ No newline at end of file
index 779fcbfe1ab6c999b74c9a52660ab3a3fe01fe14..12e52b38525bee203c92f50cfbf2ca9f96494a1b 100644 (file)
@@ -4,9 +4,7 @@
     <id>151</id>
     <cookie_mask>255</cookie_mask>
     <cookie>28</cookie>
-    <hard-timeout>1200</hard-timeout>
-    <idle-timeout>3400</idle-timeout>
-    <priority>2</priority>
+    <priority>28</priority>
     <table_id>2</table_id>
     <strict>false</strict>
     <instructions>
@@ -38,5 +36,4 @@
             </pbb>
         </protocol-match-fields>
     </match>
-</flow>
-
+</flow>
\ No newline at end of file
index fba2756f405a1624d611e33767a1ebf426d25d1b..5f30c9e0cceaa4fb54f3efa4c65d941eabbf666c 100644 (file)
         </ethernet-match>
         <ipv4-destination>10.0.0.0/24</ipv4-destination>
     </match>
-    <hard-timeout>12</hard-timeout>
     <cookie>10</cookie>
-    <idle-timeout>34</idle-timeout>
     <flow-name>FooXf29</flow-name>
-    <priority>2</priority>
+    <priority>29</priority>
     <barrier>false</barrier>
-</flow>
+</flow>
\ No newline at end of file
index 22b37501d949461fce96b42db0e612cf1ca4bb38..5180522cb70d251ac76e32d0fc13f9bff80c4852 100644 (file)
             </ethernet-source>
         </ethernet-match>
     </match>
-    <hard-timeout>12</hard-timeout>
     <cookie>3</cookie>
-    <idle-timeout>34</idle-timeout>
     <flow-name>FooXf3</flow-name>
-    <priority>2</priority>
+    <priority>3</priority>
     <barrier>false</barrier>
-</flow>
+</flow>
\ No newline at end of file
index e3052968bab7712114b243936df82d529c76873c..4370497b55dbf0f9de0ff4bcadf83329e04d906f 100644 (file)
         </ethernet-match>
         <ipv4-destination>10.0.0.0/24</ipv4-destination>
     </match>
-    <hard-timeout>12</hard-timeout>
     <cookie>30</cookie>
-    <idle-timeout>34</idle-timeout>
     <flow-name>FooXf30</flow-name>
-    <priority>2</priority>
+    <priority>30</priority>
     <barrier>false</barrier>
-</flow>
+</flow>
\ No newline at end of file
index 80c65311a817c2a0cbd47d0c85d7d6f8894d48fa..14916deb14848d39e3ce04d0973a86583855fc35 100644 (file)
         </ethernet-match>
         <ipv4-destination>10.0.0.0/24</ipv4-destination>
     </match>
-    <hard-timeout>12</hard-timeout>
     <cookie>10</cookie>
-    <idle-timeout>34</idle-timeout>
     <flow-name>FooXf31</flow-name>
-    <priority>2</priority>
+    <priority>31</priority>
     <barrier>false</barrier>
-</flow>
+</flow>
\ No newline at end of file
index e33fd29a2b9891b742da21f8706dcb680cf3f5dc..4ab4519e2aa87cb0e320ddd4d7e9915917c6b750 100644 (file)
         </ethernet-match>
         <ipv4-destination>10.0.0.0/24</ipv4-destination>
     </match>
-    <hard-timeout>12</hard-timeout>
     <cookie>10</cookie>
-    <idle-timeout>34</idle-timeout>
     <flow-name>FooXf32</flow-name>
-    <priority>2</priority>
+    <priority>32</priority>
     <barrier>false</barrier>
-</flow>
+</flow>
\ No newline at end of file
index 300728bf7b67f29cb9879d45de5f71c4dc20ba0d..94240850b0f06edb25fb266053dde182c032ef01 100644 (file)
         </ethernet-match>
         <ipv4-destination>10.0.0.0/24</ipv4-destination>
     </match>
-    <hard-timeout>12</hard-timeout>
     <cookie>10</cookie>
-    <idle-timeout>34</idle-timeout>
     <flow-name>FooXf33</flow-name>
-    <priority>2</priority>
+    <priority>33</priority>
     <barrier>false</barrier>
-</flow>
+</flow>
\ No newline at end of file
index e3aa762ef645cc480c064f20c4e31eb423d81dc8..e2e2f514b0fdb3f7cd79c2add5ece84bf18f3b78 100644 (file)
         </ethernet-match>
         <ipv4-destination>10.0.0.0/24</ipv4-destination>
     </match>
-    <hard-timeout>12</hard-timeout>
     <cookie>10</cookie>
-    <idle-timeout>34</idle-timeout>
     <flow-name>FooXf34</flow-name>
-    <priority>2</priority>
+    <priority>34</priority>
     <barrier>false</barrier>
-</flow>
+</flow>
\ No newline at end of file
index ab4caaef0ea63308f1993b16bb1dd86534131896..75337358130e35aece646e55d3f66fbcb6c9e690 100644 (file)
         </ethernet-match>
         <ipv4-destination>10.0.0.0/24</ipv4-destination>
     </match>
-    <hard-timeout>12</hard-timeout>
     <cookie>10</cookie>
-    <idle-timeout>34</idle-timeout>
     <flow-name>FooXf35</flow-name>
-    <priority>2</priority>
+    <priority>35</priority>
     <barrier>false</barrier>
-</flow>
+</flow>
\ No newline at end of file
index ae8f58cef04a4dd55308d9ce2c181e52468860fb..c09a375c9ca721a78761539491ad4ced5796565d 100644 (file)
         </ethernet-match>
         <ipv4-destination>10.0.0.0/24</ipv4-destination>
     </match>
-    <hard-timeout>12</hard-timeout>
     <cookie>36</cookie>
-    <idle-timeout>34</idle-timeout>
     <flow-name>FooXf36</flow-name>
-    <priority>2</priority>
+    <priority>36</priority>
     <barrier>false</barrier>
-</flow>
+</flow>
\ No newline at end of file
index 845db26becd19566ab5e23c17e6c4d7d2da6330d..b128a1cddee26f1d872767f9176fde38c69d5fdd 100644 (file)
         </ethernet-match>
         <ipv4-destination>10.0.0.0/24</ipv4-destination>
     </match>
-    <hard-timeout>12</hard-timeout>
     <cookie>10</cookie>
-    <idle-timeout>34</idle-timeout>
     <flow-name>FooXf37</flow-name>
-    <priority>2</priority>
+    <priority>37</priority>
     <barrier>false</barrier>
-</flow>
+</flow>
\ No newline at end of file
index 8fd844bc2753dc7b947eb904877bbce211c7c303..ddf5813db920bf223a5e522b7d865d178633f44c 100644 (file)
         </ethernet-match>
         <ipv4-destination>10.0.0.0/24</ipv4-destination>
     </match>
-    <hard-timeout>12</hard-timeout>
     <cookie>10</cookie>
-    <idle-timeout>34</idle-timeout>
     <flow-name>FooXf38</flow-name>
-    <priority>2</priority>
+    <priority>38</priority>
     <barrier>false</barrier>
-</flow>
+</flow>
\ No newline at end of file
index 502fa77aa292d902650b81d318da408a795fb043..4a68a9eb03d07cd5334660aff16b23e7d4b4d404 100644 (file)
         </ethernet-match>
         <ipv4-destination>10.0.0.0/24</ipv4-destination>
     </match>
-    <hard-timeout>12</hard-timeout>
     <cookie>10</cookie>
-    <idle-timeout>34</idle-timeout>
     <flow-name>FooXf39</flow-name>
-    <priority>2</priority>
+    <priority>39</priority>
     <barrier>false</barrier>
-</flow>
+</flow>
\ No newline at end of file
index 8797f3122c5b65924e8636811e04f44834394c11..a481a5262958b213fe25947045e1030eacc586df 100644 (file)
             </ethernet-source>
         </ethernet-match>
     </match>
-    <hard-timeout>12</hard-timeout>
     <cookie>4</cookie>
-    <idle-timeout>34</idle-timeout>
     <flow-name>FooXf4</flow-name>
-    <priority>2</priority>
+    <priority>4</priority>
     <barrier>false</barrier>
-</flow>
+</flow>
\ No newline at end of file
index e95dc7862d7fcd1bbc23839e81ea1caeb7bc7f5a..15f724438e288eeac94920a022e2dd6253199d40 100644 (file)
         </ethernet-match>
         <ipv4-destination>10.0.0.0/24</ipv4-destination>
     </match>
-    <hard-timeout>12</hard-timeout>
     <cookie>10</cookie>
-    <idle-timeout>34</idle-timeout>
     <flow-name>FooXf40</flow-name>
-    <priority>2</priority>
+    <priority>40</priority>
     <barrier>false</barrier>
-</flow>
+</flow>
\ No newline at end of file
index 0a8d10208a2acdc5012c063306f6b9af71425baf..2be638603eadb477ed8c1588df532caa0cbee8f9 100644 (file)
         </ethernet-match>
         <ipv4-destination>10.0.0.0/24</ipv4-destination>
     </match>
-    <hard-timeout>12</hard-timeout>
     <cookie>10</cookie>
-    <idle-timeout>34</idle-timeout>
     <flow-name>FooXf41</flow-name>
-    <priority>2</priority>
+    <priority>41</priority>
     <barrier>false</barrier>
-</flow>
+</flow>
\ No newline at end of file
index bf6216a4a1566b035d7560d149264f24d2492a28..80de6495a8a0644bd5cbc7f737f64367e292535a 100644 (file)
         </ethernet-match>
         <ipv4-destination>10.0.0.0/24</ipv4-destination>
     </match>
-    <hard-timeout>12</hard-timeout>
     <cookie>10</cookie>
-    <idle-timeout>34</idle-timeout>
     <flow-name>FooXf42</flow-name>
-    <priority>2</priority>
+    <priority>42</priority>
     <barrier>false</barrier>
-</flow>
+</flow>
\ No newline at end of file
index b2ad8ad5febb9105be87ebac05a0e3888ae03621..cd6bb29981d94222677ae0b958f56fe928f8fe58 100644 (file)
             <ip-protocol>58</ip-protocol>
         </ip-match>
     </match>
-    <hard-timeout>12</hard-timeout>
     <cookie>10</cookie>
-    <idle-timeout>34</idle-timeout>
     <flow-name>FooXf43</flow-name>
-    <priority>2</priority>
+    <priority>43</priority>
     <barrier>false</barrier>
-</flow>
+</flow>
\ No newline at end of file
index 4b808b2b2a25d23123b82e0ab04e12003efed591..2bf6630fa89576124654fc1874b2c2cad9c8ef20 100644 (file)
         <in-port>202</in-port>
         <in-phy-port>10122</in-phy-port>
     </match>
-    <hard-timeout>12</hard-timeout>
     <cookie>10</cookie>
-    <idle-timeout>34</idle-timeout>
     <flow-name>FooXf44</flow-name>
-    <priority>2</priority>
+    <priority>44</priority>
     <barrier>false</barrier>
-</flow>
+</flow>
\ No newline at end of file
index 80c65ef296f54805fc9fd49d97793f1c3d2cd4be..eea2853ee619b7fd0831ae70a839e974662256d2 100644 (file)
             <metadata>500</metadata>
         </metadata>
     </match>
-    <hard-timeout>12</hard-timeout>
     <cookie>10</cookie>
-    <idle-timeout>34</idle-timeout>
     <flow-name>FooXf45</flow-name>
-    <priority>2</priority>
+    <priority>45</priority>
     <barrier>false</barrier>
-</flow>
+</flow>
\ No newline at end of file
index da96494305ac1afd31c4b7e5a47c15e99714ffc7..aa4b089ecda2a788b913f2f0ed3e10e8d893d4b0 100644 (file)
             <icmpv6-code>0</icmpv6-code>
         </icmpv6-match>
     </match>
-    <hard-timeout>12</hard-timeout>
     <cookie>10</cookie>
-    <idle-timeout>34</idle-timeout>
     <flow-name>FooXf46</flow-name>
-    <priority>2</priority>
+    <priority>46</priority>
     <barrier>false</barrier>
-</flow>
+</flow>
\ No newline at end of file
index af6613526621b27ca6d51b4c27a489ad07a253c4..ffaafcac2f1bfd8f5f6f3f03f28ccf2e9469c8c8 100644 (file)
             <ip-protocol>132</ip-protocol>
         </ip-match>
     </match>
-    <hard-timeout>12</hard-timeout>
     <cookie>10</cookie>
-    <idle-timeout>34</idle-timeout>
     <flow-name>FooXf47</flow-name>
-    <priority>2</priority>
+    <priority>47</priority>
     <barrier>false</barrier>
-</flow>
+</flow>
\ No newline at end of file
index c8cef8e497b422a4625567882225dba86f33a67a..37229c785a2348d25f213361f8d5af09ca6d50eb 100644 (file)
             <tunnel-id>10668</tunnel-id>
         </tunnel>
     </match>
-    <hard-timeout>12</hard-timeout>
     <cookie>10</cookie>
-    <idle-timeout>34</idle-timeout>
     <flow-name>FooXf48</flow-name>
-    <priority>2</priority>
+    <priority>48</priority>
     <barrier>false</barrier>
-</flow>
+</flow>
\ No newline at end of file
index dffad85837764bfbef3cc3120d2dbd1907a8b221..2c5c78e54eb7b6c9b31d3b0e0a8da3d8b3925bc3 100644 (file)
             <vlan-pcp>3</vlan-pcp>
         </vlan-match>
     </match>
-    <hard-timeout>0</hard-timeout>
     <cookie>10</cookie>
-    <idle-timeout>0</idle-timeout>
     <flow-name>FooXf49</flow-name>
-    <priority>2</priority>
+    <priority>49</priority>
     <barrier>false</barrier>
-</flow>
+</flow>
\ No newline at end of file
index d1469e5b7a965097851f968439931b5982e25f30..df6350a4289a770316fcfab163a3e7d8f620b0a5 100644 (file)
         <ipv4-destination>20.4.0.0/16</ipv4-destination>
         <in-port>0</in-port>
     </match>
-    <hard-timeout>12</hard-timeout>
     <cookie>5</cookie>
-    <idle-timeout>34</idle-timeout>
     <flow-name>FooXf5</flow-name>
-    <priority>2</priority>
+    <priority>5</priority>
     <barrier>false</barrier>
-</flow>
+</flow>
\ No newline at end of file
index 6b40a50ab735755bc15cc09daab1335d603b61e5..554fca57e8b0e699774df5d371ca33df7a94cda7 100644 (file)
         <ipv4-source>10.1.2.0/24</ipv4-source>
         <ipv4-destination>40.4.0.0/16</ipv4-destination>
     </match>
-    <hard-timeout>12</hard-timeout>
     <cookie>5</cookie>
-    <idle-timeout>34</idle-timeout>
     <flow-name>FooXf5</flow-name>
-    <priority>2</priority>
+    <priority>6</priority>
     <barrier>false</barrier>
-</flow>
+</flow>
\ No newline at end of file
index 17c106f504118e8d648b1aaf57d6ccd4a30077e9..46bb927206d8c8d7daae42427021e55fcef5edac 100644 (file)
         </ip-match>
         <in-port>0</in-port>
     </match>
-    <hard-timeout>12000</hard-timeout>
     <cookie>7</cookie>
-    <idle-timeout>12000</idle-timeout>
     <flow-name>FooXf7</flow-name>
-    <priority>2</priority>
+    <priority>7</priority>
     <barrier>false</barrier>
-</flow>
+</flow>
\ No newline at end of file
index 775b0b5727a9b336d24c45e7955a8f48ce7d19dc..8e7b462e5ea8f47162ae9dbd5dc9e10f189e9776 100644 (file)
         <tcp-destination-port>8080</tcp-destination-port>
         <in-port>0</in-port>
     </match>
-    <hard-timeout>1200</hard-timeout>
     <cookie>8</cookie>
-    <idle-timeout>3400</idle-timeout>
     <flow-name>FooXf8</flow-name>
-    <priority>2</priority>
+    <priority>8</priority>
     <barrier>false</barrier>
 </flow>
-
-
index b9313d186dc3bb2607a15bd159228eb3483306d5..d3044ebe65e65c08d564494846e26c940dc3850e 100644 (file)
         <udp-destination-port>8080</udp-destination-port>
         <in-port>0</in-port>
     </match>
-    <hard-timeout>1200</hard-timeout>
     <cookie>9</cookie>
-    <idle-timeout>3400</idle-timeout>
     <flow-name>FooXf9</flow-name>
-    <priority>2</priority>
+    <priority>9</priority>
     <barrier>false</barrier>
-</flow>
-
+</flow>
\ No newline at end of file
index 5d4b7a79c48c73be4bd3429593aa444259f39839..76a9d0d1db49f38bb4a3f8b85e4a1e33fdb2ffba 100644 (file)
     <barrier>false</barrier>
     <group-name>Foo</group-name>
     <group-id>140</group-id>
-</group>
+</group>
\ No newline at end of file
index 79529becff7fb74f6f41a18b696f399693ed9300..7236760acd49bb8407465ebf3753d05b4bce9f7f 100644 (file)
     <barrier>false</barrier>
     <group-name>Foo</group-name>
     <group-id>140</group-id>
-</group>
+</group>
\ No newline at end of file
index 54abb9a476a12ed0941e14e13e2d28f36adf1c10..8de740d5ab9a14282d2194265ec5b8c91e122b11 100644 (file)
@@ -15,4 +15,4 @@
     <barrier>false</barrier>
     <group-name>Foo</group-name>
     <group-id>130</group-id>
-</group>
+</group>
\ No newline at end of file
index 32c38d207814a5f5feca67573deaf4ed8ae1f6ce..0002fd8841f02a3ad3d53be7a120505d71cf6e74 100644 (file)
@@ -17,4 +17,4 @@
     </meter-band-headers>
     <meter-id>14</meter-id>
     <meter-name>Foo</meter-name>
-</meter>
+</meter>
\ No newline at end of file
index 32c38d207814a5f5feca67573deaf4ed8ae1f6ce..0002fd8841f02a3ad3d53be7a120505d71cf6e74 100644 (file)
@@ -17,4 +17,4 @@
     </meter-band-headers>
     <meter-id>14</meter-id>
     <meter-name>Foo</meter-name>
-</meter>
+</meter>
\ No newline at end of file
index 32c38d207814a5f5feca67573deaf4ed8ae1f6ce..0002fd8841f02a3ad3d53be7a120505d71cf6e74 100644 (file)
@@ -17,4 +17,4 @@
     </meter-band-headers>
     <meter-id>14</meter-id>
     <meter-name>Foo</meter-name>
-</meter>
+</meter>
\ No newline at end of file