<?xml version="1.0" encoding="UTF-8"?>
<zprava cislo="27/2004" jazyk="en">

	<nazev>Metaconfiguration of the computer network</nazev>
	<autor>Miroslav Matuska</autor>
	<datum>11.12.2004</datum>

<h1>Introduction</h1>
<p>Computer network generally provides communication infrastructure for various important systems and services. The communication services have to fulfill their needs and thus must offer real-time capability of data transfer between network end points. The key question is realization of those services. </p>
<p>Today's computer networks are often complex systems of active devices and transmission media. Active devices must perform various tasks based on the type of device and its configuration; no single active device can perform the whole data transfer. The computer network offers its communication service by cooperation of all devices in it.</p>
<p>It is thus crucial to set up computer network active devices as an integrated system, not as the standalone devices. The current approach to device configuring one by one by the network administrator needs a lot of experience and the administrator must maintain the "big picture" of the network during the process. The change of one part of functionality often needs to be adjusted in multiple points of the network.</p>
<p>The Metaconfiguration concept focuses on the formalized approach to the network configuration, i.e. <b>to configure the functions and attributes of the whole network rather than functions and attributes of single devices</b>. The standard descriptive and configuration method of computer network should solve the problem with network settings inconsistencies and offers the way to automate various routine and repetitive tasks of this process.</p>

<h2>Metaconfiguration - fundamentals</h2>
<p>This document describes the network metaconfiguration system, its function and data structure. The aim of metaconfiguration is to create the system for configuring the network devices, mainly L3 ones (routers, L3 switches). The distinction against the usual approach is not to configure each device separately, but to configure the network as a whole. </p>
<p>The basic idea is to have data and fuction representation of the configuration of whole network, not just single router configurations. Having single router configurations, some information are redundant and some of them are specified by the (silently assumed) relations in the network. The metaconfiguration gathers all configuration data into one entity while removing redundancies and inferial attributes. </p>
<p>There is also possible to use these network metadata to provide automated operations, assistant mechanisms and "metaoperations" on metadata - though simplifying and facilitating the network design, administration, maintenance and documentation. It also enables to run various checks of the correctness of the designed network. These mechanisms provides the network designer/administrator possibility to automate the routine tasks. </p>
<p>Metaconfiguration system is designed to enable the single network description to be applied on various existing networks. This is realized by the means of reusable templates, which can be slightly modified by setting parameters and variables to them. There is also possible to use macro expressions to specify the attributes without the need of exact values at a design time.</p>
<p>The metaconfiguration system is closely bound to the CESNET Liberouter/Netopeer project (<cite href="Lib04"/>), which ensures practical use of the metaconfiguration application (i.e. the final configurations could be applied on various physical boxes in the network). Metaconfiguration system is designed as one of the front-ends of the Netopeer system (front-end is the interface between the network administrator and core/backend of the Netopeer system)</p>
<p>The metadata representation form is in the standard XML format <cite href="W3C04"/>, data schema language is RelaxNG <cite href="Oas01"/>. It is supposed that various XML standards (such as XSLT <cite href="W3C99"/>) and tools (both standard and newly created) facilitate the understanding and acceptance of the metadata and metaconfiguration systems.</p>
<p>The whole system is developed under open-source license. All development materials (specifications, papers, presentations, code) can be found in the CVS reporitory <cite href="Met04a"/> of the Liberouter project or at the supporting website <cite href="Met04b"/>. Several industry standards, such as <cite href="ITU00"/> were studied, as well as similar research projects (i.e. <cite href="Rex03"/>, <cite href="Net03"/>) in order to achieve the "big picture" of the problem area.</p>

<h1>Terminology</h1>
<p>In order to achieve reader's understanding it is needed to mention the definition of some terms used in the metaconfiguration system. </p>
<p>
<b>Node</b>: Router (L3 device) or aggregated network on lower hierarchy level<br/>
<b>Link</b>: L2&amp;L1 devices and media used for connecting nodes (i.e. point or multipoint link).<br/>
<b>Binding</b>: conjunction of two entities (e.g. node and link)<br/>
<b>Network</b>: nodes and links that are bound to them<br/>
<b>Interface</b>: binding of a link to a node<br/>
<b>Feature</b>: simple attribute assigned to node, link or interface<br/>
</p>

<h1>Metadata schema with comments</h1>
<p>Metadata are divided into following parts: <i>Topology&amp;Addressing</i>, <i>Routing</i>, <i>Filtering/Firewalling</i> and <i>Other/Features</i>. The first three parts are subject to "meta-isation" (redundance removal, inferiality simplification), the last one contains data which are tightly bound to specific routers from their nature (hostnames, descriptions and so on). All of them can be simplified by templates. Metadata are discussed in following sections in particular.</p>
<p>Current version of described metadata is 1.5</p>

<h2>Topology &amp; Addressing data</h2>
<p>The information about the network topology is stored in the <prikaz>networks</prikaz> group of elements. It contains the templates of simple networks (groups of nodes and links connecting them). One of the networks is the root one - where the network hierarchy starts and it is specified by the corresponding attribute.</p>
<p><pre>
   &lt;define name="networks-content"&gt;
      &lt;oneOrMore&gt;
         &lt;element name="network"&gt;
            &lt;ref name="network-content"/&gt;
         &lt;/element&gt;
      &lt;/oneOrMore&gt;
      &lt;attribute name="root"/&gt;
   &lt;/define&gt;


   &lt;define name="network-content"&gt;
</pre></p>
<p>Each network template contains the basic identification (will be explained later) and the section for variable setting. Variables set in this area will be valid in the whole network template and all included nodes.</p>
<p><pre>
      &lt;ref name="identification-content"/&gt;
      &lt;optional&gt;
         &lt;element name="set"&gt;
            &lt;ref name="set-content"/&gt;
         &lt;/element&gt;
      &lt;/optional&gt;
</pre></p>
<p>The very important attribute is the information about inheritance - if this is original, new template (no inherit attribute) or if it inherits base network information from some other template. In this case, the template will include only the new data entities, in addition to parent template. Please distinct between <i>template inheriting</i> (this case) and <i>template using</i> (described later in the "node" section).</p>
<p><pre>
      &lt;optional&gt;
         &lt;attribute name="inherit"/&gt;
      &lt;/optional&gt;
</pre></p>
<p>The following section contains the addressing information - how is the IP addressing space hierarchically divided into smaller segments. There can be one or more prefixes assigned to the network - either specified locally or delegated from the higher level of network. The prefixes defined here are later assigned to network links.</p>
<p><pre>
      &lt;optional&gt;
         &lt;element name="prefixes"&gt;
            &lt;oneOrMore&gt;
               &lt;element name="prefix"&gt;
                  &lt;ref name="prefix-content"/&gt;
               &lt;/element&gt;
            &lt;/oneOrMore&gt;
         &lt;/element&gt;
      &lt;/optional&gt;

</pre></p>
<p>Prefix internal structure is specified here. The newly assigned prefix has its address and length of subnet mask specified here, along with its identification. If this prefix is delegated from somewhere else (from the higher level of network), only the <prikaz>idref</prikaz> reference is mentioned here.</p>
<p><pre>
   &lt;define name="prefix-content"&gt;
      &lt;choice&gt;
         &lt;group&gt;
            &lt;ref name="identification-content"/&gt;
            &lt;attribute name="address"/&gt;
            &lt;attribute name="masklen"/&gt;
         &lt;/group&gt;
         &lt;attribute name="idref"/&gt;
      &lt;/choice&gt;
      &lt;ref name="make-subnets-content"/&gt;
   &lt;/define&gt;

