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