xref: /haiku/src/add-ons/kernel/network/stack/interfaces.h (revision 62f5ba006a08b0df30631375878effaf67ae5dbc)
1 /*
2  * Copyright 2006-2009, Haiku, Inc. All Rights Reserved.
3  * Distributed under the terms of the MIT License.
4  *
5  * Authors:
6  *		Axel Dörfler, axeld@pinc-software.de
7  */
8 #ifndef INTERFACES_H
9 #define INTERFACES_H
10 
11 
12 #include <net_datalink.h>
13 #include <net_stack.h>
14 
15 #include <util/DoublyLinkedList.h>
16 
17 
18 struct net_device_handler : DoublyLinkedListLinkImpl<net_device_handler> {
19 	net_receive_func	func;
20 	int32				type;
21 	void*				cookie;
22 };
23 
24 typedef DoublyLinkedList<net_device_handler> DeviceHandlerList;
25 
26 typedef DoublyLinkedList<net_device_monitor,
27 	DoublyLinkedListCLink<net_device_monitor> > DeviceMonitorList;
28 
29 struct net_device_interface : DoublyLinkedListLinkImpl<net_device_interface> {
30 	struct net_device*	device;
31 	thread_id			reader_thread;
32 	uint32				up_count;
33 		// a device can be brought up by more than one interface
34 	int32				ref_count;
35 
36 	net_deframe_func	deframe_func;
37 	int32				deframe_ref_count;
38 
39 	DeviceMonitorList	monitor_funcs;
40 	DeviceHandlerList	receive_funcs;
41 
42 	recursive_lock		receive_lock;
43 
44 	thread_id			consumer_thread;
45 	net_fifo			receive_queue;
46 };
47 
48 typedef DoublyLinkedList<net_device_interface> DeviceInterfaceList;
49 
50 struct net_interface_private : net_interface {
51 	char				base_name[IF_NAMESIZE];
52 	net_device_interface* device_interface;
53 	net_route_private	direct_route;
54 };
55 
56 
57 status_t init_interfaces();
58 status_t uninit_interfaces();
59 
60 // interfaces
61 struct net_interface_private* find_interface(struct net_domain* domain,
62 	const char* name);
63 struct net_interface_private* find_interface(struct net_domain* domain,
64 	uint32 index);
65 void put_interface(struct net_interface_private* interface);
66 struct net_interface_private* get_interface(net_domain* domain,
67 	const char* name);
68 status_t create_interface(net_domain* domain, const char* name,
69 	const char* baseName, net_device_interface* deviceInterface,
70 	struct net_interface_private** _interface);
71 void delete_interface(net_interface_private* interface);
72 void interface_set_down(net_interface* interface);
73 
74 // device interfaces
75 void get_device_interface_address(net_device_interface* interface,
76 	sockaddr* address);
77 uint32 count_device_interfaces();
78 status_t list_device_interfaces(void* buffer, size_t* _bufferSize);
79 void put_device_interface(struct net_device_interface* interface);
80 struct net_device_interface* get_device_interface(uint32 index);
81 struct net_device_interface* get_device_interface(const char* name,
82 	bool create = true);
83 void down_device_interface(net_device_interface* interface);
84 
85 // devices
86 status_t unregister_device_deframer(net_device* device);
87 status_t register_device_deframer(net_device* device, net_deframe_func deframeFunc);
88 status_t register_domain_device_handler(struct net_device* device, int32 type,
89 	struct net_domain* domain);
90 status_t register_device_handler(struct net_device* device, int32 type,
91 	net_receive_func receiveFunc, void* cookie);
92 status_t unregister_device_handler(struct net_device* device, int32 type);
93 status_t register_device_monitor(struct net_device* device,
94 	struct net_device_monitor* monitor);
95 status_t unregister_device_monitor(struct net_device* device,
96 	struct net_device_monitor* monitor);
97 status_t device_link_changed(net_device* device);
98 status_t device_removed(net_device* device);
99 status_t device_enqueue_buffer(net_device* device, net_buffer* buffer);
100 
101 #endif	// INTERFACES_H
102