xref: /haiku/src/add-ons/kernel/network/stack/interfaces.h (revision c64fecca780b8dcf6ce2cb5994977a79e14ce936)
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 struct net_device_monitor : public DoublyLinkedListLinkImpl<net_device_monitor> {
25 	net_receive_func	func;
26 	void				*cookie;
27 };
28 
29 typedef DoublyLinkedList<net_device_handler> DeviceHandlerList;
30 typedef DoublyLinkedList<net_device_monitor> DeviceMonitorList;
31 
32 struct net_device_interface : DoublyLinkedListLinkImpl<net_device_interface> {
33 	//struct list_link	link;
34 	const char			*name;
35 	struct net_device_module_info *module;
36 	struct net_device	*device;
37 	thread_id			reader_thread;
38 	uint32				up_count;
39 		// a device can be brought up by more than one interface
40 	int32				ref_count;
41 
42 	net_deframe_func	deframe_func;
43 	int32				deframe_ref_count;
44 
45 	DeviceMonitorList	monitor_funcs;
46 	DeviceHandlerList	receive_funcs;
47 };
48 
49 typedef DoublyLinkedList<net_device_interface> DeviceInterfaceList;
50 
51 struct net_interface_private : net_interface {
52 	char				base_name[IF_NAMESIZE];
53 	net_device_interface *device_interface;
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 *);
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 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 	net_receive_func receiveFunc, void *cookie);
94 status_t unregister_device_monitor(struct net_device *device,
95 	net_receive_func receiveFunc, void *cookie);
96 status_t device_link_changed(net_device *device);
97 status_t device_removed(net_device *device);
98 
99 #endif	// INTERFACES_H
100