xref: /haiku/src/add-ons/kernel/network/stack/interfaces.h (revision ed6250c95736c0b55da79d6e9dd01369532260c0)
1 /*
2  * Copyright 2006-2007, 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 : public 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		rx_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 };
54 
55 
56 status_t init_interfaces();
57 status_t uninit_interfaces();
58 
59 // interfaces
60 struct net_interface_private *find_interface(struct net_domain *domain,
61 	const char *name);
62 struct net_interface_private *find_interface(struct net_domain *domain,
63 	uint32 index);
64 void put_interface(struct net_interface_private *interface);
65 struct net_interface_private *get_interface(net_domain *domain,
66 	const char *name);
67 status_t create_interface(net_domain *domain, const char *name,
68 	const char *baseName, net_device_interface *deviceInterface,
69 	struct net_interface_private **_interface);
70 void delete_interface(net_interface_private *interface);
71 void interface_set_down(net_interface *);
72 
73 // device interfaces
74 void get_device_interface_address(net_device_interface *interface,
75 	sockaddr *address);
76 uint32 count_device_interfaces();
77 status_t list_device_interfaces(void *buffer, size_t *_bufferSize);
78 void put_device_interface(struct net_device_interface *interface);
79 struct net_device_interface *get_device_interface(uint32 index);
80 struct net_device_interface *get_device_interface(const char *name,
81 	bool create = true);
82 void down_device_interface(net_device_interface *interface);
83 
84 // devices
85 status_t unregister_device_deframer(net_device *device);
86 status_t register_device_deframer(net_device *device, net_deframe_func deframeFunc);
87 status_t register_domain_device_handler(struct net_device *device, int32 type,
88 	struct net_domain *domain);
89 status_t register_device_handler(struct net_device *device, int32 type,
90 	net_receive_func receiveFunc, void *cookie);
91 status_t unregister_device_handler(struct net_device *device, int32 type);
92 status_t register_device_monitor(struct net_device *device,
93 	struct net_device_monitor *monitor);
94 status_t unregister_device_monitor(struct net_device *device,
95 	struct net_device_monitor *monitor);
96 status_t device_link_changed(net_device *device);
97 status_t device_removed(net_device *device);
98 status_t device_enqueue_buffer(net_device *device, net_buffer *buffer);
99 
100 #endif	// INTERFACES_H
101