TECHNICAL NOTE Broadband Command Center™ Software: OSS/BSS Integration Using CORBA APIs Introduction ............................................................................................................. 2 Terminology .................................................................................................... 2 Application Programming Interface (API) Options ........................................................... 2 Command Line Interfaces (CLIs) ........................................................................ 2 CORBA APIs .................................................................................................... 2 CORBA Overview ................................................................................... 2 CORBA Advantages ................................................................................ 3 Broadband Command Center CORBA API IDL File Listing ............................. 3 CORBA API Comparison with CLI ........................................................................ 4 API Documentation........................................................................................... 4 Login and Logout Before API Execution ......................................................................... 4 Subscriber Provisioning via the MPS CORBA API ............................................................. 5 Database Tables............................................................................................... 5 Creating, Updating, or Deleting Database Records................................................. 6 DatabaseControl API .............................................................................. 6 DeviceControl API to Allow Device Resets .................................................. 6 Lookup Keys for Subscriber-Device Association .......................................... 6 Replacing a Device................................................................................. 7 Search and Retrieval of Database Records ........................................................... 7 Forcing a Reset on a Modem or MTA.................................................................... 7 Identifying Which Device is Currently Using an IP Address...................................... 7 Identifying IP Addresses Currently Assigned to a Device ........................................ 8 Retrieving Active Lease for a Modem and All Connected CPE ................................... 8 Provisioning and Managing Static IP Addresses ..................................................... 9 Auto-Provisioning Process ....................................................................... 9 Auto-Provisioning Static IP Addresses With Data Service Records................ 10 Explicitly Managing Static IP Addresses ................................................... 10 Subscriber Provisioning via the CLI ............................................................................ 11 References ............................................................................................................. 11 © 2006 Incognito Software Inc. All rights reserved. Page 1 of 11 Broadband Command Center Software: OSS/BSS Integration Using CORBA APIs Introduction Broadband Command Center (BCC) software is a set of network services that work together to provision DOCSIS cable modems, PacketCable and SIP MTAs, and customer premises equipment (CPE) on a broadband network. The network services include: • • • • • DHCP DNS TFTP Time of Day MPS (Multimedia Provisioning Service) BCC software is often integrated with a customer care center, billing, or OSS system to provision and manage subscribers or subscriber devices. This document gives an overview of the Application Programming Interfaces (APIs) that you can use to integrate BCC 5.1 with those systems. Before learning more about the APIs, you should be familiar with BCC software operation, as described in Incognito Software’s “BCC Provisioning Overview” document. This will greatly increase your understanding of the APIs. Terminology CPE: Customer premises equipment – any device that accesses the Internet from the customer premises and sits “behind” a modem or MTA. (The CPE interfaces with a broadband provider’s network through the modem or MTA.) CSR: Customer service representative. eMTA: Embedded MTA, which is a single physical device that contains both a DOCSIS cable modem and a PacketCable MTA. MPS: Multimedia Provisioning Service. One of the network services included with BCC software, and used to provision data and voice services for subscribers. Application Programming Interface (API) Options Command Line Interfaces (CLIs) Each BCC network service supports a command line interface (CLI) that can run remotely on Solaris, Linux, or Windows workstations. This CLI is comprehensive: it can manage all aspects of the BCC service. You can use it for running scripts and simple integration tasks. CORBA APIs Each BCC service supports a number of CORBA APIs. CORBA Overview CORBA (Common Object Request Broker Architecture) is an open specification developed by the Object Management Group (OMG, http://www.corba.org/) to enable computer applications to work with one another. One CORBA-based program can interoperate with another CORBA-based program on a different computer, operating system, language, or network. CORBA takes objects from one software program and “wraps” them so they can be called from other programs. (Objects are program components designed to receive, send, or process data.) A software vendor can publish a CORBA API through one or more Interface Definition Language (IDL) files. The IDL file describes the interfaces offered by objects inside a program, and how they are to be used by other programs, by “mapping” them to a specific language such as C++ or Java. © 2006 Incognito Software Inc. All rights reserved. Page 2 of 11 Broadband Command Center Software: OSS/BSS Integration Using CORBA APIs To make use of an IDL file, you must run it in conjunction with a software library known as a CORBA ORB (Object Request Broker), which allows program calls from one computer to another over a network. The CORBA ORB typically comes with an “IDL compiler,” which translates the objects defined in the IDL file into a set of source-code files specific to the required programming language. You can then use the generated source code to make calls to the other program. There are many CORBA ORBs available, sold commercially or as freeware, for many different programming languages. The following two CORBA ORBs are excellent freeware implementations: Language ORB/Product Name Website C++ The ACE Orb (TAO) http://www.cs.wustl.edu/~schmidt/TAO.html Java JacORB http://www.jacorb.org/ CORBA Advantages • Programming language independence: A client application does not need to use the same programming language as the service application. It can use any programming language for which a CORBA ORB exists. Languages include: Java, C, C++, SmallTalk, Python, Lisp, ADA, COBOL • Platform independence: A client application can run on a different platform or operating system from the service application. • Compile time type checking: Unlike XML, CORBA enforces type checking to catch many errors at compile time. • Performance: CORBA can compress data for higher performance, unlike XML, which always represents data as text. Broadband Command Center CORBA API IDL File Listing The following list shows all the CORBA APIs provided by BCC services. BCC Service CORBA API IDL File Included IDL File Description All IncService.idl Provides functions such as service configuration file management, service registration, and retrieval of error messages for error codes reporting by other APIs. All IncSecurity.idl Provides security functions such as login, logout, and management of administrator accounts. All IncTypes.idl Defines common constants, enumerations, type definitions, and structures used by other BCC APIs All IncStatistics.idl Provides statistics functions such as retrieval and resetting of values DHCP, MPS IncFailover.idl Initializes, manages, and monitors service failover DHCP IncEventTriggers.idl Manages event triggers DHCP DocsisManagement.idl Queries and resets cable modems DHCP IPCmdrService.idl Manages the DHCP service databases DNS DNSCmdrService.idl Manages the DNS service databases MPS DPCmdrService.idl Manages the MPS service databases, and provisions/manages subscribers and devices TFTP TFTPCmdrService.idl Manages TFTP service databases © 2006 Incognito Software Inc. All rights reserved. Page 3 of 11 Broadband Command Center Software: OSS/BSS Integration Using CORBA APIs CORBA API Comparison with CLI All tools included with BCC services use the CORBA API for service configuration and management, including the command line interfaces and the Incognito Management Console (IMC). As a result: • The CORBA API is well tested and robust. • The command line interface (and other tools) cannot be faster than using the CORBA API directly since the CLI (and other tools) use the CORBA API. • Anything that can be done with standard BCC software tools can be accomplished directly through the CORBA API, and vice versa. Performance Error Reporting CORBA CLI Fast. Typically you can add 1000 subscribers and modems to the system per second using the CORBA API. Slow when not used in interactive mode. In this case, you may only be able to add 4 subscribers and modems to the system per second. This mode requires the following steps for each command: Error code is directly returned to the caller. • Operating system loads the CLI • CLI connects and logs into the service • CLI executes the APIs • CLI logs out and disconnects from the service • Operating system unloads the CLI An error message is output to the console, which must be parsed. The error code can not always be returned by the CLI as an exit code because many operating systems or Unix shells only allow an exit code in the range of 0–255, while many error codes returned by BCC services are greater than 255. Knowledge Requirement Knowledge of CORBA. The complexity of using CORBA is not high if you have experience programming with CORBA. Knowledge of how to use a programming or script language to execute a command line interface, and possibly parse console output. API Documentation For additional details on any API, please read the comments for the API in the appropriate CORBA IDL file. The SDK includes the same help documentation in HTML format. Login and Logout Before API Execution Before any API is executed, you must log in to the service and acquire a valid login session token. The IncSecurity.idl file defines the APIs for logging in and out of a service. The SDK contains a document that describes login details: MPS\CORBA-API\docs\IncLoginSecurity.pdf. Java-based sample code for logging into the MPS service is located in the SDK at: MPS\CORBA-API\samples\subscriberprovisioning\src\mpssample\com\incognito\mpssample\LoginSession.java C++-based sample code for logging into the DHCP service is located in the SDK at: DHCP\CORBA-API\samples\clientprovsample-c++\ipcsecurity.cpp © 2006 Incognito Software Inc. All rights reserved. Page 4 of 11 Broadband Command Center Software: OSS/BSS Integration Using CORBA APIs Note: the mechanisms for logging into the DHCP and MPS services are the same except for the CORBA port (9998 for DHCP and 9997 for MPS). Subscriber Provisioning via the MPS CORBA API BCC software is often integrated with a billing or OSS system for device provisioning. The BCC’s MPS is typically the integration point for this type of activity, via the DPCmdrService.idl IDL file, for the following reasons: • The MPS simplifies the interface with the billing or OSS system by minimizing the amount of data that needs to be transferred (only the MAC address), and by automatically configuring the DHCP service. As a result, a single API call can result in activation of the modem, with static IP addresses for the CPE behind it. On the other hand, the DHCP service requires a much more complex set of API calls, with extra data, to perform the same actions. • The MPS can store subscriber data in addition to device data. Subscriber data includes name, account ID, and contact information. • The MPS automatically detects if a provisioning change requires a modem reset, and can automatically reset the modem immediately or at a time specified via the API. • The MPS handles PacketCable MTA provisioning sequences. Database Tables As defined in the DPCmdrService.idl IDL file, the MPS service contains database tables for subscriber and device data. Device data is stored in the form of “service records” (DataService, VoiceService, and CPEDevice), which are correlated with specific subscribers through lookup keys. Subscriber -Name -Account ID -Description -Organization -Department -Office -Email Addresses -Phone Numbers -Mailing Address -Notes -Creation Time -Last Modified Time -Lookup Key 1 DataService -Name -Description -MAC Address -FQDN -Max # of CPEs -ClientClasses -Creation Time -Last Modified Time 1 VoiceService * * -Name -Description -MAC Address -SNMP Version -FQDN -Enabled -Lines -Creation Time -Last Modified Time 0..1 1 CPEDevice -Name -Description -MAC Address -Modem -Client Classes -Static Addresses -Creation Time -Last Modified Time * * Line Configuration -Enabled -Endpoint Index -CMS FQDN -CMS Port © 2006 Incognito Software Inc. All rights reserved. Page 5 of 11 Broadband Command Center Software: OSS/BSS Integration Using CORBA APIs Devices supported by MPS 5.1 include: • Cable modems: stored as a “DataServiceV3” record • PacketCable MTAs: stored as a “VoiceServiceV2” record • SIP MTAs: stored as a “SIPDeviceV2” record • CPE: stored as a “CPEDevice” record. Storing CPE for subscribers is an optional feature that is not used in most deployments. Creating, Updating, or Deleting Database Records DatabaseControl API You can use the “databaseControl” API defined in DPCmdrService.idl to create, update, or delete records from subscriber or device tables in the MPS database: ErrorCode databaseControl(in AuthorizationToken in ControlCommand inout AnyRecordList authToken, command, recordData); Parameters: AuthToken The valid login session token acquired during service login. Command The “command” parameter, which indicates whether to add (CC_ADD), update (CC_SET), retrieve (CC_GET) or delete (CC_DELETE) a record. RecordData The list of records to add, update, retrieve, or delete. Deleting a subscriber record will automatically delete any devices associated with that subscriber. Java-based sample code for adding, updating and deleting subscriber records appears in the SDK at: MPS\CORBA-API\samples\subscriberprovisioning\src\mpssample\com\incognito\mpssample\SubscriberManager.java DeviceControl API to Allow Device Resets If you use the databaseControl API for a device record, and a reset is necessary for changes to take effect, the MPS automatically performs the reset on the device immediately. This immediate reset is not always desirable. For example, you may want to change the QoS for an eMTA cable modem’s data service, but resetting the eMTA would cause phone calls to be dropped. In this case, you may want to delay the reset until 2am. To allow a reset delay, the DPCmdrService.idl defines another API called deviceControl, which is the exact same as the databaseControl( ) API, except that it takes an additional “resetTime” parameter to control when the reset should occur: ErrorCode deviceControl(in AuthorizationToken in ControlCommand inout AnyRecordList in double authToken, command, recordData, resetTime); Lookup Keys for Subscriber-Device Association Each subscriber record contains a lookup key field named “r_ID.” This 16-byte array is the primary key – the unique identifier – for the record. The MPS service automatically assigns a value for the key when the databaseControl API is called to create a new record. This lookup key is persistent: its value never changes throughout the lifetime of the record and cannot be modified through any API. Each device record has an associated “LookupKey subscriberDataID” field, which contains the lookup key of the subscriber record (the “r_ID” field in the subscriber record). When adding or updating a © 2006 Incognito Software Inc. All rights reserved. Page 6 of 11 Broadband Command Center Software: OSS/BSS Integration Using CORBA APIs device, you can associate it with a particular subscriber by simply setting the subscriberDataID field to the value of the subscriber’s r_ID field. If the subscriberDataID field for a device is set to all-zero bytes, then the device does not belong to any subscriber and is considered, in this context, to be “unsubscribed.” The system still recognizes it, though, and still provisions it with the services associated with the device. Replacing a Device Replacing a device simply means changing its MAC address. For example, to replace a cable modem, you would typically: • Retrieve the current DataServiceV3 record for the old cable modem • Set the “cmMacAddress” field to the MAC address of the new cable modem. • Call the deviceControl API with the “CC_SET” command to update the modem’s data service record with the new MAC address. All instances of the old cable modem MAC address are automatically replaced with the new cable modem MAC address in all configurations on the MPS and DHCP service. Search and Retrieval of Database Records The DPCmdrService.idl file defines a “databaseSearchEnum” API for search and retrieval of database records. This API can search for any type of record in any MPS database table: ErrorCode databaseSearchEnum(in AuthorizationToken in ObjectTypeList in SearchCriteriaSet in unsigned long inout unsigned long out unsigned long out AnyRecordList authToken, objectTypes, criteria, MaxCountPerPass, Pass, totalRecordCount, theList); For example, you can retrieve a subscriber record (including its r_ID member) by performing a search for the subscriber name, account ID, device MAC address, or other subscriber data. Java-based sample code for searching for subscribers by name, description, account ID, device MAC address, or IP address appears in the SDK at: MPS\CORBA-API\samples\subscriberprovisioning\src\mpssample\com\incognito\mpssample\SubscriberSearch.java Forcing a Reset on a Modem or MTA In order to force a cable modem or MTA to immediately reset, use the following “resetDevice” API defined in DPCmdrService.idl: ErrorCode resetDevice(in AuthorizationToken authToken, in MACAddress deviceMacAddress); Identifying Which Device is Currently Using an IP Address The “getMacAddress” API defined in DPCmdrService.idl identifies the device that is currently using a particular IP address. ErrorCode getMacAddress(in AuthorizationToken in IPAddress out MACAddress out MACAddress Parameters: authToken, leasedIPAddress, deviceMacAddress, cableModemMacAddress); LeasedIPAddress The IP address associated with the device. DeviceMacAddress The MAC address to which the IP address is currently assigned. © 2006 Incognito Software Inc. All rights reserved. Page 7 of 11 Broadband Command Center Software: OSS/BSS Integration Using CORBA APIs CableModemMacAddress The MAC address of the cable modem to which the device is connected. If the IP address belongs to the cable modem itself, then deviceMacAddress and cableModemMacAddress will have the same value. This value is only known to the system, and will therefore only be returned if the CMTS is operating in DOCSIS-compliant mode and is inserting the cable modem MAC addresses as a “remote ID” (DHCP option 82.2) into the device’s DHCP packets. Identifying IP Addresses Currently Assigned to a Device In order to determine which IP addresses are currently assigned to a particular device, use the following API defined in DPCmdrService.idl: ErrorCode getDeviceIPAddresses(in AuthorizationToken in MACAddress out IPAddressList authToken, deviceMacAddress, assignedIPs); Note that most devices only have a single IP address, but it is possible for some to have multiple IP addresses. Retrieving Active Lease for a Modem and All Connected CPE The “getDeviceInfo” API retrieves lease data for a cable modem and all attached CPE, and performs an SNMP query on the modem to retrieve a standard list of DOCSIS SNMP objects: ErrorCode getDeviceInfo(in AuthorizationToken in MACAddress out LeaseList out LeaseList out LeaseList out NamedStringBlockList authToken, cablemodem, cmLeases, mtaLeases, cpeLeases, snmpData); Returned IP address lease data can include the following, depending on the lease configuration: IP address Lease time Hostname assigned Hostname requested State Dynamic DNS Subnet mask Time offset Gateway Time server DNS servers Client FQDN NDS server NDS tree name NDS context Auto configuration MTA ticket granting server MTA provisioning timer MTA primary line service CMS Current lease time Gateway IP address RemoteID Circuit ID Client ID Vendor Class ID Log server Hostname Domain name Vendor class Client ID Name service search Subnet selection SIP server Classless static route Primary MTA DHCP MTA AS backoff and retry MTA AP backoff and retry MTA Kerberos ticket control © 2006 Incognito Software Inc. All rights reserved. Initial lease time DOCSIS Device Class Anti-Roaming IP Shuffled Anti-Spoofing Vendor-specific Data TFTP server Configuration file User class SLP directory agent SLP service scope Secondary MTA DHCP MTA provisioning server MTA primary DNS MTA secondary DNS MTA Kerberos realm MTA Kerberos ticket mask MTA KDC servers Page 8 of 11 Broadband Command Center Software: OSS/BSS Integration Using CORBA APIs Returned SNMP data can include the following, depending on the modem configuration: Description Uptime Serial Status Downstream Frequency Resets Lost Syncs Invalid MAPs Invalid Ucds Invalid Ranging OoS Maximum Downstream Bandwidth CPEFilter<index> Downstream Power Errorless codewords Correctable codewords Uncorrectable codewords Downstream S/N Ratio Invalid Registration T1 timeouts T2 timeouts T3 timeouts T4 timeouts OoS Maximum Transmit Burst Microreflections Downstream Modulation Upstream Frequency Upstream Power Timing Offset Ranging Aborts OoS Status OoS Priority OoS Guaranteed Upstream Bandwidth OoS Maximum Upstream Bandwidth OoS BPI Enabled Provisioning and Managing Static IP Addresses A “static IP address” in BCC software is an IP address that is always given to a particular device, or subscriber, and is never allocated to any other device. It does not imply that the device is manually configured or is not performing DHCP to acquire the IP address, although this is certainly possible. Some systems refer to this as a “reservation” or “sticky IP address.” Auto-Provisioning Process BCC software can auto-provision static IP addresses for CPE behind a cable modem using this process: • The DHCP service looks up the lease for the cable modem. • The DHCP determines which CMTS is responsible for inserting the GIADDR (gateway IP address) into the cable modem DHCP packets. • The DHCP service determines which other subnets are configured on the cable interface for this GIADDR. • The DHCP service evaluates the “rule tree” to determine which of the subnets found in step 3 can allocate IP addresses to devices behind this cable modem. • The DHCP service looks for one or more free contiguous IP addresses from the list of subscribers found in step 4, and converts them into “remote ID”-based static addresses or “remote ID and MAC address”-based static addresses. As a result of the above process, auto-provisioning only works under the following conditions: • The cable modem must currently have a lease. • The CMTS must be configured to insert the primary interface into all DHCP packets. • The DHCP service must be correctly configured with a CMTS Settings record for each CMTS, and with the gateway IP addresses configured and mapped to the appropriate “serviced networks” for each cable interface. The resulting static IP address will be based on “CPE remote ID,” which is actually the cable modem MAC address. The DHCP service assigns the static IP address to the first device that comes online behind the cable modem. If multiple static IP addresses exist for the same cable modem, then the DHCP service assigns the lowest static IP address to the first device that comes online behind the cable modem, and so on. In the case of multiple static IP addresses per cable modem, the CPE behind the modem can swap static IP addresses if those CPE release their IP addresses and then attempt to acquire an IP address from the DHCP service in the reverse order. © 2006 Incognito Software Inc. All rights reserved. Page 9 of 11 Broadband Command Center Software: OSS/BSS Integration Using CORBA APIs Auto-Provisioning Static IP Addresses With Data Service Records You can set up BCC software to auto-provision static addresses for CPE behind a cable modem by setting the “subscribedStaticAddressCount” field for a DataServiceV3 record and either adding or updating the record on the MPS. A few examples of how you can use the “subscribedStaticAddressCount” field are shown below: • You create a DataServiceV3 record for a cable modem with “subscribedStaticAddressCount” set to the value 2. BCC then auto-provisions 2 static addresses for devices behind the modem. • You update the DataServiceV3 record without modifying the “subscribedStaticAddressCount” field (its value remains at 2). No change is made to the static addresses for the modem – it retains 2 static IP addresses for devices behind it. • You update the DataServiceV3 record, changing the “subscribedStaticAddressCount” field to 3. As a result, BCC auto-provisions 1 additional static address for devices behind the modem, bringing the total number of static addresses for devices behind the modem to 3. • You update the DataServiceV3 record, changing the “subscribedStaticAddressCount” field to 1. BCC destroys the 2 highest static addresses previously provisioned for devices behind the modem, bringing the total number of static addresses for devices behind the modem to 1. Explicitly Managing Static IP Addresses The “provisionStaticAddress” API defined in DPCmdrService.idl allows you to explicitly provision static IP addresses in a number of ways, depending on which parameters are supplied with data when the API call is made. Note that provisioning static IP addresses through this API will not be reflected in the “subscribedStaticAddressCount” field for a DataServiceV3 record. ErrorCode provisionStaticAddress( in AuthorizationToken in MACAddress in MACAddress inout IPAddress Parameters: authToken, device, remoteID, staticIPAddress); Device The (optional) CPE MAC address that needs a static IP address. If you don’t supply a value for this parameter (length is set to 0), then you must provide a value for the RemoteID parameter so that the static IP address will be based on the remote ID or the remote ID + CPE MAC address (with a blank CPE MAC address), depending on service configuration. RemoteID The remote ID for the static IP address, typically the MAC address of the cable modem to which the CPE is connected. If you don’t supply a value for this parameter (length is set to 0), then you must supply values for the Device and IPAddress parameters so that the static IP address will be MAC address-based. IPAddress The static IP address required. If you don’t supply a value for this parameter, then you must supply a value for RemoteID using the MAC address of a DOCSIS cable modem, and this will be the IP address that BCC will autoprovision. When the call is successfully returned, IPAddress holds the value of the auto-provisioned IP address. To un-provision static IP addresses created with the above provisionStaticAddress API, you must use the following unprovisionStaticAddress API defined in DPCmdrService.idl. ErrorCode unprovisionStaticAddress( in AuthorizationToken in MACAddress in MACAddress in IPAddress authToken, device, remoteID, staticIPAddress); © 2006 Incognito Software Inc. All rights reserved. Page 10 of 11 Broadband Command Center Software: OSS/BSS Integration Using CORBA APIs Parameters: Device The MAC address of the device for which static IP address(es) needs to be deleted. RemoteID The remote ID for which the static IP address needs to be deleted. IPAdress The IP address for which the static IP address needs to be deleted. If you don’t supply a value for this parameter, then ALL static addresses matching the device and/or remote ID fields will be deleted. Note that the above API can delete multiple static address records, depending on which parameters are supplied with data. For example, if you pass only a remoteID to the call, all static IP addresses associated with that remoteID will be deleted. If you pass the IP address parameter to the call, then only one static address is deleted since there is only one static address for each IP address. Subscriber Provisioning via the CLI Please refer to the SDK document MPS\CLI-Integration\MPS-CLI-Integration.doc for details on all common provisioning activities through the CLI. References DOCSIS 1.0 Radio Frequency Interface Specification, November 6, 2001, Cable Television Laboratories, Inc., http://www.cablemodem.com/ DOCSIS 1.1 Radio Frequency Interface Specification, SP-RFIv1.1-I10-030730, July 30, 2003, Cable Television Laboratories, Inc., http://www.cablemodem.com/ DOCSIS 2.0 Radio Frequency Interface Specification, CM-SP-RFIv2.0-I08-050408, April 8, 2005, Cable Television Laboratories, Inc., http://www.cablemodem.com/ DOCSIS Cable Device MIB, RFC 2669, August 1999, M. St. Johns, Ed., PacketCable MTA Device Provisioning Specification, PKT-SP-PROV-I10-040730, July 30, 2004, Cable Television Laboratories, Inc., http://www.packetcable.com/ PacketCable Security Specification, PKT-SP-SEC-I11-040730, July 30, 2004, Cable Television Laboratories, Inc., http://www.packetcable.com/ PacketCable MTA MIB Specification, PKT-SP-MIB-MTA-I09-040402, April 02, 2004, Cable Television Laboratories, Inc., http://www.packetcable.com/ BCC Provisioning Overview, Incognito SDK 5.1, April 11, 2006, Incognito Software Inc., http://www.incognito.com/ Contact: Incognito Software Inc. Phone: 604.688.4332 or US/Canada toll free 800.877.1856 Fax: 604.688.4339 Email: sales@incognito.com Web: http://www.incognito.com © 2006 Incognito Software Inc. All rights reserved. Page 11 of 11