⛏️ index : haiku.git

/*
 * Copyright 2006-2010, Haiku, Inc. All Rights Reserved.
 * Distributed under the terms of the MIT License.
 */
#ifndef NET_DATALINK_H
#define NET_DATALINK_H


#include <net/if.h>

#include <net_buffer.h>
#include <net_routing_info.h>

#include <util/list.h>


#define NET_DATALINK_MODULE_NAME "network/stack/datalink/v1"


class Checksum;
struct net_protocol;


typedef struct net_datalink_protocol net_datalink_protocol;


typedef struct net_domain {
	const char*			name;
	int					family;

	struct net_protocol_module_info* module;
	struct net_address_module_info* address_module;
} net_domain;

typedef struct net_interface_address {
	struct net_domain*	domain;
	struct net_interface* interface;
	struct sockaddr*	local;
	struct sockaddr*	destination;
	struct sockaddr*	mask;
	uint32_t			flags;
} net_interface_address;

typedef struct net_interface {
	struct net_device*	device;

	char				name[IF_NAMESIZE];
	uint32				index;
	uint32				flags;
	uint8				type;
	uint32				metric;
} net_interface;

typedef struct net_route {
	struct sockaddr*	destination;
	struct sockaddr*	mask;
	struct sockaddr*	gateway;
	uint32				flags;
	uint32				mtu;
	struct net_interface_address* interface_address;
} net_route;

typedef struct net_route_info {
	struct list_link	link;
	struct net_route*	route;
	struct sockaddr		address;
} net_route_info;


struct net_datalink_module_info {
	module_info info;

	status_t		(*control)(net_domain* domain, int32 option, void* value,
						size_t* _length);
	status_t		(*send_routed_data)(net_route* route, net_buffer* buffer);
	status_t		(*send_data)(struct net_protocol* protocol,
						net_domain* domain, net_buffer* buffer);

	bool			(*is_local_address)(net_domain* domain,
						const struct sockaddr* address,
						net_interface_address** _interfaceAddress,
						uint32* _matchedType);
	bool			(*is_local_link_address)(net_domain* domain,
						bool unconfigured, const struct sockaddr* address,
						net_interface_address** _interfaceAddress);

	net_interface*	(*get_interface)(net_domain* domain, uint32 index);
	net_interface*	(*get_interface_with_address)(
						const struct sockaddr* address);
	void			(*put_interface)(net_interface* interface);

	net_interface_address* (*get_interface_address)(
						const struct sockaddr* address);
	bool			(*get_next_interface_address)(net_interface* interface,
						net_interface_address** _address);
	void			(*put_interface_address)(net_interface_address* address);

	status_t		(*join_multicast)(net_interface* interface,
						net_domain* domain, const struct sockaddr* address);
	status_t		(*leave_multicast)(net_interface* interface,
						net_domain* domain, const struct sockaddr* address);

	// routes
	status_t		(*add_route)(net_domain* domain, const net_route* route);
	status_t		(*remove_route)(net_domain* domain, const net_route* route);
	net_route*		(*get_route)(net_domain* domain,
						const struct sockaddr* address);
	status_t		(*get_buffer_route)(net_domain* domain,
						struct net_buffer* buffer, net_route** _route);
	void			(*put_route)(net_domain* domain, net_route* route);

	status_t		(*register_route_info)(net_domain* domain,
						net_route_info* info);
	status_t		(*unregister_route_info)(net_domain* domain,
						net_route_info* info);
	status_t		(*update_route_info)(net_domain* domain,
						net_route_info* info);
};

#define NET_ADDRESS_MODULE_FLAG_BROADCAST_ADDRESS		0x01

struct net_address_module_info {
	module_info info;
	uint32 flags;

	status_t		(*copy_address)(const struct sockaddr* from,
						struct sockaddr** to, bool replaceWithZeros,
						const struct sockaddr* mask);

	status_t		(*mask_address)(const struct sockaddr* address,
						const struct sockaddr* mask, struct sockaddr* result);

	bool			(*equal_addresses)(const struct sockaddr* a,
						const struct sockaddr* b);
	bool			(*equal_ports)(const struct sockaddr* a,
						const struct sockaddr* b);
	bool			(*equal_addresses_and_ports)(const struct sockaddr* a,
						const struct sockaddr* b);
	bool			(*equal_masked_addresses)(const struct sockaddr* a,
						const struct sockaddr* b, const struct sockaddr* mask);
	bool			(*is_empty_address)(const struct sockaddr* address,
						bool checkPort);
	bool			(*is_same_family)(const struct sockaddr* address);

	int32			(*first_mask_bit)(const struct sockaddr* mask);

	bool			(*check_mask)(const struct sockaddr* address);

	status_t		(*print_address)(const struct sockaddr* address,
						char** buffer, bool printPort);
	status_t		(*print_address_buffer)(const struct sockaddr* address,
						char* buffer, size_t bufferSize, bool printPort);

	uint16			(*get_port)(const struct sockaddr* address);
	status_t		(*set_port)(struct sockaddr* address, uint16 port);

	status_t		(*set_to)(struct sockaddr* address,
						const struct sockaddr* from);
	status_t		(*set_to_empty_address)(struct sockaddr* address);
	status_t		(*set_to_defaults)(struct sockaddr* defaultMask,
						struct sockaddr* defaultBroadcast,
						const struct sockaddr* address,
						const struct sockaddr* netmask);

	status_t		(*update_to)(struct sockaddr* address,
						const struct sockaddr* from);

	uint32			(*hash_address)(const struct sockaddr* address,
						bool includePort);
	uint32			(*hash_address_pair)(const struct sockaddr* ourAddress,
						const struct sockaddr* peerAddress);

	status_t		(*checksum_address)(Checksum* checksum,
						const struct sockaddr* address);

	void			(*get_loopback_address)(struct sockaddr* result);
};


#endif	// NET_DATALINK_H