| /* |
| * Copyright (c) 2014 Intel Corporation. All rights reserved. |
| * |
| * This software is available to you under the OpenFabrics.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 AWV |
| * 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. |
| */ |
| |
| #if !defined(ACM_PROV_H) |
| #define ACM_PROV_H |
| |
| #include <infiniband/acm.h> |
| #include <infiniband/umad.h> |
| #include <infiniband/umad_sa.h> |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| #define ACM_PROV_VERSION 1 |
| |
| struct acm_device { |
| struct ibv_context *verbs; |
| __be64 dev_guid; |
| }; |
| |
| struct acm_port { |
| struct acm_device *dev; |
| uint8_t port_num; |
| }; |
| |
| struct acm_endpoint { |
| struct acm_port *port; |
| uint16_t pkey; |
| }; |
| |
| struct acm_address { |
| struct acm_endpoint *endpoint; |
| union acm_ep_info info; |
| char *id_string; |
| uint16_t type; |
| }; |
| |
| struct acm_provider { |
| size_t size; |
| uint32_t version; |
| const char *name; |
| int (*open_device)(const struct acm_device *device, |
| void **dev_context); |
| void (*close_device)(void *dev_context); |
| int (*open_port)(const struct acm_port *port, |
| void *dev_context, void **port_context); |
| void (*close_port)(void *port_context); |
| int (*open_endpoint)(const struct acm_endpoint *endpoint, |
| void *port_context, void **ep_context); |
| void (*close_endpoint)(void *ep_context); |
| int (*add_address)(const struct acm_address *addr, void *ep_context, |
| void **addr_context); |
| void (*remove_address)(void *addr_context); |
| int (*resolve)(void *addr_context, struct acm_msg *msg, uint64_t id); |
| int (*query)(void *addr_context, struct acm_msg *msg, uint64_t id); |
| int (*handle_event)(void *port_context, enum ibv_event_type type); |
| void (*query_perf)(void *ep_context, uint64_t *values, uint8_t *cnt); |
| }; |
| |
| int provider_query(struct acm_provider **info, uint32_t *version); |
| |
| /* Functions exported from core */ |
| #define acm_log(level, format, ...) \ |
| acm_write(level, "%s: "format, __func__, ## __VA_ARGS__) |
| extern void acm_write(int level, const char *format, ...) |
| __attribute__((format(printf, 2, 3))); |
| extern void acm_format_name(int level, char *name, size_t name_size, |
| uint8_t addr_type, const uint8_t *addr, size_t addr_size); |
| |
| extern int ib_any_gid(union ibv_gid *gid); |
| extern uint8_t acm_gid_index(struct acm_port *port, union ibv_gid *gid); |
| extern int acm_get_gid(struct acm_port *port, int index, union ibv_gid *gid); |
| extern __be64 acm_path_comp_mask(struct ibv_path_record *path); |
| |
| extern int acm_resolve_response(uint64_t id, struct acm_msg *msg); |
| extern int acm_query_response(uint64_t id, struct acm_msg *msg); |
| |
| extern enum ibv_rate acm_get_rate(uint8_t width, uint8_t speed); |
| extern enum ibv_mtu acm_convert_mtu(int mtu); |
| extern enum ibv_rate acm_convert_rate(int rate); |
| |
| struct acm_sa_mad { |
| void *context; |
| struct ib_user_mad umad; |
| struct umad_sa_packet sa_mad; /* must follow umad and be 64-bit aligned */ |
| }; |
| |
| extern struct acm_sa_mad * |
| acm_alloc_sa_mad(const struct acm_endpoint *endpoint, void *context, |
| void (*handler)(struct acm_sa_mad *)); |
| extern void acm_free_sa_mad(struct acm_sa_mad *mad); |
| extern int acm_send_sa_mad(struct acm_sa_mad *mad); |
| |
| extern const char *acm_get_opts_file(void); |
| extern void acm_increment_counter(int type); |
| |
| #ifdef __cplusplus |
| } |
| #endif |
| |
| #endif /* ACM_PROV_H */ |