2006-06-18 07:37:28 +04:00
/*
* Copyright ( c ) 2005 Voltaire Inc . All rights reserved .
* Copyright ( c ) 2005 Intel Corporation . All rights reserved .
*
2008-07-15 10:48:43 +04:00
* This software is available to you under a choice of one of two
* licenses . You may choose to be licensed under the terms of the GNU
* General Public License ( GPL ) Version 2 , available from the file
* COPYING in the main directory of this source tree , or the
* OpenIB . org BSD license below :
*
* Redistribution and use in source and binary forms , with or
* without modification , are permitted provided that the following
* conditions are met :
*
* - Redistributions of source code must retain the above
* copyright notice , this list of conditions and the following
* disclaimer .
*
* - Redistributions in binary form must reproduce the above
* copyright notice , this list of conditions and the following
* disclaimer in the documentation and / or other materials
* provided with the distribution .
*
* THE SOFTWARE IS PROVIDED " AS IS " , WITHOUT WARRANTY OF ANY KIND ,
* EXPRESS OR IMPLIED , INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY , FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT . IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
* BE LIABLE FOR ANY CLAIM , DAMAGES OR OTHER LIABILITY , WHETHER IN AN
* ACTION OF CONTRACT , TORT OR OTHERWISE , ARISING FROM , OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE .
2006-06-18 07:37:28 +04:00
*/
# if !defined(IB_ADDR_H)
# define IB_ADDR_H
# include <linux/in.h>
# include <linux/in6.h>
# include <linux/netdevice.h>
# include <linux/socket.h>
# include <rdma/ib_verbs.h>
2006-10-31 22:12:59 +03:00
struct rdma_addr_client {
atomic_t refcount ;
struct completion comp ;
} ;
/**
* rdma_addr_register_client - Register an address client .
*/
void rdma_addr_register_client ( struct rdma_addr_client * client ) ;
/**
* rdma_addr_unregister_client - Deregister an address client .
* @ client : Client object to deregister .
*/
void rdma_addr_unregister_client ( struct rdma_addr_client * client ) ;
2006-06-18 07:37:28 +04:00
struct rdma_dev_addr {
unsigned char src_dev_addr [ MAX_ADDR_LEN ] ;
unsigned char dst_dev_addr [ MAX_ADDR_LEN ] ;
unsigned char broadcast [ MAX_ADDR_LEN ] ;
2006-08-04 01:02:42 +04:00
enum rdma_node_type dev_type ;
2008-07-15 10:48:53 +04:00
struct net_device * src_dev ;
2006-06-18 07:37:28 +04:00
} ;
/**
* rdma_translate_ip - Translate a local IP address to an RDMA hardware
* address .
*/
int rdma_translate_ip ( struct sockaddr * addr , struct rdma_dev_addr * dev_addr ) ;
/**
* rdma_resolve_ip - Resolve source and destination IP addresses to
* RDMA hardware addresses .
2006-10-31 22:12:59 +03:00
* @ client : Address client associated with request .
2006-06-18 07:37:28 +04:00
* @ src_addr : An optional source address to use in the resolution . If a
* source address is not provided , a usable address will be returned via
* the callback .
* @ dst_addr : The destination address to resolve .
* @ addr : A reference to a data location that will receive the resolved
* addresses . The data location must remain valid until the callback has
* been invoked .
* @ timeout_ms : Amount of time to wait for the address resolution to complete .
* @ callback : Call invoked once address resolution has completed , timed out ,
* or been canceled . A status of 0 indicates success .
* @ context : User - specified context associated with the call .
*/
2006-10-31 22:12:59 +03:00
int rdma_resolve_ip ( struct rdma_addr_client * client ,
struct sockaddr * src_addr , struct sockaddr * dst_addr ,
2006-06-18 07:37:28 +04:00
struct rdma_dev_addr * addr , int timeout_ms ,
void ( * callback ) ( int status , struct sockaddr * src_addr ,
struct rdma_dev_addr * addr , void * context ) ,
void * context ) ;
void rdma_addr_cancel ( struct rdma_dev_addr * addr ) ;
2006-08-04 01:02:42 +04:00
int rdma_copy_addr ( struct rdma_dev_addr * dev_addr , struct net_device * dev ,
const unsigned char * dst_dev_addr ) ;
2006-06-18 07:37:28 +04:00
static inline int ip_addr_size ( struct sockaddr * addr )
{
return addr - > sa_family = = AF_INET6 ?
sizeof ( struct sockaddr_in6 ) : sizeof ( struct sockaddr_in ) ;
}
static inline u16 ib_addr_get_pkey ( struct rdma_dev_addr * dev_addr )
{
return ( ( u16 ) dev_addr - > broadcast [ 8 ] < < 8 ) | ( u16 ) dev_addr - > broadcast [ 9 ] ;
}
static inline void ib_addr_set_pkey ( struct rdma_dev_addr * dev_addr , u16 pkey )
{
dev_addr - > broadcast [ 8 ] = pkey > > 8 ;
dev_addr - > broadcast [ 9 ] = ( unsigned char ) pkey ;
}
2007-02-16 04:00:17 +03:00
static inline void ib_addr_get_mgid ( struct rdma_dev_addr * dev_addr ,
union ib_gid * gid )
{
memcpy ( gid , dev_addr - > broadcast + 4 , sizeof * gid ) ;
}
2006-07-14 11:23:52 +04:00
static inline void ib_addr_get_sgid ( struct rdma_dev_addr * dev_addr ,
union ib_gid * gid )
2006-06-18 07:37:28 +04:00
{
2006-07-14 11:23:52 +04:00
memcpy ( gid , dev_addr - > src_dev_addr + 4 , sizeof * gid ) ;
2006-06-18 07:37:28 +04:00
}
static inline void ib_addr_set_sgid ( struct rdma_dev_addr * dev_addr ,
union ib_gid * gid )
{
memcpy ( dev_addr - > src_dev_addr + 4 , gid , sizeof * gid ) ;
}
2006-07-14 11:23:52 +04:00
static inline void ib_addr_get_dgid ( struct rdma_dev_addr * dev_addr ,
union ib_gid * gid )
2006-06-18 07:37:28 +04:00
{
2006-07-14 11:23:52 +04:00
memcpy ( gid , dev_addr - > dst_dev_addr + 4 , sizeof * gid ) ;
2006-06-18 07:37:28 +04:00
}
static inline void ib_addr_set_dgid ( struct rdma_dev_addr * dev_addr ,
union ib_gid * gid )
{
memcpy ( dev_addr - > dst_dev_addr + 4 , gid , sizeof * gid ) ;
}
2006-08-04 01:02:42 +04:00
static inline void iw_addr_get_sgid ( struct rdma_dev_addr * dev_addr ,
union ib_gid * gid )
{
memcpy ( gid , dev_addr - > src_dev_addr , sizeof * gid ) ;
}
static inline void iw_addr_get_dgid ( struct rdma_dev_addr * dev_addr ,
union ib_gid * gid )
{
memcpy ( gid , dev_addr - > dst_dev_addr , sizeof * gid ) ;
}
2006-06-18 07:37:28 +04:00
# endif /* IB_ADDR_H */