</pre></p>
<p>Each prefix can be divided into more smaller subnets. If so, the size of new subnets is recorded in the <prikaz>subnetbits</prikaz> attribute. This value specifies the shift if the boundary between the network and host part of the address. The newly created subnets are created under the previous <prikaz>prefix</prikaz> element. </p>
<p><pre>   
    &lt;define name="make-subnets-content"&gt;
      &lt;optional&gt;
         &lt;attribute name="subnetbits"/&gt;
         &lt;oneOrMore&gt;
            &lt;element name="subnet"&gt;
               &lt;ref name="subnet-content"/&gt;
            &lt;/element&gt;
         &lt;/oneOrMore&gt;
      &lt;/optional&gt;
   &lt;/define&gt;

</pre></p>    
<p>Each subnet has its unique number <prikaz>subnetid</prikaz> reflecting the order in the group of new subnets (cannot be higher that the number of the newly created subnets). </p>
<p>The new subnets identified by identification attributes could be furthermore divided into smaller ones and so on. The RelaxNG schema reflect this situation by specifying the <prikaz>subnet</prikaz> element recursive. If there is a need to split the subnet into smaller ones, the <prikaz>subnetbits</prikaz> attribute is used and new <prikaz>subnet</prikaz> elements are created under it.</p>
<p><pre>
   &lt;define name="subnet-content"&gt;
      &lt;ref name="identification-content"/&gt;
      &lt;attribute name="subnetid"/&gt;
      &lt;ref name="make-subnets-content"/&gt;
   &lt;/define&gt;

</pre></p>
<p>Basic topology data of the network template are stored in the <prikaz>nodes</prikaz> and <prikaz>links</prikaz> elements as one or more of <prikaz>node</prikaz> and <prikaz>link</prikaz> elements.</p>
<p><pre>
      &lt;optional&gt;
         &lt;element name="nodes"&gt;
            &lt;oneOrMore&gt;
               &lt;element name="node"&gt;
                  &lt;ref name="node-content"/&gt;
               &lt;/element&gt;
            &lt;/oneOrMore&gt;
         &lt;/element&gt;
      &lt;/optional&gt;
      &lt;optional&gt;
         &lt;element name="links"&gt;
            &lt;oneOrMore&gt;
               &lt;element name="link"&gt;
                  &lt;ref name="link-content"/&gt;
               &lt;/element&gt;
            &lt;/oneOrMore&gt;
         &lt;/element&gt;
      &lt;/optional&gt;


</pre></p>   
<p>Each node has its unique identification and information about its graphical representation (<prikaz>visualization-content</prikaz> is described later in this text).</p>
<p><pre>
    &lt;define name="node-content"&gt;
      &lt;ref name="identification-content"/&gt;
      &lt;ref name="visualization-content"/&gt;
</pre></p>
<p>The node can be either usual router or nested network on a lower hierarchy level. The distinction between these two types of node is assured by the <prikaz>use-network</prikaz> attribute. In the router case, it is not present. In the nested network case, this attribute is a reference to network template which is nested in this node.</p>
<p><pre>
       &lt;optional&gt;
         &lt;attribute name="use-network"/&gt;
       &lt;/optional&gt;
</pre></p>
<p>The <prikaz>set</prikaz> element provides opportunity to set variable values for this node only (not for whole network).</p>
<p><pre>
       &lt;zeroOrMore&gt;
         &lt;element name="set"&gt;
            &lt;ref name="set-content"/&gt;
         &lt;/element&gt;
      &lt;/zeroOrMore&gt;
</pre></p>
<p>Following element creates an interface on the node - it connects the active node to some link, defined in the <prikaz>links</prikaz> section (see below). There should be none, one or more bindings (aka interfaces) on the node.</p>
<p><pre>
      &lt;zeroOrMore&gt;
         &lt;element name="bind"&gt;
</pre></p>
<p>This attribute specifies the reference to the corresponding <prikaz>link</prikaz> element (that link is connected into this interface).</p>
<p><pre>
      &lt;attribute name="linkref"/&gt;
</pre></p>
<p>The name of the interface is specified here. It is either the physical identification of the interface on the router or the symbolic name of the entry point in the nested network (if the node contains another network).</p>
<p><pre>
      &lt;optional&gt;
         &lt;attribute name="interface"/&gt;
      &lt;/optional&gt;
</pre></p>
<p>Host ID address part of this node on bound link is specified in the attribute <prikaz>hostid</prikaz>. The rest of the network address can be achived from the connected link (via the <prikaz>linkref</prikaz> reference).</p>
<p><pre>
      &lt;optional&gt;
         &lt;attribute name="hostid"/&gt;
      &lt;/optional&gt;
</pre></p>
<p>If there are any specific features for this interface there will be specified here (see the <prikaz>features</prikaz> section below).</p>
<p><pre>
      &lt;optional&gt;
         &lt;element name="features"&gt;
             &lt;ref name="interface-features-content"/&gt;
         &lt;/element&gt;
      &lt;/optional&gt;
</pre></p>
<p>The packet filters (firewall lists, access-control lists,...) can be specified in the <prikaz>filters</prikaz>/<prikaz>filter</prikaz> elements. There are two possibilities of filter specification - direct set of rules (see the <prikaz>filter-attributes-content</prikaz> section) or with the reference to ready made packet filter template (via the attribute <prikaz>use-filter-template</prikaz>). The definition of filter templates will be described later in this text.</p>
<p><pre>
       &lt;optional&gt;
           &lt;element name="filters"&gt;
               &lt;oneOrMore&gt;
                   &lt;element name="filter"&gt;
                       &lt;choice&gt;
                           &lt;ref name="filter-attributes-content"/&gt;
                           &lt;attribute name="use-filter-template"/&gt;
                       &lt;/choice&gt;
                   &lt;/element&gt;    
               &lt;/oneOrMore&gt;
            &lt;/element&gt;
       &lt;/optional&gt;         
   &lt;/element&gt;
      &lt;/zeroOrMore&gt;
</pre></p>
<p>We have left the <prikaz>bind</prikaz> element now and we are continuing with the <prikaz>node</prikaz> element. The last two possible elements describe the reference to the <i>Other/Features</i> data set (see this section later in the text), thus specifying the templates of the network attributes/settings, which are neither routing nor filtering nor topology nor addressing related. But these attributes are highly needed to ensure the completeness of the metaconfiguration system and the possibility to create the exports into the Netopeer system. Example of these "features" is the AAA settings, DNS settings, NTP settings and so on.</p>
<p>Inheritable attributes are applicable to current node and all of its children (nested) networks. Local features are only for the actual node and those are not inherited to the nested networks.</p>
<p><pre>
      &lt;optional&gt;
         &lt;element name="features-inheritable"&gt;
            &lt;ref name="features-content"/&gt;
         &lt;/element&gt;
      &lt;/optional&gt;
      &lt;optional&gt;
         &lt;element name="features-local"&gt;
            &lt;ref name="features-content"/&gt;
         &lt;/element&gt;
      &lt;/optional&gt;
   &lt;/define&gt;

