summaryrefslogtreecommitdiffstats
path: root/src/drivers/net/mlx_ipoib/ipoib.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/drivers/net/mlx_ipoib/ipoib.h')
-rw-r--r--src/drivers/net/mlx_ipoib/ipoib.h297
1 files changed, 297 insertions, 0 deletions
diff --git a/src/drivers/net/mlx_ipoib/ipoib.h b/src/drivers/net/mlx_ipoib/ipoib.h
new file mode 100644
index 000000000..c51f8a50d
--- /dev/null
+++ b/src/drivers/net/mlx_ipoib/ipoib.h
@@ -0,0 +1,297 @@
+/*
+ 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 at
+ <http://www.fsf.org/copyleft/gpl.html>, or the OpenIB.org BSD
+ license, available in the LICENSE.TXT file accompanying this
+ software. These details are also available at
+ <http://openib.org/license.html>.
+
+ 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.
+
+ Copyright (c) 2004 Mellanox Technologies Ltd. All rights reserved.
+*/
+
+#ifndef __ipoib_h__
+#define __ipoib_h__
+
+#define ARP_PROT_TYPE 0x806
+#define IPV4_PROT_TYPE 0x800
+
+#define IPOIB_HW_TYPE 0x20
+#define ETH_HW_TYPE 1
+
+#define ARP_OP_REQUESET 1
+#define ARP_OP_REPLY 2
+
+#define MLX_ETH_3BYTE_PREFIX 0x2c9 /* 00,02,c9 */
+#define MLX_ETH_BYTE0 0
+#define MLX_ETH_BYTE1 2
+#define MLX_ETH_BYTE2 0xC9
+
+#define IP_PROT_UDP 17
+#define DHCP_TYPE_REQUEST 1
+#define DHCP_TYPE_RESPONSE 2
+#define DHCP_TYPE_ACK 5
+
+struct ipoib_mac_st {
+ __u32 qpn:24;
+ __u32 r0:8;
+ __u8 gid[16];
+} __attribute__ ((packed));
+
+struct arp_packet_st {
+ __u16 arp_prot_type;
+ __u16 hw_type;
+ __u16 opcode;
+ __u8 prot_size;
+ __u8 hw_len;
+ struct ipoib_mac_st sender_mac;
+ __u32 sender_ip;
+ struct ipoib_mac_st target_mac;
+ __u32 target_ip;
+} __attribute__ ((packed));
+
+/* this struct is used to translate between ipoib and
+ ethernet mac addresses */
+struct mac_xlation_st {
+ __u8 valid; /* 1=entry valid 0=entry free */
+ __u32 youth; /* youth of this entry the lowest the
+ number the older in age */
+ __u8 eth_mac_lsb[3]; /* three bytes Ethernet MAC
+ LS bytes are constants */
+ union ib_gid_u gid;
+ __u32 qpn;
+ ud_av_t av; /* address vector representing neighbour */
+};
+
+static inline __u16 get_prot_type(void *data)
+{
+ __u8 *ptr = data;
+
+ return be16_to_cpu(*((__u16 *) ptr));
+}
+
+static inline __u8 get_hw_len(void *data)
+{
+ return ((__u8 *) data)[8];
+}
+
+static inline __u8 get_prot_size(void *data)
+{
+ return ((__u8 *) data)[9];
+}
+
+static inline __u16 get_opcode(const void *data)
+{
+ return be16_to_cpu(*((__u16 *) (&(((__u8 *) data)[10]))));
+}
+
+static inline __u32 get_sender_qpn(void *data)
+{
+ __u8 *ptr = data;
+
+ return (ptr[13] << 16) | (ptr[14] << 8) | ptr[15];
+}
+
+static inline const __u8 *get_sender_gid(void *data)
+{
+ return &(((__u8 *) data)[16]);
+}
+
+static inline void *arp_mac6_get_sender_ip(const void *data)
+{
+ return (__u8 *) data + 14;
+}
+
+static inline const void *arp_mac6_get_target_ip(const void *data)
+{
+ return data + 24;
+}
+
+static inline void arp_mac20_set_sender_ip(const void *ip, void *data)
+{
+ memcpy(((__u8 *) data) + 28, ip, 4);
+}
+
+static inline void arp_mac20_set_target_ip(const void *ip, void *data)
+{
+ memcpy(((__u8 *) data) + 52, ip, 4);
+}
+
+static inline void arp_mac20_set_sender_mac(const void *qpn, const void *gid,
+ void *data)
+{
+ memcpy(((__u8 *) data) + 9, qpn, 3);
+ memcpy(((__u8 *) data) + 12, gid, 16);
+}
+
+static inline void arp_mac20_set_target_mac(void *qpn, void *gid, void *data)
+{
+ memcpy(((__u8 *) data) + 33, qpn, 3);
+ memcpy(((__u8 *) data) + 36, gid, 16);
+}
+
+static inline const void *arp_mac6_get_opcode(const void *data)
+{
+ return data + 6;
+}
+
+static inline void arp_mac20_set_opcode(const void *opcode, void *data)
+{
+ memcpy(data + 6, opcode, 2);
+}
+
+static inline const void *arp_mac6_get_target_mac(const void *data)
+{
+ return data + 18;
+}
+
+static inline const void *arp_mac20_get_sender_qpn(void *data)
+{
+ return ((__u8 *) data) + 13;
+}
+
+static inline const void *arp_mac20_get_sender_gid(void *data)
+{
+ return ((__u8 *) data) + 16;
+}
+
+static inline const void *arp_mac20_get_target_qpn(void *data)
+{
+ return ((__u8 *) data) + 37;
+}
+
+static inline const void *arp_mac20_get_target_gid(void *data)
+{
+ return ((__u8 *) data) + 40;
+}
+
+static inline const void *get_lptr_by_off(const void *packet, __u16 offset)
+{
+ return packet + offset;
+}
+
+static inline __u8 get_ip_protocl_type(const void *packet)
+{
+ const void *ptr;
+ __u8 prot;
+
+ ptr = get_lptr_by_off(packet, 9);
+
+ memcpy(&prot, ptr, 1);
+ return prot;
+}
+
+static inline __u16 get_udp_dest_port(const void *packet)
+{
+ const void *ptr;
+ __u16 port;
+
+ ptr = get_lptr_by_off(packet, 22);
+
+ memcpy(&port, ptr, 2);
+ return port;
+}
+
+static inline __u8 get_dhcp_message_type(const void *packet)
+{
+ const void *ptr;
+ __u8 type;
+
+ ptr = get_lptr_by_off(packet, 28);
+
+ memcpy(&type, ptr, 1);
+ return type;
+}
+
+static inline void set_hw_type(__u8 * packet)
+{
+ packet[29] = IPOIB_HW_TYPE;
+}
+
+static inline void zero_hw_len(__u8 * packet)
+{
+ packet[30] = 0;
+}
+
+static inline void set_udp_csum(__u8 * packet, __u16 val)
+{
+ __u16 *csum_ptr;
+
+ csum_ptr = (__u16 *) (packet + 26);
+
+ *csum_ptr = htons(val);
+}
+
+static inline void zero_chaddr(__u8 * packet)
+{
+ memset(packet + 56, 0, 16);
+}
+
+static inline void set_bcast_flag(__u8 * packet)
+{
+ packet[38] = 0x80;
+}
+
+static inline __u8 get_ip_protocl(void *buf)
+{
+ return ((__u8 *) buf)[9];
+}
+
+static inline __u16 get_udp_dst_port(void *buf)
+{
+ return be16_to_cpu(*((__u16 *) (((__u8 *) buf) + 0x16)));
+}
+
+static inline __u8 get_dhcp_msg_type(void *buf)
+{
+ return ((__u8 *) buf)[0x1c];
+}
+
+static inline void set_eth_hwtype(void *buf)
+{
+ ((__u8 *) buf)[0x1d] = ETH_HW_TYPE;
+}
+
+static inline void set_eth_hwlen(void *buf)
+{
+ ((__u8 *) buf)[0x1e] = 6;
+}
+
+static inline void add_udp_len(void *buf, __u16 size_add)
+{
+ __u16 old_len, *len_ptr;
+
+ len_ptr = (__u16 *) (((__u8 *) buf) + 24);
+ old_len = ntohs(*len_ptr);
+ *len_ptr = htons(old_len + size_add);
+}
+
+static inline void set_own_mac(void *buf)
+{
+ ((__u8 *) buf)[0x38] = 0xff; //MLX_ETH_BYTE0;
+ ((__u8 *) buf)[0x39] = 0xff; //MLX_ETH_BYTE1;
+ ((__u8 *) buf)[0x3a] = 0xff; //MLX_ETH_BYTE2;
+ ((__u8 *) buf)[0x3b] = 0xff; //0;
+ ((__u8 *) buf)[0x3c] = 0xff; //0;
+ ((__u8 *) buf)[0x3d] = 0xff; //0;
+}
+
+static int ipoib_handle_rcv(void *buf, void **out_buf_p,
+ unsigned int *new_size_p, int *bcast_p);
+static int ipoib_send_packet(const __u8 * mac, __u16 protocol, const void *data,
+ unsigned int size);
+static int ipoib_init(struct pci_device *pci);
+static u8 *get_port_gid(void);
+static int ipoib_read_packet(__u16 * prot_p, void *data, unsigned int *size_p,
+ int *is_bcast_p);
+
+#endif /* __ipoib_h__ */