1 /* 2 * Copyright (c) 2014 Intel Corporation. All rights reserved. 3 * Copyright (c) 2014 Chelsio, Inc. All rights reserved. 4 * 5 * This software is available to you under a choice of one of two 6 * licenses. You may choose to be licensed under the terms of the GNU 7 * General Public License (GPL) Version 2, available from the file 8 * COPYING in the main directory of this source tree, or the 9 * OpenIB.org BSD license below: 10 * 11 * Redistribution and use in source and binary forms, with or 12 * without modification, are permitted provided that the following 13 * conditions are met: 14 * 15 * - Redistributions of source code must retain the above 16 * copyright notice, this list of conditions and the following 17 * disclaimer. 18 * 19 * - Redistributions in binary form must reproduce the above 20 * copyright notice, this list of conditions and the following 21 * disclaimer in the documentation and/or other materials 22 * provided with the distribution. 23 * 24 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 25 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 26 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 27 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 28 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 29 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 30 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 31 * SOFTWARE. 32 */ 33 #ifndef _IW_PORTMAP_H 34 #define _IW_PORTMAP_H 35 36 #define IWPM_ULIBNAME_SIZE 32 37 #define IWPM_DEVNAME_SIZE 32 38 #define IWPM_IFNAME_SIZE 16 39 #define IWPM_IPADDR_SIZE 16 40 41 enum { 42 IWPM_INVALID_NLMSG_ERR = 10, 43 IWPM_CREATE_MAPPING_ERR, 44 IWPM_DUPLICATE_MAPPING_ERR, 45 IWPM_UNKNOWN_MAPPING_ERR, 46 IWPM_CLIENT_DEV_INFO_ERR, 47 IWPM_USER_LIB_INFO_ERR, 48 IWPM_REMOTE_QUERY_REJECT 49 }; 50 51 struct iwpm_dev_data { 52 char dev_name[IWPM_DEVNAME_SIZE]; 53 char if_name[IWPM_IFNAME_SIZE]; 54 }; 55 56 struct iwpm_sa_data { 57 struct sockaddr_storage loc_addr; 58 struct sockaddr_storage mapped_loc_addr; 59 struct sockaddr_storage rem_addr; 60 struct sockaddr_storage mapped_rem_addr; 61 u32 flags; 62 }; 63 64 /** 65 * iwpm_init - Allocate resources for the iwarp port mapper 66 * 67 * Should be called when network interface goes up. 68 */ 69 int iwpm_init(u8); 70 71 /** 72 * iwpm_exit - Deallocate resources for the iwarp port mapper 73 * 74 * Should be called when network interface goes down. 75 */ 76 int iwpm_exit(u8); 77 78 /** 79 * iwpm_valid_pid - Check if the userspace iwarp port mapper pid is valid 80 * 81 * Returns true if the pid is greater than zero, otherwise returns false 82 */ 83 int iwpm_valid_pid(void); 84 85 /** 86 * iwpm_register_pid - Send a netlink query to userspace 87 * to get the iwarp port mapper pid 88 * @pm_msg: Contains driver info to send to the userspace port mapper 89 * @nl_client: The index of the netlink client 90 */ 91 int iwpm_register_pid(struct iwpm_dev_data *pm_msg, u8 nl_client); 92 93 /** 94 * iwpm_add_mapping - Send a netlink add mapping request to 95 * the userspace port mapper 96 * @pm_msg: Contains the local ip/tcp address info to send 97 * @nl_client: The index of the netlink client 98 * 99 * If the request is successful, the pm_msg stores 100 * the port mapper response (mapped address info) 101 */ 102 int iwpm_add_mapping(struct iwpm_sa_data *pm_msg, u8 nl_client); 103 104 /** 105 * iwpm_add_and_query_mapping - Send a netlink add and query mapping request 106 * to the userspace port mapper 107 * @pm_msg: Contains the local and remote ip/tcp address info to send 108 * @nl_client: The index of the netlink client 109 * 110 * If the request is successful, the pm_msg stores the 111 * port mapper response (mapped local and remote address info) 112 */ 113 int iwpm_add_and_query_mapping(struct iwpm_sa_data *pm_msg, u8 nl_client); 114 115 /** 116 * iwpm_remove_mapping - Send a netlink remove mapping request 117 * to the userspace port mapper 118 * 119 * @local_addr: Local ip/tcp address to remove 120 * @nl_client: The index of the netlink client 121 */ 122 int iwpm_remove_mapping(struct sockaddr_storage *local_addr, u8 nl_client); 123 124 /** 125 * iwpm_register_pid_cb - Process the port mapper response to 126 * iwpm_register_pid query 127 * @skb: 128 * @cb: Contains the received message (payload and netlink header) 129 * 130 * If successful, the function receives the userspace port mapper pid 131 * which is used in future communication with the port mapper 132 */ 133 int iwpm_register_pid_cb(struct sk_buff *, struct netlink_callback *); 134 135 /** 136 * iwpm_add_mapping_cb - Process the port mapper response to 137 * iwpm_add_mapping request 138 * @skb: 139 * @cb: Contains the received message (payload and netlink header) 140 */ 141 int iwpm_add_mapping_cb(struct sk_buff *, struct netlink_callback *); 142 143 /** 144 * iwpm_add_and_query_mapping_cb - Process the port mapper response to 145 * iwpm_add_and_query_mapping request 146 * @skb: 147 * @cb: Contains the received message (payload and netlink header) 148 */ 149 int iwpm_add_and_query_mapping_cb(struct sk_buff *, struct netlink_callback *); 150 151 /** 152 * iwpm_remote_info_cb - Process remote connecting peer address info, which 153 * the port mapper has received from the connecting peer 154 * 155 * @cb: Contains the received message (payload and netlink header) 156 * 157 * Stores the IPv4/IPv6 address info in a hash table 158 */ 159 int iwpm_remote_info_cb(struct sk_buff *, struct netlink_callback *); 160 161 /** 162 * iwpm_mapping_error_cb - Process port mapper notification for error 163 * 164 * @skb: 165 * @cb: Contains the received message (payload and netlink header) 166 */ 167 int iwpm_mapping_error_cb(struct sk_buff *, struct netlink_callback *); 168 169 /** 170 * iwpm_mapping_info_cb - Process a notification that the userspace 171 * port mapper daemon is started 172 * @skb: 173 * @cb: Contains the received message (payload and netlink header) 174 * 175 * Using the received port mapper pid, send all the local mapping 176 * info records to the userspace port mapper 177 */ 178 int iwpm_mapping_info_cb(struct sk_buff *, struct netlink_callback *); 179 180 /** 181 * iwpm_ack_mapping_info_cb - Process the port mapper ack for 182 * the provided local mapping info records 183 * @skb: 184 * @cb: Contains the received message (payload and netlink header) 185 */ 186 int iwpm_ack_mapping_info_cb(struct sk_buff *, struct netlink_callback *); 187 188 /** 189 * iwpm_get_remote_info - Get the remote connecting peer address info 190 * 191 * @mapped_loc_addr: Mapped local address of the listening peer 192 * @mapped_rem_addr: Mapped remote address of the connecting peer 193 * @remote_addr: To store the remote address of the connecting peer 194 * @nl_client: The index of the netlink client 195 * 196 * The remote address info is retrieved and provided to the client in 197 * the remote_addr. After that it is removed from the hash table 198 */ 199 int iwpm_get_remote_info(struct sockaddr_storage *mapped_loc_addr, 200 struct sockaddr_storage *mapped_rem_addr, 201 struct sockaddr_storage *remote_addr, u8 nl_client); 202 203 /** 204 * iwpm_create_mapinfo - Store local and mapped IPv4/IPv6 address 205 * info in a hash table 206 * @local_addr: Local ip/tcp address 207 * @mapped_addr: Mapped local ip/tcp address 208 * @nl_client: The index of the netlink client 209 * @map_flags: IWPM mapping flags 210 */ 211 int iwpm_create_mapinfo(struct sockaddr_storage *local_addr, 212 struct sockaddr_storage *mapped_addr, u8 nl_client, 213 u32 map_flags); 214 215 /** 216 * iwpm_remove_mapinfo - Remove local and mapped IPv4/IPv6 address 217 * info from the hash table 218 * @local_addr: Local ip/tcp address 219 * @mapped_addr: Mapped local ip/tcp address 220 * 221 * Returns err code if mapping info is not found in the hash table, 222 * otherwise returns 0 223 */ 224 int iwpm_remove_mapinfo(struct sockaddr_storage *local_addr, 225 struct sockaddr_storage *mapped_addr); 226 227 /** 228 * iwpm_hello_cb - Process a hello message from iwpmd 229 * 230 * @skb: 231 * @cb: Contains the received message (payload and netlink header) 232 * 233 * Using the received port mapper pid, send the kernel's abi_version 234 * after adjusting it to support the iwpmd version. 235 */ 236 int iwpm_hello_cb(struct sk_buff *skb, struct netlink_callback *cb); 237 #endif /* _IW_PORTMAP_H */ 238