</pre></p>
<p>The link (apart from its identification) can include the reference to the addressing data - to its assigned subnet</p>
<p><pre>
   &lt;define name="link-content"&gt;
      &lt;ref name="identification-content"/&gt;
      &lt;optional&gt;
         &lt;attribute name="subnetref"/&gt;
      &lt;/optional&gt;
</pre></p>
<p>If there are any specific features for this link there will be specified here (see the features section below).</p>
<p><pre>
      &lt;optional&gt;
         &lt;element name="features"&gt;
             &lt;ref name="link-features-content"/&gt;
         &lt;/element&gt;
      &lt;/optional&gt;
</pre></p>
<p>Estimated hosts value can be used for statistic purposes or for tailoring the subnets size in automatic addressing tool.</p>
<p><pre>
      &lt;optional&gt;
         &lt;attribute name="estimated-hosts"/&gt;
      &lt;/optional&gt;
</pre></p>
<p>Some routing attributes can be applied to the link also (e.g. "exclude this link from the route propagation") and such are applied here, in the routing section of the <prikaz>link</prikaz> element.</p>
<p><pre>
      &lt;optional&gt;
         &lt;element name="routing"&gt;
            &lt;ref name="routing-content"/&gt;
         &lt;/element&gt;
      &lt;/optional&gt;
   &lt;/define&gt;
    
</pre></p>
<p>Each network template contains the links to the information of the other areas (routing and other features).  Inheritable attributes are applicable to current network and all of its children (nested) networks. Local features are only for the actual network and those are not inherited to the nested networks.</p>
<p><pre>
      &lt;optional&gt;
         &lt;element name="features-inheritable"&gt;
            &lt;ref name="features-content"/&gt;
         &lt;/element&gt;
      &lt;/optional&gt;
      &lt;optional&gt;
         &lt;element name="features-local"&gt;
            &lt;ref name="features-content"/&gt;
         &lt;/element&gt;
      &lt;/optional&gt;
       &lt;optional&gt;
         &lt;element name="routing"&gt;
            &lt;ref name="routing-content"/&gt;
         &lt;/element&gt;
      &lt;/optional&gt;

</pre></p>
<p>This is the end of the network template.</p>
<p><pre>
   &lt;/define&gt;
</pre></p>

<h2>Routing data</h2>
<p>This section describes data regarded to routing processes in the network and the means of their configuration on each router.</p>
<p><pre>
    &lt;define name="routing-common-content"&gt;
</pre></p>
<p>Unique identification of each routing process in the network is stored in attribute <prikaz>process-id</prikaz>. This ID brings together various settings for the same routing process stored in various places of the metaconfiguration (e.g. RIP settings will be common for all RIP routers in the network and some links could be excluded - but it is needed to know from which routing process they will be excluded).</p>
<p><pre>
        &lt;attribute name="process-id"/&gt;
</pre></p>
<p>Routing data can contain reference to previously defined routing template (see below).</p>
<p><pre>
        &lt;optional&gt;
            &lt;attribute name="use-routing-template"/&gt;
        &lt;/optional&gt;
    &lt;/define&gt;

</pre></p>
<p>Each routing method (protocol) has its own properties. Those will be stored in appropriate elements. Values will be extracted from the Netopeer data schema <cite href="Lho03"/>, because they will be the same and it is no good to duplicate them. For example, the static routing method will need parameters about possibility of supernetting and next-hop types (via interface or IP address), RIP routing process will need the timer values, protocol version and so on.</p>
<p>It is possible that some specific routing metadata will emerge later and those will be stored here as well as newly supported routing protocols will have their elements here. </p>
<p><pre>
    &lt;define name="routing-content"&gt;
      &lt;oneOrMore&gt;
      &lt;choice&gt;
          &lt;element name="static"&gt;
              &lt;ref name="routing-common-content"/&gt;
              &lt;!--Attributes from the Netopeer system will be here --&gt;
          &lt;/element&gt;
          &lt;element name="rip"&gt;
              &lt;ref name="routing-common-content"/&gt;
              &lt;!--Attributes from the Netopeer system will be here --&gt;
          &lt;/element&gt;
          &lt;element name="ospf"&gt;
              &lt;ref name="routing-common-content"/&gt;
              &lt;!--Attributes from the Netopeer system will be here --&gt;
          &lt;/element&gt;
          &lt;element name="is-is"&gt;
              &lt;ref name="routing-common-content"/&gt;
              &lt;!--Attributes from the Netopeer system will be here --&gt;
          &lt;/element&gt;
          &lt;element name="bgp"&gt;
              &lt;ref name="routing-common-content"/&gt;
              &lt;!--Attributes from the Netopeer system will be here --&gt;
          &lt;/element&gt;
      &lt;/choice&gt;
      &lt;/oneOrMore&gt;
   &lt;/define&gt;

</pre></p>
<p>All routing templates have common identification and will have common routing attributes such as enable/disable state or exporting/importing rules to/from other routing protocols. Those will be added into schema later and will be located here.</p>
<p><pre>
   &lt;define name="routing-templates-common-content"&gt;
       &lt;attribute name="id"/&gt;
   &lt;/define&gt;

</pre></p>
<p>This routing template section contains similar properties as direct (non-templated) routing properties (see above). Majority of them will be derived from the Netopeer data schema. All of them will have the possibility to include the variables and macro expressions to extend the descriptive abilities of the routing metadata.</p>
<p><pre>
   &lt;define name="routing-templates-content"&gt;
        &lt;oneOrMore&gt;
            &lt;choice&gt;
                &lt;element name="static-template"&gt;
                    &lt;ref name="routing-templates-common-content"/&gt;
                    &lt;!--Attributes from the Netopeer system will be here--&gt;
                &lt;/element&gt;
                &lt;element name="rip-template"&gt;
                    &lt;ref name="routing-templates-common-content"/&gt;
                    &lt;!--Attributes from the Netopeer system will be here--&gt;
                &lt;/element&gt;
                &lt;element name="ospf-template"&gt;
                    &lt;ref name="routing-templates-common-content"/&gt;
                    &lt;!--Attributes from the Netopeer system will be here--&gt;
                &lt;/element&gt;
                &lt;element name="bgp-template"&gt;
                    &lt;ref name="routing-templates-common-content"/&gt;
                    &lt;!--Attributes from the Netopeer system will be here--&gt;
                &lt;/element&gt;
                &lt;element name="is-is-template"&gt;
                    &lt;ref name="routing-templates-common-content"/&gt;
                    &lt;!--Attributes from the Netopeer system will be here--&gt;
                &lt;/element&gt;
            &lt;/choice&gt;
        &lt;/oneOrMore&gt;
    &lt;/define&gt;    

</pre></p>
<h2>Filtering/Firewalling data</h2>
<p>The filtering metadata schema is small nowadays due to strong bindings to the Netopeer system. Definition of packet filter chain template contains of the set of packet filer rules (in the Netopeer style, this part of metaconfiguration schema will be derived from the Netopeer data schema) in conjuction of the optional element direction. It specifies if this is a inbound or outbound filter (if applied on the interface).</p>
<p>The packet filter rules in addition to Netopeer system can include metaconfiguration variables and macro expressions. This will facilitate creating packet conditions like "apply on all internal networks", "apply on the subnet of this link", "apply on all networks but neighboring" and so on. The result of this approach is the possibility of creation of general filtering templates applicable in various networks regardless of actual network addresses.</p>
<p><pre>
    &lt;define name="filter-attributes-content"&gt;
        &lt;ref name="identification-content"/&gt;
        &lt;optional&gt;
            &lt;attribute name="direction"/&gt;
        &lt;/optional&gt;
        &lt;!--Attributes from the Netopeer system will be here --&gt;
    &lt;/define&gt;

