18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Copyright (c) 2010 Intel Corporation. All rights reserved. 48c2ecf20Sopenharmony_ci */ 58c2ecf20Sopenharmony_ci 68c2ecf20Sopenharmony_ci#ifndef _RDMA_IB_H 78c2ecf20Sopenharmony_ci#define _RDMA_IB_H 88c2ecf20Sopenharmony_ci 98c2ecf20Sopenharmony_ci#include <linux/types.h> 108c2ecf20Sopenharmony_ci#include <linux/sched.h> 118c2ecf20Sopenharmony_ci#include <linux/cred.h> 128c2ecf20Sopenharmony_ci#include <linux/uaccess.h> 138c2ecf20Sopenharmony_ci#include <linux/fs.h> 148c2ecf20Sopenharmony_ci 158c2ecf20Sopenharmony_cistruct ib_addr { 168c2ecf20Sopenharmony_ci union { 178c2ecf20Sopenharmony_ci __u8 uib_addr8[16]; 188c2ecf20Sopenharmony_ci __be16 uib_addr16[8]; 198c2ecf20Sopenharmony_ci __be32 uib_addr32[4]; 208c2ecf20Sopenharmony_ci __be64 uib_addr64[2]; 218c2ecf20Sopenharmony_ci } ib_u; 228c2ecf20Sopenharmony_ci#define sib_addr8 ib_u.uib_addr8 238c2ecf20Sopenharmony_ci#define sib_addr16 ib_u.uib_addr16 248c2ecf20Sopenharmony_ci#define sib_addr32 ib_u.uib_addr32 258c2ecf20Sopenharmony_ci#define sib_addr64 ib_u.uib_addr64 268c2ecf20Sopenharmony_ci#define sib_raw ib_u.uib_addr8 278c2ecf20Sopenharmony_ci#define sib_subnet_prefix ib_u.uib_addr64[0] 288c2ecf20Sopenharmony_ci#define sib_interface_id ib_u.uib_addr64[1] 298c2ecf20Sopenharmony_ci}; 308c2ecf20Sopenharmony_ci 318c2ecf20Sopenharmony_cistatic inline bool ib_addr_any(const struct ib_addr *a) 328c2ecf20Sopenharmony_ci{ 338c2ecf20Sopenharmony_ci return ((a->sib_addr64[0] | a->sib_addr64[1]) == 0); 348c2ecf20Sopenharmony_ci} 358c2ecf20Sopenharmony_ci 368c2ecf20Sopenharmony_cistatic inline bool ib_addr_loopback(const struct ib_addr *a) 378c2ecf20Sopenharmony_ci{ 388c2ecf20Sopenharmony_ci return ((a->sib_addr32[0] | a->sib_addr32[1] | 398c2ecf20Sopenharmony_ci a->sib_addr32[2] | (a->sib_addr32[3] ^ htonl(1))) == 0); 408c2ecf20Sopenharmony_ci} 418c2ecf20Sopenharmony_ci 428c2ecf20Sopenharmony_cistatic inline void ib_addr_set(struct ib_addr *addr, 438c2ecf20Sopenharmony_ci __be32 w1, __be32 w2, __be32 w3, __be32 w4) 448c2ecf20Sopenharmony_ci{ 458c2ecf20Sopenharmony_ci addr->sib_addr32[0] = w1; 468c2ecf20Sopenharmony_ci addr->sib_addr32[1] = w2; 478c2ecf20Sopenharmony_ci addr->sib_addr32[2] = w3; 488c2ecf20Sopenharmony_ci addr->sib_addr32[3] = w4; 498c2ecf20Sopenharmony_ci} 508c2ecf20Sopenharmony_ci 518c2ecf20Sopenharmony_cistatic inline int ib_addr_cmp(const struct ib_addr *a1, const struct ib_addr *a2) 528c2ecf20Sopenharmony_ci{ 538c2ecf20Sopenharmony_ci return memcmp(a1, a2, sizeof(struct ib_addr)); 548c2ecf20Sopenharmony_ci} 558c2ecf20Sopenharmony_ci 568c2ecf20Sopenharmony_cistruct sockaddr_ib { 578c2ecf20Sopenharmony_ci unsigned short int sib_family; /* AF_IB */ 588c2ecf20Sopenharmony_ci __be16 sib_pkey; 598c2ecf20Sopenharmony_ci __be32 sib_flowinfo; 608c2ecf20Sopenharmony_ci struct ib_addr sib_addr; 618c2ecf20Sopenharmony_ci __be64 sib_sid; 628c2ecf20Sopenharmony_ci __be64 sib_sid_mask; 638c2ecf20Sopenharmony_ci __u64 sib_scope_id; 648c2ecf20Sopenharmony_ci}; 658c2ecf20Sopenharmony_ci 668c2ecf20Sopenharmony_ci/* 678c2ecf20Sopenharmony_ci * The IB interfaces that use write() as bi-directional ioctl() are 688c2ecf20Sopenharmony_ci * fundamentally unsafe, since there are lots of ways to trigger "write()" 698c2ecf20Sopenharmony_ci * calls from various contexts with elevated privileges. That includes the 708c2ecf20Sopenharmony_ci * traditional suid executable error message writes, but also various kernel 718c2ecf20Sopenharmony_ci * interfaces that can write to file descriptors. 728c2ecf20Sopenharmony_ci * 738c2ecf20Sopenharmony_ci * This function provides protection for the legacy API by restricting the 748c2ecf20Sopenharmony_ci * calling context. 758c2ecf20Sopenharmony_ci */ 768c2ecf20Sopenharmony_cistatic inline bool ib_safe_file_access(struct file *filp) 778c2ecf20Sopenharmony_ci{ 788c2ecf20Sopenharmony_ci return filp->f_cred == current_cred() && !uaccess_kernel(); 798c2ecf20Sopenharmony_ci} 808c2ecf20Sopenharmony_ci 818c2ecf20Sopenharmony_ci#endif /* _RDMA_IB_H */ 82