linux/include/rdma/ib.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */
   2/*
   3 * Copyright (c) 2010 Intel Corporation.  All rights reserved.
   4 */
   5
   6#ifndef _RDMA_IB_H
   7#define _RDMA_IB_H
   8
   9#include <linux/types.h>
  10#include <linux/sched.h>
  11#include <linux/cred.h>
  12#include <linux/uaccess.h>
  13#include <linux/fs.h>
  14
  15struct ib_addr {
  16        union {
  17                __u8            uib_addr8[16];
  18                __be16          uib_addr16[8];
  19                __be32          uib_addr32[4];
  20                __be64          uib_addr64[2];
  21        } ib_u;
  22#define sib_addr8               ib_u.uib_addr8
  23#define sib_addr16              ib_u.uib_addr16
  24#define sib_addr32              ib_u.uib_addr32
  25#define sib_addr64              ib_u.uib_addr64
  26#define sib_raw                 ib_u.uib_addr8
  27#define sib_subnet_prefix       ib_u.uib_addr64[0]
  28#define sib_interface_id        ib_u.uib_addr64[1]
  29};
  30
  31static inline bool ib_addr_any(const struct ib_addr *a)
  32{
  33        return ((a->sib_addr64[0] | a->sib_addr64[1]) == 0);
  34}
  35
  36static inline bool ib_addr_loopback(const struct ib_addr *a)
  37{
  38        return ((a->sib_addr32[0] | a->sib_addr32[1] |
  39                 a->sib_addr32[2] | (a->sib_addr32[3] ^ htonl(1))) == 0);
  40}
  41
  42static inline void ib_addr_set(struct ib_addr *addr,
  43                               __be32 w1, __be32 w2, __be32 w3, __be32 w4)
  44{
  45        addr->sib_addr32[0] = w1;
  46        addr->sib_addr32[1] = w2;
  47        addr->sib_addr32[2] = w3;
  48        addr->sib_addr32[3] = w4;
  49}
  50
  51static inline int ib_addr_cmp(const struct ib_addr *a1, const struct ib_addr *a2)
  52{
  53        return memcmp(a1, a2, sizeof(struct ib_addr));
  54}
  55
  56struct sockaddr_ib {
  57        unsigned short int      sib_family;     /* AF_IB */
  58        __be16                  sib_pkey;
  59        __be32                  sib_flowinfo;
  60        struct ib_addr          sib_addr;
  61        __be64                  sib_sid;
  62        __be64                  sib_sid_mask;
  63        __u64                   sib_scope_id;
  64};
  65
  66/*
  67 * The IB interfaces that use write() as bi-directional ioctl() are
  68 * fundamentally unsafe, since there are lots of ways to trigger "write()"
  69 * calls from various contexts with elevated privileges. That includes the
  70 * traditional suid executable error message writes, but also various kernel
  71 * interfaces that can write to file descriptors.
  72 *
  73 * This function provides protection for the legacy API by restricting the
  74 * calling context.
  75 */
  76static inline bool ib_safe_file_access(struct file *filp)
  77{
  78        return filp->f_cred == current_cred() && !uaccess_kernel();
  79}
  80
  81#endif /* _RDMA_IB_H */
  82