</pre></p>
<h2>Other/Features</h2>
<p>Apart from already mentioned metadata (addressing, topology, routing, filtering) there also exist network attributes, which are not able to be easily simplified and applied on whole network. But those data can still be grouped into common templates and applied on network parts (single routers, interfaces, single links, groups of those entities and so on). For example, if there is need to specify NTP settings which will be common on all routers in the network, common NTP template applied to all routers (or to corresponding network template) can solve this problem.</p>
<p>The features template consists of its identification and the set of features.</p>
<p><pre>
   &lt;define name="feature-templates-content"&gt;
       &lt;ref name="identification-content"/&gt;
       &lt;ref name="features-content"/&gt;
   &lt;/define&gt;

</pre></p>
<p>The network features are one of these three types - applicable to <i>routers</i>, applicable to <i>links</i> and applicable to <i>interfaces</i> (bindings of routers to links). Each type groups different set of features - not all attributes are applicable to all entities (e.g. NTP settings has no sense for link now).</p>
<p><pre>
   &lt;define name="features-content"&gt;
            &lt;zeroOrMore&gt;
                &lt;ref name="router-features-content"/&gt;
            &lt;/zeroOrMore&gt;           
            &lt;zeroOrMore&gt;
               &lt;ref name="link-features-content"/&gt;
            &lt;/zeroOrMore&gt;           
            &lt;zeroOrMore&gt;
               &lt;ref name="interface-features-content"/&gt;     
            &lt;/zeroOrMore&gt;
   &lt;/define&gt;

</pre></p>
<p>Specific router/link/interface features will be derived from the Netopeer data schema. It would be useless to duplicate the schema here. The important difference between metaconfiguration and Netopeer will be in data fields - it is possible to include variables in metaconfiguration and thus create reusable templates. The bigger templates can be composed from the smaller ones or the smaller ones can be applied in groups. So it is possible to create one common (e.g. NTP, DNS, ...) template and to apply it on all routers where desirable. The change in this template affect settings on all assigned routers.</p>
<p><pre>
   &lt;define name="router-features-content"&gt;
       &lt;ref name="feature-template-use-content"/&gt;
       &lt;!--Attributes of Netopeer system (e.g., hostname) --&gt;
   &lt;/define&gt;
    
    &lt;define name="link-features-content"&gt;
        &lt;ref name="feature-template-use-content"/&gt;
        &lt;!--Attributes of Netopeer system (e.g., speed)--&gt;
   &lt;/define&gt;
    
   &lt;define name="interface-features-content"&gt;
       &lt;ref name="feature-template-use-content"/&gt;
       &lt;!--Attributes of Netopeer system (e.g., interface description) --&gt;
   &lt;/define&gt;

</pre></p>
<p>This element <prikaz>feature-template-use</prikaz> specifies the reference to feature template. It is possible to assign various kinds of features (router/link/interface) to various entities (e.g. to all objects in some network). If the features applied are not compatible with current object (e.g. if link features are applied on router), they are ignored.</p>
<p><pre>
   &lt;define name="feature-template-use-content"&gt;
        &lt;zeroOrMore&gt;
           &lt;element name="feature-template-use"&gt;
               &lt;attribute name="idref"/&gt;
           &lt;/element&gt;
       &lt;/zeroOrMore&gt;    
    &lt;/define&gt;

</pre></p>
<p>Some templates may include reference to template parameters (as <prikaz>$VARIABLE_NAME</prikaz> - please see the section below). If it is desirable, it is possible to specify metaconfiguration variables. Those variables (or parameters) can be substituted with real values at the end. The substitution manages this element with two mandatory attributes, <prikaz>name</prikaz> of the variable/parameter and its <prikaz>value</prikaz>. The value can contain another reference to other variable. The optional attribute is <prikaz>index</prikaz> in the array (applicable only if the variable is array, e.g. more memory fields with the same name distinct by index value).</p>
<p><pre>
&lt;!--Parameters/variables common data --&gt;
   &lt;define name="set-content"&gt;
      &lt;attribute name="name"/&gt;
      &lt;attribute name="value"/&gt;
      &lt;optional&gt;
         &lt;attribute name="index"/&gt;
      &lt;/optional&gt;
   &lt;/define&gt;

</pre></p>
<p>The identification of various elements (as described above in the text) is defined by mandatory <prikaz>id</prikaz> attribute (it is used as a target of various <prikaz>idrefs</prikaz>). There are also optional attributes like <prikaz>name</prikaz> and <prikaz>description</prikaz> - and they can be used at various places where more description is desirable.</p>
<p><pre>
   &lt;define name="identification-content"&gt;
      &lt;attribute name="id"/&gt;
      &lt;optional&gt;
         &lt;attribute name="name"/&gt;
      &lt;/optional&gt;
      &lt;optional&gt;
         &lt;attribute name="description"/&gt;
      &lt;/optional&gt;
   &lt;/define&gt;

</pre></p>        
<p>Visualization data are not the integral part of the metadata system, but it is required by the GUI application. Its purpose is to specify layout of the network entities (nodes and links between them) and later their symbols, color - anything what will be needed.</p>
<p><pre>
   &lt;define name="visualization-content"&gt;
      &lt;optional&gt;
         &lt;attribute name="vi-posx"/&gt;
         &lt;attribute name="vi-posy"/&gt;
      &lt;/optional&gt;
   &lt;/define&gt;

</pre></p>
<p>The derivation of the some metaconfiguration attributes from the Netopeer data schema mentioned above will be realized by the means of standard XML concepts and routines. It includes namespaces (metaconfiguration marks in the Netopeer schema) and XSLT stylesheets extracting specific elements and joining them with metaconfiguration schema.</p>

