diff options
Diffstat (limited to 'ACE/ASNMP/asnmp/address.h')
-rw-r--r-- | ACE/ASNMP/asnmp/address.h | 845 |
1 files changed, 845 insertions, 0 deletions
diff --git a/ACE/ASNMP/asnmp/address.h b/ACE/ASNMP/asnmp/address.h new file mode 100644 index 00000000000..f8131c19485 --- /dev/null +++ b/ACE/ASNMP/asnmp/address.h @@ -0,0 +1,845 @@ + + +#ifndef ADDRESS_ +#define ADDRESS_ +//============================================================================= +/** + * @file address.h + * + * $Id$ + * + * Address class definition. Encapsulates various network + * addresses into easy to use, safe and portable classes. + * + * + * @author Peter E Mellquist + */ +//============================================================================= + + +/*=================================================================== + Copyright (c) 1996 + Hewlett-Packard Company + + ATTENTION: USE OF THIS SOFTWARE IS SUBJECT TO THE FOLLOWING TERMS. + Permission to use, copy, modify, distribute and/or sell this software + and/or its documentation is hereby granted without fee. User agrees + to display the above copyright notice and this license notice in all + copies of the software and any documentation of the software. User + agrees to assume all liability for the use of the software; Hewlett-Packard + makes no representations about the suitability of this software for any + purpose. It is provided "AS-IS without warranty of any kind,either express + or implied. User hereby grants a royalty-free license to any and all + derivatives based upon this software code base. +=====================================================================*/ + +//----[ includes ]----------------------------------------------------- +// ACE OS Adaption layer +#include "ace/os_include/netinet/os_in.h" +#include "ace/os_include/os_netdb.h" +#include "ace/Log_Msg.h" + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +# pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + +#include "asnmp/smival.h" +#include "asnmp/octet.h" + +//----[ enumerated types ] -------------------------------- +enum address_lengths { + IPV4LEN=4, + UDPIPV4LEN=6, + IPV6LEN=16, + UDPIPV6LEN=18, + IPXLEN=10, + IPXSOCKLEN=12, + NETBIOSLEN=16, + APPLETKLEN=3, + DECNETLEN=2, + MACLEN=6, + HASH0LEN=19, + HASH1LEN=13, + HASH2LEN=7, + MAX_ADDR_SZ=20, + MAX_DISPLAY_SZ=MAXHOSTNAMELEN+1 +}; + +enum addr_type { + type_ip, + type_ipx, + type_udp, + type_ipxsock, + type_mac, + type_nb, + type_atk, + type_decnet, + type_e164, + type_sip, // IPv6 + type_invalid +}; + +// TODO: get rest of nb service types added here +enum nb_service { + nb_workstation = 0x0, nb_server = 0x20 +}; + +//---[ forward declarations ]----------------------------------------- +class GenAddress; +class UdpAddress; +class IpxSockAddress; +class NetbiosAddress; +class SIPAddress; // aka ipv6 + +// TODO: +// class AtmE164Address; + + +//-------------------------------------------------------------------- +//----[ Address class ]----------------------------------------------- +//-------------------------------------------------------------------- +/** + * @class + * + * @brief Defines the member functions for the abstract base class + * Address. An Address is a unique network endpoint. + */ +class ASNMP_Export Address: public SnmpSyntax +{ + +public: + /// allow destruction of derived classes + virtual ~Address(); + + /// overloaded equivlence operator, are two addresses equal? + friend ASNMP_Export bool operator==( const Address &lhs,const Address &rhs); + + /// overloaded not equivlence operator, are two addresses not equal? + friend ASNMP_Export bool operator!=( const Address &lhs,const Address &rhs); + + /// overloaded > operator, is a1 > a2 + friend ASNMP_Export bool operator>( const Address &lhs,const Address &rhs); + + /// overloaded >= operator, is a1 >= a2 + friend ASNMP_Export bool operator>=( const Address &lhs,const Address &rhs); + + /// overloaded < operator, is a1 < a2 + friend ASNMP_Export bool operator<( const Address &lhs,const Address &rhs); + + /// overloaded <= operator, is a1 <= a2 + friend ASNMP_Export bool operator<=( const Address &lhs,const Address &rhs); + + /// equivlence operator overloaded, are an address and a string equal? + friend ASNMP_Export bool operator==( const Address &lhs,const char *rhs); + + /// overloaded not equivlence operator, are an address and string not equal? + friend ASNMP_Export bool operator!=( const Address &lhs,const char *rhs); + + /// overloaded < , is an address greater than a string? + friend ASNMP_Export bool operator>( const Address &lhs,const char *rhs); + + /// overloaded >=, is an address greater than or equal to a string? + friend ASNMP_Export bool operator>=( const Address &lhs,const char *rhs); + + /// overloaded < , is an address less than a string? + friend ASNMP_Export bool operator<( const Address &lhs,const char *rhs); + + /// overloaded <=, is an address less than or equal to a string? + friend ASNMP_Export bool operator<=( const Address &lhs,const char *rhs); + + /// overloaded const char * cast + virtual operator const char *() const = 0; + + /// verify the is the address object constructed ok + virtual int valid() const; + + /// return a suitable buffer to contain the address + virtual void to_octet(OctetStr& octet) const = 0; + + /// (pure virtual) syntax type + virtual SmiUINT32 get_syntax() = 0; + + /// for non const [], allows reading and writing + unsigned char& operator[]( const int position); + + /// get a printable ASCII value + virtual const char *to_string() = 0; + + /// create a new instance of this Value + virtual SnmpSyntax *clone() const = 0; + + /// return the type of address + virtual addr_type get_type() const = 0; + + /// overloaded assignment operator + virtual SnmpSyntax& operator=( SnmpSyntax &val) = 0; + + /// return a hash key + virtual unsigned int hashFunction() const { return 0;}; + + +protected: + /// state of constructed object (1/0) + /// addr internal representation + int valid_flag; + unsigned char address_buffer[MAX_ADDR_SZ]; + + /// parse the address string + /// redefined for each specific address subclass + virtual int parse_address( const char * inaddr) =0; + + /// format the output + /// redefined for each specific address subclass + virtual void format_output() =0; + + /// a reused trimm white space method + void trim_white_space( char * ptr); +}; + + +//----------------------------------------------------------------------- +//---------[ IPv4 Address Class ]---------------------------------------- +//----------------------------------------------------------------------- +/** + * @class IpAddress + * + * @brief Defines the member functions for the concrete class IpAddress + * An IP Version 4 Address is 4 bytes long and consists of a + * Network, Sub Network, and host component. + */ +class ASNMP_Export IpAddress : public Address +{ +public: + /// default construct an IP address with a string + IpAddress( const char *inaddr = ""); + + /// construct an IP address with another IP address + IpAddress( const IpAddress &ipaddr); + + /// construct an IP address with a GenAddress + IpAddress( const GenAddress &genaddr); + + /// destructor (ensure that SnmpSyntax::~SnmpSyntax() is overridden) + ~IpAddress(); + + /// copy an instance of this Value + SnmpSyntax& operator=( SnmpSyntax &val); + + /// assignment to another IpAddress object overloaded + IpAddress& operator=( const IpAddress &ipaddress); + + // TODO: add ability to set addr given long + + /// create a new instance of this Value + SnmpSyntax *clone() const; + + /// return the DNS Fully Qualified Domain Name (host.domain) + /// on failure returns dotted_quad string + const char *resolve_hostname(int& was_found); + + /// return string representation of object (dotted quad returned) + virtual const char *to_string() ; + + /// const char * operator overloaded for streaming output + virtual operator const char *() const; + + /// logically AND two IPaddresses and + /// return the new one + void mask( const IpAddress& ipaddr); + + /// return the type + virtual addr_type get_type() const; + + /// syntax type + virtual SmiUINT32 get_syntax(); + + /// is this the loopback address? 127.0.0.1/loopback/1.0.0.127.in-addr.arpa + int is_loopback() const; + + /// determine if this is a multicast address + int is_multicast() const; + + /// determine if this a broadcast address + int is_broadcast() const; + + /// per RFC 1597, private addresses are:: 10, 172.16, and 192.168.0 + int is_private() const; + + /// convert address into octet string format in network byte order + virtual void to_octet(OctetStr& octet) const; + +protected: + char output_buffer[MAX_DISPLAY_SZ]; // output buffer + + /// friendly name storage + char iv_friendly_name_[MAX_DISPLAY_SZ]; + + /// did resolver call work? some addrs won't resolve + int iv_friendly_name_status_; + + /// redefined parse address + /// specific to IP addresses + virtual int parse_address( const char *inaddr); + + /// redefined format output + /// specific to IP addresses + virtual void format_output(); + + /// parse a dotted string + int parse_dotted_ipstring( const char *inaddr); + + /// using the currently defined address, do a gethostbyname() + /// and try to fill up the name + int addr_to_friendly(); + + /// thread safe routine to lookup ip address given hostname + /// return <> 0 on error + static int resolve_to_address(const char *hostname, in_addr& quad_addr); + + /// thread safe routine to lookup name given ip address + /// return <> 0 on error + static int resolve_to_hostname(const in_addr& quad_addr, char *hostname); + +}; + +//------------------------------------------------------------------------ +//--------------[ DNS Iterator Class ]------------------------------------ +//------------------------------------------------------------------------ + +/** + * @class Address_Iter + * + * @brief Defines routines to obtain information on a hostname/FQDN + * such as multiple addresses + */ +class ASNMP_Export Address_Iter +{ +public: + Address_Iter(const char *hostname); // fully qualified domain name, hostname + + /// did hostname resolve via DNS? + int valid() const; + + /// how many addresses associated with this hostname + int how_many_addresses(); + + /// return next address + int next(IpAddress& addr); + +private: + Address_Iter(const Address_Iter&); + int valid_; // ctor status + int count_; // number of addresses + char **entry_; // ptr to current address + struct hostent lookupResult_; + ACE_HOSTENT_DATA buffer_; + int query_dns(const char *hostname); +}; + +//------------------------------------------------------------------------ +//---------[ UDP/IPv4 Address Class ]------------------------------------- +//------------------------------------------------------------------------ +/** + * @class + * + * @brief Defines the member functions for the concrete class UdpAddress + * A Udp Address consists of an IP Version 4 Address (IpAddress) + * and a 2 byte unsigned port number. (see /etc/services file) + * User Datagram Protocol (UDP) is a best effort transport + */ +class ASNMP_Export UdpAddress : public IpAddress +{ +public: + /// default constructor with a dotted string in the form of addr:port + UdpAddress( const char *inaddr = ""); + + /// construct an Udp address with another Udp address + UdpAddress( const UdpAddress &udpaddr); + + /// construct a Udp address with a GenAddress + UdpAddress( const GenAddress &genaddr); + + /// construct a Udp address with an IpAddress + /// default port # to zero + UdpAddress( const IpAddress &ipaddr); + + /// destructor + ~UdpAddress(); + + /// syntax type + SmiUINT32 get_syntax(); + + /// copy an instance of this Value + SnmpSyntax& operator=( SnmpSyntax &val); + + /// assignment to another IpAddress object overloaded + UdpAddress& operator=( const UdpAddress &udpaddr); + + /// create a new instance of this Value + SnmpSyntax *clone() const; + + /// output in the form of address:port + virtual const char *to_string() ; + + /// const char * operator overloaded for streaming output + virtual operator const char *() const; + + /// set the port number + void set_port( const unsigned short p); + + /// get the port number + unsigned short get_port() const; + + /// return the type + virtual addr_type get_type() const; + +protected: + /// output buffer + char output_buffer[MAX_DISPLAY_SZ]; + + /// redefined parse address + /// specific to IP addresses + virtual int parse_address( const char *inaddr); + + /// redefined format output + /// specific to IP addresses + virtual void format_output(); +}; + + +//------------------------------------------------------------------------- +//---------[ 802.3 MAC Address Class ]------------------------------------- +//------------------------------------------------------------------------- +/** + * @class + * + * @brief Defines the member functions for the concrete class MacAddress. + * A Media Access Control Address consists of 48 bits as defined + * in IEEE 802.3 specifications. + */ +class ASNMP_Export MacAddress : public Address +{ +public: + /// constructor with a string argument + MacAddress( const char *inaddr = ""); + + /// constructor with another MAC object + MacAddress( const MacAddress &macaddr); + + /// construct a MacAddress with a GenAddress + MacAddress( const GenAddress &genaddr); + + /// destructor + ~MacAddress(); + + /// syntax type + SmiUINT32 get_syntax(); + + /// copy an instance of this Value + SnmpSyntax& operator=( SnmpSyntax &val); + + /// assignment to another IpAddress object overloaded + MacAddress& operator=( const MacAddress &macaddress); + + /// create a new instance of this Value + SnmpSyntax *clone() const; + + /// create a string to internal class storage representing object + virtual const char *to_string(); + + /// const char * operator overloaded for streaming output + virtual operator const char *() const; + + /// return the type + virtual addr_type get_type() const; + + /// return a hash key + unsigned int hashFunction() const; + + /// return byte array of the mac address + virtual void to_octet(OctetStr& octet) const; + +protected: + /// output buffer containing string representation of object + char output_buffer[MAX_DISPLAY_SZ]; + + /// redefined parse address for macs + virtual int parse_address( const char *inaddr); + + /// redefined format output for MACs + virtual void format_output(); +}; + +//------------------------------------------------------------------------ +//---------[ Netbios Address Class ]-------------------------------------- +//------------------------------------------------------------------------ +/** + * @class + * + * @brief Defines the member functions for the concrete class NetbiosAddress. + * The IBM/Microsoft address for NETBIOS, NETBEUI protocol transport. + */ +class ASNMP_Export NetbiosAddress : public Address +{ +public: + + /// default constructor with string arg + NetbiosAddress( const char *inaddr = ""); + + /// set name and service type + NetbiosAddress( const char *inaddr, nb_service svc); + + /// copy constructor + NetbiosAddress( const NetbiosAddress& nbaddr); + + /// construct with a GenAddress + NetbiosAddress( const GenAddress& genaddr); + + ~NetbiosAddress(); + + virtual const char *to_string(); + + NetbiosAddress& operator=( const NetbiosAddress &nbaddr); + + /// retrieve the network service type + nb_service get_service_type() const; + + /// set the service type (workstation, server, etc) + void set_service_type(nb_service nbservice); + + /// const char * operator overloaded for streaming output + virtual operator const char *() const; + + /// syntax type + virtual SmiUINT32 get_syntax(); + + /// copy an instance of this Value + SnmpSyntax& operator=( SnmpSyntax &val); + + /// create a new instance of this Value + SnmpSyntax *clone() const; + + /// output byte buffer containing netbios name + virtual void to_octet(OctetStr& octet) const; + +protected: + void InitNBAddr(const char *inaddr); + char output_buffer[MAX_DISPLAY_SZ]; + + /// output buffer to hold string representation + virtual void format_output(); + virtual int parse_address( const char *inaddr); + virtual addr_type get_type() const; +}; + +//------------------------------------------------------------------------ +//---------[ DecNet Address Class ]--------------------------------------- +//------------------------------------------------------------------------ +/** + * @class + * + * @brief Defines the member functions for the concrete class DecNetAddress. + * DecNet Phase ? address consists of two octets (CISCO-TC.my) + */ +class ASNMP_Export DecNetAddress : public Address +{ + public: + /// default constructor with string arg + DecNetAddress( const char *inaddr = ""); + + /// copy constructor + DecNetAddress( const DecNetAddress& decaddr); + + /// construct with a GenAddress + DecNetAddress( const GenAddress& genaddr); + + ~DecNetAddress(); + + virtual const char *to_string(); + + DecNetAddress& operator=( const DecNetAddress &decaddr); + + /// convert address into octet string format 2 bytes of decnet address + virtual void to_octet(OctetStr& octet) const; + + /// const char * operator overloaded for streaming output + virtual operator const char *() const; + + /// syntax type + virtual SmiUINT32 get_syntax(); + + /// copy an instance of this Value + SnmpSyntax& operator=( SnmpSyntax &val); + + /// create a new instance of this Value + SnmpSyntax *clone() const; + + protected: + virtual int parse_address( const char *inaddr); + virtual addr_type get_type() const; + virtual void format_output(); + char output_buffer[MAX_DISPLAY_SZ]; +}; + +//------------------------------------------------------------------------ +//---------[ AppleTalk Address Class ]------------------------------------ +//------------------------------------------------------------------------ +/** + * @class + * + * @brief Defines the member functions for the concrete class DecNetAddress. + * DecNet Phase ? address consists of two octets (CISCO-TC.my) + */ +class ASNMP_Export AppleTalkAddress : public Address +{ + public: + /// default constructor with string arg + AppleTalkAddress( const char *inaddr = ""); + + /// copy constructor + AppleTalkAddress( const AppleTalkAddress& atkaddr); + + /// construct with a GenAddress + AppleTalkAddress( const GenAddress& genaddr); + + ~AppleTalkAddress(); + + virtual const char *to_string(); + + AppleTalkAddress& operator=( const AppleTalkAddress &atkaddr); + + /// convert address into octet string format 3 bytes of atk address + virtual void to_octet(OctetStr& octet) const; + + /// get the host part of the address + char get_host_address() const; + + /// set the host part of the address + void set_host_address(const char); + + /// get the 2 byte atk network address + short get_net_address() const; + + /// set the host 2 byte atk network address + void set_net_address(const short atknet); + + /// const char * operator overloaded for streaming output + virtual operator const char *() const; + + /// syntax type + virtual SmiUINT32 get_syntax(); + + /// copy an instance of this Value + SnmpSyntax& operator=( SnmpSyntax &val); + + /// create a new instance of this Value + SnmpSyntax *clone() const; + + private: + virtual int parse_address( const char *inaddr); + virtual addr_type get_type() const; + virtual void format_output(); + char output_buffer[MAX_DISPLAY_SZ]; +}; + +//------------------------------------------------------------------------ +//---------[ IPX Address Class ]------------------------------------------ +//------------------------------------------------------------------------ +/** + * @class IpxAddress + * + * @brief Defines the member functions for the concrete class IpxAddress. + * Novell's IPX (version ?) network protocol endpoint + */ +class ASNMP_Export IpxAddress : public Address +{ +public: + /// default constructor with a string arg + IpxAddress( const char *inaddr = ""); + + /// constructor with another ipx object + IpxAddress( const IpxAddress &ipxaddr); + + /// construct with a GenAddress + IpxAddress( const GenAddress &genaddr); + + /// destructor + ~IpxAddress(); + + /// syntax type + virtual SmiUINT32 get_syntax(); + + /// copy an instance of this Value + SnmpSyntax& operator=( SnmpSyntax &val); + + /// assignment to another IpxAddress object overloaded + IpxAddress& operator=( const IpxAddress &ipxaddress); + + /// get the host id portion of an ipx address + int get_hostid( MacAddress& mac); + + /// create a new instance of this Value + SnmpSyntax *clone() const; + + /// create string represtation of object value + virtual const char *to_string(); + + /// const char * operator overloaded for streaming output + virtual operator const char *() const; + + /// return the type + virtual addr_type get_type() const; + + /// return byte sequence containing ipx address + virtual void to_octet(OctetStr& octet) const; + +protected: + /// ipx format separator {:,/} + char separator; + + /// output buffer to hold string representation + char output_buffer[MAX_DISPLAY_SZ]; + + /// redefined parse address for ipx strings + virtual int parse_address( const char *inaddr); + + /// redefined format output for ipx strings + /// uses same separator as when constructed + virtual void format_output(); +}; + + + +//------------------------------------------------------------------------ +//---------[ IpxSock Address Class ]-------------------------------------- +//------------------------------------------------------------------------ +/** + * @class IpxSockAddress + * + * @brief Defines the member functions for the concrete class IpxAddress. + * Novell's IPX (version ?) network protocol endpoint + */ +class ASNMP_Export IpxSockAddress : public IpxAddress +{ +public: + /// constructor with a dotted string + IpxSockAddress( const char *inaddr = ""); + + /// construct an Udp address with another Udp address + IpxSockAddress( const IpxSockAddress &ipxaddr); + + ///constructor with a GenAddress + IpxSockAddress( const GenAddress &genaddr); + + ///constructor with a IpxAddress + /// default socket # is 0 + IpxSockAddress( const IpxAddress &ipxaddr); + + /// destructor + ~IpxSockAddress(); + + /// syntax type + virtual SmiUINT32 get_syntax(); + + /// copy an instance of this Value + SnmpSyntax& operator=( SnmpSyntax &val); + + /// assignment to another IpxAddress object overloaded + IpxSockAddress& operator=( const IpxSockAddress &ipxaddr); + + /// create a new instance of this Value + SnmpSyntax *clone() const; + + /// set the socket number + void set_socket( const unsigned short s); + + /// get the socket number + unsigned short get_socket() const; + + /// create string representation of object value + virtual const char *to_string(); + + /// const char * operator overloaded for streaming output + virtual operator const char *() const; + + /// return the type + virtual addr_type get_type() const; + +protected: + /// output buffer to hold string representation of object + char output_buffer[MAX_DISPLAY_SZ]; + + /// redefined parse address for ipx strings + virtual int parse_address( const char *inaddr); + + /// redefined format output + /// specific to IP addresses + virtual void format_output(); +}; + +//------------------------------------------------------------------------- +//--------[ Generic Address ]---------------------------------------------- +//------------------------------------------------------------------------- +/** + * @class GenAddress + * + * @brief Defines the member functions for the concrete class GenAddress. + * This class attempts to determine an address type given a char string. + */ +class ASNMP_Export GenAddress : public Address +{ +public: + /// constructor with a string argument + GenAddress( const char *addr = ""); + + /// constructor with an Address + GenAddress( const Address &addr); + + /// constructor with another GenAddress + GenAddress( const GenAddress &addr); + + /// destructor + ~GenAddress(); + + /// get the snmp syntax of the contained address + SmiUINT32 get_syntax(); + + /// create a new instance of this Value + SnmpSyntax *clone() const; + + /// assignment of a GenAddress + GenAddress& operator=( const GenAddress &addr); + + /// copy an instance of this Value + SnmpSyntax& operator=( SnmpSyntax &val); + + /// string representation of object value + virtual const char *to_string(); + + /// const char * operator overloaded for streaming output + virtual operator const char *() const; + + /// return the type + virtual addr_type get_type() const; + + /// return the address as a octet sequence + virtual void to_octet(OctetStr& octet) const; + +protected: + /// pointer to a a concrete address + Address *address; + + /// output buffer of objects value + char output_buffer[MAX_DISPLAY_SZ]; + + /// redefined parse address for macs + virtual int parse_address( const char *addr); + + /// format output for a generic address + virtual void format_output(); + + /// initialize smi data structure + void init_smi(); +}; + +#endif //_ADDRESS |