1 /* 2 * Copyright 2006-2008, Haiku, Inc. All Rights Reserved. 3 * Distributed under the terms of the MIT License. 4 */ 5 #ifndef NET_DATALINK_H 6 #define NET_DATALINK_H 7 8 9 #include <net_buffer.h> 10 #include <net_routing_info.h> 11 12 #include <util/list.h> 13 14 #include <net/if.h> 15 16 17 #define NET_DATALINK_MODULE_NAME "network/stack/datalink/v1" 18 19 typedef struct net_datalink_protocol net_datalink_protocol; 20 21 typedef struct net_domain { 22 const char *name; 23 int family; 24 struct list interfaces; 25 26 struct net_protocol_module_info *module; 27 struct net_address_module_info *address_module; 28 } net_domain; 29 30 struct net_interface { 31 struct list_link link; 32 struct net_domain *domain; 33 struct net_device *device; 34 struct net_datalink_protocol *first_protocol; 35 struct net_datalink_protocol_module_info *first_info; 36 37 char name[IF_NAMESIZE]; 38 struct sockaddr *address; 39 struct sockaddr *destination; 40 struct sockaddr *mask; 41 uint32 index; 42 uint32 flags; 43 uint8 type; 44 uint32 mtu; 45 uint32 metric; 46 }; 47 48 struct net_route { 49 struct sockaddr *destination; 50 struct sockaddr *mask; 51 struct sockaddr *gateway; 52 uint32 flags; 53 uint32 mtu; 54 struct net_interface *interface; 55 }; 56 57 struct net_route_info { 58 struct list_link link; 59 struct net_route *route; 60 struct sockaddr address; 61 }; 62 63 struct net_datalink_module_info { 64 module_info info; 65 66 status_t (*control)(struct net_domain *domain, int32 option, void *value, 67 size_t *_length); 68 status_t (*send_data)(struct net_route *route, struct net_buffer *buffer); 69 status_t (*send_datagram)(struct net_protocol *protocol, 70 struct net_domain *domain, struct net_buffer *buffer); 71 72 bool (*is_local_address)(struct net_domain *domain, 73 const struct sockaddr *address, net_interface **_interface, 74 uint32 *_matchedType); 75 bool (*is_local_link_address)(struct net_domain *domain, bool unconfigured, 76 const struct sockaddr *address, net_interface **_interface); 77 78 net_interface *(*get_interface)(struct net_domain *domain, uint32 index); 79 net_interface *(*get_interface_with_address)(struct net_domain *domain, 80 const struct sockaddr *address); 81 82 // routes 83 status_t (*add_route)(struct net_domain *domain, 84 const struct net_route *route); 85 status_t (*remove_route)(struct net_domain *domain, 86 const struct net_route *route); 87 struct net_route *(*get_route)(struct net_domain *domain, 88 const struct sockaddr *address); 89 status_t (*get_buffer_route)(struct net_domain *domain, 90 struct net_buffer *buffer, struct net_route **_route); 91 void (*put_route)(struct net_domain *domain, struct net_route *route); 92 93 status_t (*register_route_info)(struct net_domain *domain, 94 struct net_route_info *info); 95 status_t (*unregister_route_info)(struct net_domain *domain, 96 struct net_route_info *info); 97 status_t (*update_route_info)(struct net_domain *domain, 98 struct net_route_info *info); 99 }; 100 101 struct net_address_module_info { 102 module_info info; 103 104 status_t (*copy_address)(const sockaddr *from, sockaddr **to, 105 bool replaceWithZeros, const sockaddr *mask); 106 107 status_t (*mask_address)(const sockaddr *address, const sockaddr *mask, 108 sockaddr *result); 109 110 bool (*equal_addresses)(const sockaddr *a, const sockaddr *b); 111 bool (*equal_ports)(const sockaddr *a, const sockaddr *b); 112 bool (*equal_addresses_and_ports)(const sockaddr *a, const sockaddr *b); 113 bool (*equal_masked_addresses)(const sockaddr *a, const sockaddr *b, 114 const sockaddr *mask); 115 bool (*is_empty_address)(const sockaddr *address, bool checkPort); 116 117 int32 (*first_mask_bit)(const sockaddr *mask); 118 119 bool (*check_mask)(const sockaddr *address); 120 121 status_t (*print_address)(const sockaddr *address, char **buffer, 122 bool printPort); 123 status_t (*print_address_buffer)(const sockaddr *address, char *buffer, 124 size_t bufferSize, bool printPort); 125 126 uint16 (*get_port)(const sockaddr *address); 127 status_t (*set_port)(sockaddr *address, uint16 port); 128 129 status_t (*set_to)(sockaddr *address, const sockaddr *from); 130 status_t (*set_to_empty_address)(sockaddr *address); 131 status_t (*set_to_defaults)(sockaddr *defaultMask, 132 sockaddr *defaultBroadcast, sockaddr *address, 133 sockaddr *netmask); 134 135 status_t (*update_to)(sockaddr *address, const sockaddr *from); 136 137 uint32 (*hash_address_pair)(const sockaddr *ourAddress, 138 const sockaddr *peerAddress); 139 140 status_t (*checksum_address)(struct Checksum *checksum, 141 const sockaddr *address); 142 143 bool (*matches_broadcast_address)(const sockaddr *address, 144 const sockaddr *mask, const sockaddr *broadcastAddr); 145 }; 146 147 #endif // NET_DATALINK_H 148