<h1>Soft and hard rules</h1>
<p>The hard and soft rules will be formalized by two techniques - XML related tools and procedure programming languages. </p>
<p>Once the metadata are captured in XML form, they can be checked by standard XML tools. The simplest check is the validity verification against the schema. But complex rules cannot be included in the schema, so there is possible to use XPath language <cite href="W3C99a"/> together with operators (is equal, is greater, exist and others). XPath expression specifies the location of metadata and its value can be compared with other data using operators. If this complex expression (which can include multiple XPath expressions) is not fulfilled, then the network design must be adjusted - the values must be changed, the elements must be added or removed.</p>
<p>If the rule is not rigid (hard), those expressions must be valuated with probability values specifying "how soft this rule is". The user can apply those soft rules (complex XPath expressions) and see the probability level of the results (i.e. if the network is built in one manner it can achieve the high level, if something is changed the level can decrease). Then the user can choose if the network design will be retained or changed. Those probabilities will also reflect specific network administrator preferences, which can differ from network to network (fastest convergence vs. routing stability, bandwidth effectiveness vs. higher security and so on).</p>
<p>Sample of the XPath soft rules is can look like this - If the dynamic routing (RIP for example) is enabled on some routers then:<br/>
<ul>
<li>See if there are no stub links with route propagations enabled (70% if any present, 90% if all present)</li>
<li>See how many routers are in the RIP area and if the network is not too big (40% for minimum value, i.e. 7 routers, 50% for standard value, i.e. 10 routers, 80% for 20 routers)</li>
<li>See if update intervals are not too short or too long (70% for standard value ...)</li>
<li>See if holddown timers are adjusted to the router count (i.e. update timer multiplied by router count in possible loops) (90% for standard value ...)</li>
<li>See if RIP redistributes its routing information with neighboring routing methods and if it is not overlaying with other ones (70% for standard value ...)</li>
<li>Any hard rule would be described with 100% probability</li>
</ul></p>
<p>Another standard available for these purposes is Schematron assertion language <cite href="Jel02"/>. It is also based on XPath expressions and includes the reports which will be displayed (or for the metaconfiguration purpose the actions that should be performed). This feature will be also useful in automatic assistance mechanisms to specify what elements/attributes should be added/modified/deleted if some situation in the schema occurs. Probability values for the soft rules apply also here.</p>
<p>The last instrument for hard/soft rule checking is ordinary procedural language (such as C or Java). It will process the XML data and can use all means of computing including heuristic mechanisms and artificial intelligence to produce decisions. This is the "last-resort" option for the cases when the rule is too complex to be implemented in XPath with probabilities or Schematron assertions. Therefore it is possible to implement almost any checking routine that may be needed in the future. Such example can be the rule based on real-time traffic simulation characteristics - if the network is not congested in this design, if the network fulfills the maximum end-to-end transport delay time or similar.</p>

<h1>Variables and special macro expressions</h1>
<p>The elements and attributes can contain either actual value or the expression, which will be substituted with real values later (at a configuration generation time). Those general expressions will be useful in templates because they will be applicable in more places of the network without the need to adjust or modify. It will also save time in specifying actual values because it will not be necessary to count or derive them extra by hand.</p>
<p>The basic expression in the metadata is the variable reference, indicated by the dollar sign and the variable name, like this: <prikaz>$variableA</prikaz>. The variable can be used as a plain reference or as a part of complex expressions like: </p>
<p><pre>
       $variableA+1 
       "Administrator name: "+$variable1. 
</pre></p>
<p>The complex expressions are made using usual operators. It is not needed to specify the variable type (string or integer), it will be detected automatically. The variables are defined in the set element (see the data schema above).</p>
<p>It is also possible to include following macros in the data fields:<br/>
<ul>
<li>First possible value from the possible range</li>
<li>Last possible value from the possible range</li>
<li>The number of the occurrence of the template if it is used more than once</li>
<li>The current level of hierarchy (of nesting)</li>
<li>The actual number of nodes/links in the template</li>
<li>The unique ID of the current entity</li>
<li>and the others...</li>
</ul></p>
<p>There are also designed macros for specifying prefix and link values: <br/>
<ul>
<li>The highest level prefix</li>
<li>All assigned prefixes</li>
<li>All point-to point (2 host only) prefixes </li>
<li>All internal links</li>
<li>All border links</li>
<li>All neighboring links</li>
<li>All but neighboring links</li>
<li>and the others...</li>
</ul></p>
<p>It will be possible to include the XPath expressions referring to specific metadata in the XML tree and to specify simple <i>iterations</i> (like "repeat those values until...") and <i>condition</i> ("apply these data only if...") in case no other solution is possible.</p>
<p>The macro expressions are easily extensible in the need of another formalized configuration expression. It is highly possible that the needs of network administrators will require adding of various useful macros.</p>

<h1>Functions</h1>
<h2>Application architecture</h2>
<p>The applications/functions of metaconfiguration system provide the network administrator method to create, edit and delete the metadata, import them from other systems (mainly Netopeer), export them and run various checking&amp;assistance mechanisms on them.</p>
<p>The core of function structure is the graphical user interface application, which comprises all basic editing functions. The user can create templates of all kinds - mainly the topological ones with nodes and links and he is able to see them in graphical representation (e.g. elipses connected with lines, see the GUI screen prototypes below).The GUI application integrates and calls all other functions of the metaconfiguration system, although they can be provided also as standalone "supporting" applications. All kinds of templates (e.g. routing, filtering...) have their own user interface facilitating the editing process - for example the chart of subnets distribution in assigned address space.</p>
<p>The second part of function structure is the sum of exporting routines into other systems. It will mainly provide the conversion of metadata into any desirable form of normal data, either configuring or documenting. The purpose of exports is to have possibility of up-to-date documentation available for network administrator or his manager without the need to frequently elaborate boring and routine descriptive tasks of managed network. Other export target is the Netopeer system - set of simple XML configurations of all routers in the network. Those configurations exported (derived) from the metadata can be applied to physical routers in the network via the Netopeer backend systems. The exporting routines will use XSLT stylesheets or procedural routines.</p>
<p>Importing functions from the Netopeer system is the reverse task than described in the previous paragraph. It is much more complex because there is need to extract the metadata (remove redundancies, simplify deducible elements, create common templates and so on) automatically. Therefore methods of boundary scanning, heuristic analysis and maybe artificial intelligence will come in place because no rigid approach works here. It is possible that user will have to assist procedural mechanisms in importing process.</p>
<p>The very important part is the automated assistance mechanisms. Those will run through metadata and will extend the design with new features in order to be correct. For example if the administrator adds new links into networks, those mechanisms offer him available addressing subnets to be assigned to them - and if there is only one option they will assign them. Its realization will be procedural and probably integrated into editing process of the GUI application (i.e. it will periodically check the metadata during template creation).</p>
<p>Closely related to assistance mechanisms are the checking routines which can validate the network design according to hard and soft rules. It will check if it is possible to create the functioning network from the given templates (hard rules) and if the new network will be optimized for traffic flow, routing, address space allocation and so on (soft rules).</p>

<h2>Metaconfiguration use-case</h2>
<p>Network administrator/designer can either create new network or apply the metaconfiguration system to his existing networks. </p>
<p>In the first case, the admin can use ready-made topology templates from the other networks, which will contain also the knowledge and best practices of successful network building. Automatic mechanism enables him to fill other data (such as addressing ones), otherwise which must have been added manually. Administrator can solely focus on the network design and he can omit the routine configuration tasks like subnet counting, common features copying, repetitive "inventing" of security measures - packet filters. Graphical user interface provides him the pleasant environment to deal with real creative tasks.</p>
<p>In the second case the importing functions will be used. If the existing network is simple, the importing system can find all needed entities and their attributes itself. It can gather all existing configurations from the physical routers using the Netopeer system and create simple templates by finding common attributes (i.e. same subnets, routing area boundaries, same DNS settings and so on). If the existing network is too complex, there may be some user input needed to achieve fundamental points of the network design and the correct approach. But the system can also use for example autonomous systems areas, packet filters protected interfaces and similarity of other router settings as important points and use them to separate flat space into hierarchic templates.</p>
<p>When the process of the metadata network creation is over, the administrator will need to maintain its network - change its transport characteristics if needed, replicate networks, add new branch networks, provide reports &amp; documentation and more. All this can be achieved by editing features of the GUI (metadata changes with assistance and checking, possibility to reuse existing design from the other branch network) or the exporting routines (applying the changes on physical routers, generating documentation and various statistics and reports). </p>
<p>The main aim of this usage is to have the primary version of the configuration in the metadata representation and all other data forms including physical router configuration will be derived from it. There will be no need to synchronize data from various sources and maintain integrity among them. User friendly representation of all kinds of data will shorten the time needed for network design and maintenance. It also enables to work with network data not only experienced administrators but also less qualified ones, thus sharing knowledge and saving needed human resources. </p>

