/* ip3_addr.h: Header file for IP version 3 addressing scheme. */

/*	IP address constants.	*/
#define IPC_ADDR_SIZE				4		/* Size of IP address, change for IPv6. */
#define IPC_ADDR_STR_LEN			32		/* Useful size for an IP address string. */
#define IPC_ADDR_INVALID			OPC_NIL	/* Invalid IP address. */

/*	IP address classes.		*/
#define	IPC_ADDRESS_CLASS_UNSPEC	100
#define	IPC_ADDRESS_CLASS_A			101
#define	IPC_ADDRESS_CLASS_B			102
#define	IPC_ADDRESS_CLASS_C			103
#define	IPC_ADDRESS_CLASS_D			104

/*	IP address data types.	*/
typedef unsigned char *				IpT_Address;
typedef	int							IpT_Address_Class;

typedef struct IpT_Address_Range
	{
	IpT_Address 	address;
	IpT_Address		subnet_mask;
	} IpT_Address_Range;

/*	IP address functions.	*/
void				ip_address_pkg_init (void);
IpT_Address			ip_address_alloc (void);
IpT_Address			ip_address_create (char *addr_str);
IpT_Address			ip_address_complement_create (IpT_Address addr);
IpT_Address			ip_address_node_broadcast_create (IpT_Address addr, IpT_Address subnet_mask);
Boolean				ip_address_is_broadcast (IpT_Address addr, IpT_Address subnet_mask);
int					ip_address_to_int (IpT_Address addr);
IpT_Address			ip_address_from_int (int int_ip_addr);
IpT_Address			ip_address_copy (IpT_Address addr);
IpT_Address			ip_address_copy_create (IpT_Address addr, int alloc_size);
void				ip_address_destroy (IpT_Address addr);
void				ip_address_print (char *str, IpT_Address addr);
void				ip_address_print_debug (IpT_Address addr);
IpT_Address_Range *	ip_address_range_create (IpT_Address addr, IpT_Address subnet_mask);
IpT_Address_Range *	ip_address_range_copy (IpT_Address_Range *addr_range_ptr);
void				ip_address_range_destroy (IpT_Address_Range *addr_range_ptr);
void				ip_address_range_print (char *addr_str, char *subnet_mask_str, IpT_Address_Range *addr_range_ptr);
Boolean				ip_address_equal (IpT_Address addr1, IpT_Address addr2);
IpT_Address			ip_address_mask (IpT_Address addr, IpT_Address subnet_mask);
Boolean				ip_address_range_check (IpT_Address addr, IpT_Address_Range *addr_range_ptr);
Boolean				ip_address_is_multicast (IpT_Address addr);
void				ip_address_multicast_register (IpT_Address addr, Objid node_objid);
void				ip_address_multicast_deregister (IpT_Address addr, Objid node_objid);
IpT_Address_Class	ip_address_class (IpT_Address addr);
IpT_Address			ip_default_smask_create (IpT_Address ip_addr);
IpT_Address			ip_default_smask_from_class (IpT_Address_Class class);
void				ip_address_fields_obtain (IpT_Address addr, int *field1, int *field2, int *field3, int *field4);
Boolean				ip_smask_address_verify (IpT_Address address, IpT_Address mask);