<h1>GUI prototypes</h1>
<p>The key factor of the acceptance of the metaconfiguration system among current network administrators is the user-friendliness and intuitivism of the applications. In order to achieve that goal, some screen prototypes were designed and made available to further discussion. Those prototypes depict various situations and template types editing.</p>
<p>This is a projected design for topology editor. You can see simple triangle network with three point-to-point links and three nodes. References into various other template editors will be realized by the means of properties menu - node menu is displayed here</p>
<obr src="pic1">The topology editor with triangle network</obr>

<p>The next picture is similar example of the topology editor with one multipoint link and five nodes. Two of them are router type, three of them are nested network type - they include other network templates in them. Those nested templates can be displayed in new window. The link has specific properties also - see the link menu.</p>
<obr src="pic2">The topology editor with the multipoint link</obr>

<p>The node properties window (details) can look like this. Specific feature templates (created elsewhere, see below) are put together into one bigger feature set. Its specific values regarding to chosen router could be modified here. The network administrator can return the to original default values. Various types if input fields (text box, checkbox, radio buttons, combo box) can be present here. Those will reflect the nature of the data element or attribute.</p>
<obr src="pic3">The node properties window</obr>

<p>Features template editor is presented here. In the left side of the window there is list of so called "primitives" which are basic building blocks of the feature sets. They are corresponding to simple elements and attributes from the metadata schema. The small sets of those primitives (grouped by common purpose) can be further grouped into bigger sets and therefore very complex feature templates can be created. The values entered here will be taken as the default ones and they can include variables and macro expressions. Those templates will be assigned to various entities like routers, links or interfaces - in a manner presented above.</p>
<obr src="pic4">Features template editor</obr>

<p>Existence of variables and macro expressions can make configuration system very complex and incomprehensive which is undesirable. The variables summary is needed - which variables were inherited from the topology template, which variables are applied from the upper level of network hierarchy and which variables were created locally in this node. The important fact is which variable is currently valid if more than one type of variable is present - the actual value is in last column.</p>
<obr src="pic5">Variables summary</obr>

<p>The first draft of the routing template editor layout is below. In the left part of the window there is a combo box with routing methods (mainly protocols and static routes) and in the right half there are detail parameters for the selected method such as timers, version, redistribution rules and others. Those parameters will be different for each method.</p>
<obr src="pic6">Routing template editor</obr>

<p>Filtering rules editor will be similar to existing firewall management software. The major difference will be the possibility of so called "macro conditions" - conditions based on general rules, not on exact numbers. It is inevitable in order to achieve portability of packet filter template on various networks. These conditions include "this link subnet", "all subnets of internal links", "all external subnetworks", "all subnets used in this template/node", "all point to point networks" and others. It is also possible to use variables as a reference to prefix/subnet list and to use this variable as a parameter.</p>
<obr src="pic7">Filtering rules editor</obr>
                   
<p>Addressing space allocation window layout is displayed below. The big graphical chart on the right side of the window represents the available address space. The columns represent the borders between network and host part of the IP address. The user will be able to adjust the columns - to adjust the subnet size and count. Each created subnet will have its unique sequentional number and each subnet will be subject to further subnetting into smaller and smaller parts. Each created subnet can be assigned to either link (directly as its subnetwork address) or to node (as a parameter value to be used in nested networks).</p>
<obr src="pic8">Prefix allocation editor</obr>

<p>The final graphical user interface may differ from these prototypes, but the basic functions, data fields and user activities on templates will remain similar.</p>

<h1>Future L2 data extensions</h1>
<p>Current metadata data and function design deals mostly with L3 network attributes; it does not cover lower layer issues. To provide complete solution for network administrator there is need to provide him similar tools for configuring specific link parameters and L2 devices. Modern computer networks include rich featured switches with various options and functionality and there is need to configure them. One link from L3 perspective can be whole bunch of L2 devices and transmission media with complex technologies such as virtual circuits or VLANs.</p>
<p>All this data can be included into current metadata design as an additional element and attribute set. Integrated L2 &amp; L3 dataset will provide the desired goal to configure all active devices (excluding application gateways). Current function and data design does not include those features due to initial phase of metaconfiguration idea and complexity which could make the main idea impossible in reasonable time. But the future possibility of L2 extension is possible and metadata system is ready for that step.</p>

<h1>Full metaconfiguration RelaxNG schema</h1>
<p><pre>
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;grammar xmlns="http://relaxng.org/ns/structure/1.0"&gt;
   
    &lt;start&gt;
      &lt;element name="metaconfiguration"&gt;
         &lt;ref name="metaconfiguration-content"/&gt;
      &lt;/element&gt;
   &lt;/start&gt;
    
&lt;!--Global metaconfiguration data --&gt;
   &lt;define name="metaconfiguration-content"&gt;
     &lt;optional&gt;
         &lt;attribute name="name"/&gt;
      &lt;/optional&gt;
      &lt;optional&gt;
         &lt;element name="networks"&gt;
            &lt;ref name="networks-content"/&gt;
         &lt;/element&gt;
      &lt;/optional&gt;
       &lt;optional&gt;
         &lt;element name="filter-templates"&gt;
             &lt;oneOrMore&gt;
                 &lt;element name="filter-template"&gt;
                     &lt;ref name="filter-attributes-content"/&gt;
                &lt;/element&gt;    
             &lt;/oneOrMore&gt;
         &lt;/element&gt;
      &lt;/optional&gt;
       &lt;optional&gt;
         &lt;element name="routing-templates"&gt;
              &lt;ref name="routing-templates-content"/&gt;
         &lt;/element&gt;
       &lt;/optional&gt;
       &lt;optional&gt;
         &lt;element name="feature-templates"&gt;
             &lt;oneOrMore&gt;
                 &lt;element name="feature-template"&gt;
                     &lt;ref name="feature-templates-content"/&gt;
                 &lt;/element&gt;
             &lt;/oneOrMore&gt;
         &lt;/element&gt;
      &lt;/optional&gt;
   &lt;/define&gt;

    
    &lt;!--Filtering information section --&gt;
    &lt;define name="filter-attributes-content"&gt;
        &lt;ref name="identification-content"/&gt;
        &lt;optional&gt;
            &lt;attribute name="direction"/&gt;
        &lt;/optional&gt;
        &lt;!--Attributes from the Netopeer system will be here --&gt;
    &lt;/define&gt;
    
    
&lt;!--Routing information section --&gt;
    &lt;define name="routing-common-content"&gt;
        &lt;attribute name="process-id"/&gt;
        &lt;optional&gt;
            &lt;attribute name="use-routing-template"/&gt;
        &lt;/optional&gt;
    &lt;/define&gt;
    
    &lt;define name="routing-content"&gt;
      &lt;oneOrMore&gt;
      &lt;choice&gt;
          &lt;element name="static"&gt;
              &lt;ref name="routing-common-content"/&gt;
              &lt;!--Attributes from the Netopeer system will be here --&gt;
          &lt;/element&gt;
          &lt;element name="rip"&gt;
              &lt;ref name="routing-common-content"/&gt;
              &lt;!--Attributes from the Netopeer system will be here --&gt;
          &lt;/element&gt;
          &lt;element name="ospf"&gt;
              &lt;ref name="routing-common-content"/&gt;
              &lt;!--Attributes from the Netopeer system will be here --&gt;
          &lt;/element&gt;
          &lt;element name="is-is"&gt;
              &lt;ref name="routing-common-content"/&gt;
              &lt;!--Attributes from the Netopeer system will be here --&gt;
          &lt;/element&gt;
          &lt;element name="bgp"&gt;
              &lt;ref name="routing-common-content"/&gt;
              &lt;!--Attributes from the Netopeer system will be here --&gt;
          &lt;/element&gt;
      &lt;/choice&gt;
      &lt;/oneOrMore&gt;
   &lt;/define&gt;
    
    &lt;define name="routing-templates-common-content"&gt;
        &lt;attribute name="id"/&gt;
    &lt;/define&gt;
    
   &lt;define name="routing-templates-content"&gt;
        &lt;oneOrMore&gt;
            &lt;choice&gt;
                &lt;element name="static-template"&gt;
                    &lt;ref name="routing-templates-common-content"/&gt;
                    &lt;!--Attributes from the Netopeer system will be here--&gt;
                &lt;/element&gt;
                &lt;element name="rip-template"&gt;
                    &lt;ref name="routing-templates-common-content"/&gt;
                    &lt;!--Attributes from the Netopeer system will be here--&gt;
                &lt;/element&gt;
                &lt;element name="ospf-template"&gt;
                    &lt;ref name="routing-templates-common-content"/&gt;
                    &lt;!--Attributes from the Netopeer system will be here--&gt;
                &lt;/element&gt;
                &lt;element name="bgp-template"&gt;
                    &lt;ref name="routing-templates-common-content"/&gt;
                    &lt;!--Attributes from the Netopeer system will be here--&gt;
                &lt;/element&gt;
                &lt;element name="is-is-template"&gt;
                    &lt;ref name="routing-templates-common-content"/&gt;
                    &lt;!--Attributes from the Netopeer system will be here--&gt;
                &lt;/element&gt;
            &lt;/choice&gt;
        &lt;/oneOrMore&gt;
    &lt;/define&gt;
    
    
&lt;!--Topology data --&gt;
   &lt;define name="networks-content"&gt;
      &lt;oneOrMore&gt;
         &lt;element name="network"&gt;
            &lt;ref name="network-content"/&gt;
         &lt;/element&gt;
      &lt;/oneOrMore&gt;
      &lt;attribute name="root"/&gt;
   &lt;/define&gt;
    
   &lt;define name="network-content"&gt;
      &lt;ref name="identification-content"/&gt;
      &lt;optional&gt;
         &lt;element name="set"&gt;
            &lt;ref name="set-content"/&gt;
         &lt;/element&gt;
      &lt;/optional&gt;
      &lt;optional&gt;
         &lt;attribute name="inherit"/&gt;
      &lt;/optional&gt;
      &lt;optional&gt;
         &lt;element name="prefixes"&gt;
            &lt;oneOrMore&gt;
               &lt;element name="prefix"&gt;
                  &lt;ref name="prefix-content"/&gt;
               &lt;/element&gt;
            &lt;/oneOrMore&gt;
         &lt;/element&gt;
      &lt;/optional&gt;
      &lt;optional&gt;
         &lt;element name="nodes"&gt;
            &lt;oneOrMore&gt;
               &lt;element name="node"&gt;
                  &lt;ref name="node-content"/&gt;
               &lt;/element&gt;
            &lt;/oneOrMore&gt;
         &lt;/element&gt;
      &lt;/optional&gt;
      &lt;optional&gt;
         &lt;element name="links"&gt;
            &lt;oneOrMore&gt;
               &lt;element name="link"&gt;
                  &lt;ref name="link-content"/&gt;
               &lt;/element&gt;
            &lt;/oneOrMore&gt;
         &lt;/element&gt;
      &lt;/optional&gt;
      &lt;optional&gt;
         &lt;element name="features-inheritable"&gt;
            &lt;ref name="features-content"/&gt;
         &lt;/element&gt;
      &lt;/optional&gt;
      &lt;optional&gt;
         &lt;element name="features-local"&gt;
            &lt;ref name="features-content"/&gt;
         &lt;/element&gt;
      &lt;/optional&gt;
       &lt;optional&gt;
         &lt;element name="routing"&gt;
            &lt;ref name="routing-content"/&gt;
         &lt;/element&gt;
      &lt;/optional&gt;
   &lt;/define&gt;
    
   &lt;define name="node-content"&gt;
      &lt;ref name="identification-content"/&gt;
      &lt;ref name="visualization-content"/&gt;
       &lt;optional&gt;
         &lt;attribute name="use-network"/&gt;
       &lt;/optional&gt;
       &lt;zeroOrMore&gt;
         &lt;element name="set"&gt;
            &lt;ref name="set-content"/&gt;
         &lt;/element&gt;
      &lt;/zeroOrMore&gt;
      &lt;zeroOrMore&gt;
         &lt;element name="bind"&gt;
            &lt;ref name="bind-content"/&gt;
         &lt;/element&gt;
      &lt;/zeroOrMore&gt;
      &lt;optional&gt;
         &lt;element name="features-inheritable"&gt;
            &lt;ref name="features-content"/&gt;
         &lt;/element&gt;
      &lt;/optional&gt;
      &lt;optional&gt;
         &lt;element name="features-local"&gt;
            &lt;ref name="features-content"/&gt;
         &lt;/element&gt;
      &lt;/optional&gt;
   &lt;/define&gt;
    
   &lt;define name="link-content"&gt;
      &lt;ref name="identification-content"/&gt;
      &lt;optional&gt;
         &lt;attribute name="subnetref"/&gt;
      &lt;/optional&gt;
      &lt;optional&gt;
         &lt;element name="features"&gt;
             &lt;ref name="link-features-content"/&gt;
         &lt;/element&gt;
      &lt;/optional&gt;
      &lt;optional&gt;
         &lt;attribute name="estimated-hosts"/&gt;
      &lt;/optional&gt;
       &lt;optional&gt;
         &lt;element name="routing"&gt;
            &lt;ref name="routing-content"/&gt;
         &lt;/element&gt;
      &lt;/optional&gt;
   &lt;/define&gt;
    
   &lt;define name="bind-content"&gt;
      &lt;attribute name="linkref"/&gt;
      &lt;optional&gt;
         &lt;attribute name="interface"/&gt;
      &lt;/optional&gt;
      &lt;optional&gt;
         &lt;attribute name="hostid"/&gt;
      &lt;/optional&gt;
      &lt;optional&gt;
         &lt;element name="features"&gt;
             &lt;ref name="interface-features-content"/&gt;
         &lt;/element&gt;
      &lt;/optional&gt;
       &lt;optional&gt;
           &lt;element name="filters"&gt;
               &lt;oneOrMore&gt;
                   &lt;element name="filter"&gt;
                       &lt;choice&gt;
                           &lt;ref name="filter-attributes-content"/&gt;
                           &lt;attribute name="use-filter-template"/&gt;
                       &lt;/choice&gt;
                   &lt;/element&gt;    
               &lt;/oneOrMore&gt;
            &lt;/element&gt;
       &lt;/optional&gt;
   &lt;/define&gt;

    
&lt;!--Addressing data --&gt;
   &lt;define name="prefix-content"&gt;
      &lt;choice&gt;
         &lt;group&gt;
            &lt;ref name="identification-content"/&gt;
            &lt;attribute name="address"/&gt;
            &lt;attribute name="masklen"/&gt;
         &lt;/group&gt;
         &lt;attribute name="idref"/&gt;
      &lt;/choice&gt;
      &lt;ref name="make-subnets-content"/&gt;
   &lt;/define&gt;
   
    &lt;define name="make-subnets-content"&gt;
      &lt;optional&gt;
         &lt;attribute name="subnetbits"/&gt;
         &lt;oneOrMore&gt;
            &lt;element name="subnet"&gt;
               &lt;ref name="subnet-content"/&gt;
            &lt;/element&gt;
         &lt;/oneOrMore&gt;
      &lt;/optional&gt;
   &lt;/define&gt;
    
   &lt;define name="subnet-content"&gt;
      &lt;ref name="identification-content"/&gt;
      &lt;attribute name="subnetid"/&gt;
      &lt;ref name="make-subnets-content"/&gt;
   &lt;/define&gt;
    
    
&lt;!--Parameters/variables common data --&gt;
   &lt;define name="set-content"&gt;
      &lt;attribute name="name"/&gt;
      &lt;attribute name="value"/&gt;
      &lt;optional&gt;
         &lt;attribute name="index"/&gt;
      &lt;/optional&gt;
   &lt;/define&gt;

    
&lt;!--Features (simple attributes) section --&gt;    
   &lt;define name="feature-templates-content"&gt;
       &lt;ref name="identification-content"/&gt;
       &lt;ref name="features-content"/&gt;
   &lt;/define&gt;
    
   &lt;define name="features-content"&gt;
            &lt;zeroOrMore&gt;
                &lt;ref name="router-features-content"/&gt;
            &lt;/zeroOrMore&gt;           
            &lt;zeroOrMore&gt;
               &lt;ref name="link-features-content"/&gt;
            &lt;/zeroOrMore&gt;           
            &lt;zeroOrMore&gt;
               &lt;ref name="interface-features-content"/&gt;     
            &lt;/zeroOrMore&gt;
   &lt;/define&gt;
    
   &lt;define name="router-features-content"&gt;
       &lt;ref name="feature-template-use-content"/&gt;
       &lt;!--Attributes from the Netopeer system will be here (e.g., hostname) --&gt;
   &lt;/define&gt;
    
    &lt;define name="link-features-content"&gt;
        &lt;ref name="feature-template-use-content"/&gt;
        &lt;!--Attributes from the Netopeer system will be here (e.g., speed)--&gt;
   &lt;/define&gt;
    
   &lt;define name="interface-features-content"&gt;
       &lt;ref name="feature-template-use-content"/&gt;
       &lt;!--Attributes from the Netopeer system will be here (e.g., interface description) --&gt;
   &lt;/define&gt;
    
   &lt;define name="feature-template-use-content"&gt;
        &lt;zeroOrMore&gt;
           &lt;element name="feature-template-use"&gt;
               &lt;attribute name="idref"/&gt;
           &lt;/element&gt;
       &lt;/zeroOrMore&gt;    
    &lt;/define&gt;
    
    
&lt;!--Common identification of various elements --&gt;    
   &lt;define name="identification-content"&gt;
      &lt;attribute name="id"/&gt;
      &lt;optional&gt;
         &lt;attribute name="name"/&gt;
      &lt;/optional&gt;
      &lt;optional&gt;
         &lt;attribute name="description"/&gt;
      &lt;/optional&gt;
   &lt;/define&gt;
        
    
&lt;!--Supporting content (symbols, colors, position...) --&gt;
   &lt;define name="visualization-content"&gt;
      &lt;optional&gt;
         &lt;attribute name="vi-posx"/&gt;
         &lt;attribute name="vi-posy"/&gt;
      &lt;/optional&gt;
   &lt;/define&gt;
    
&lt;/grammar&gt;
</pre></p>

<seznamknih>
<kniha id="Met04a"><i>Metaconfiguration CVS</i> <br/> <a href="http://www.liberouter.org/cgi-bin2/cvsweb.cgi/liberouter/netopeer/metaconf/">http://www.liberouter.org/cgi-bin2/cvsweb.cgi/liberouter/netopeer/metaconf/</a> </kniha>
<kniha id="Met04b"><i>Metaconfiguration materials repository</i> <br/> <a href="http://vseedu.vse.cz/metaconf/">http://vseedu.vse.cz/metaconf/</a> </kniha>
<kniha id="Lho03">Lhotka Ladislav: <i>XML schema for router configuration data: An annotated DTD</i>, CESNET Technical Report 2/2003 <br/> <a href="http://www.ten.cz/doc/techzpravy/2003/netopeer-dtd/">http://www.ten.cz/doc/techzpravy/2003/netopeer-dtd/</a> </kniha>
<kniha id="Lib04"><i>The Liberouter project</i><br/> <a href="http://www.liberouter.org">http://www.liberouter.org</a></kniha>
<kniha id="Oas01">The Organization for the Advancement of Structured Information Standards 2001: <i>Relax NG Specification</i> <br/> <a href="http://www.relaxng.org/spec-20011203.html">http://www.relaxng.org/spec-20011203.html</a> </kniha>
<kniha id="Jel02">Jeliffe R.: <i>The Schematron Assertion Language 1.5</i>, 2002 <br/> <a href="http://xml.ascc.net/resource/schematron/Schematron2000.html">http://xml.ascc.net/resource/schematron/Schematron2000.html</a></kniha>
<kniha id="ITU00">ITU-T Recommendation: <i>G.805</i> (not available to public) <br/> <a href="http://www.itu.int">http://www.itu.int</a></kniha>
<kniha id="Rex03">Rexford J.: <i>The cutting EDGE of IP router configuration</i> <br/> <a href="http://www.research.att.com/~jrex/papers/hotnets03.pdf">http://www.research.att.com/~jrex/papers/hotnets03.pdf</a> </kniha>
<kniha id="Net03">Bellogini A., Santarelli I.:<i>NetML, Network Markup Language</i> <br/> <a href="http://giga.dia.uniroma3.it/~ivan/NetML/">http://giga.dia.uniroma3.it/~ivan/NetML/</a> </kniha>
<kniha id="W3C99"><i>XSLT: Extensible Styleheet Transofrmations</i><br/> <a href="http://www.w3.org/TR/xslt">http://www.w3.org/TR/xslt</a> </kniha>
<kniha id="W3C04"><i>XML: Extensible Markup Language</i><br/> <a href="http://www.w3.org/XML/">http://www.w3.org/XML/</a> </kniha>
<kniha id="W3C99a"><i>XPath: XML Path Language</i><br/> <a href="http://www.w3.org/TR/xpath">http://www.w3.org/TR/xpath</a> </kniha>
</seznamknih>

</zprava>

