1/*- 2 * Copyright (c) 2015 Dmitry Chagin 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 * 26 * $FreeBSD$ 27 */ 28 29#ifndef _LINUX_MI_H_ 30#define _LINUX_MI_H_ 31 32#include <sys/queue.h> 33 34#define LINUX_IFHWADDRLEN 6 35#define LINUX_IFNAMSIZ 16 36 37/* 38 * Criteria for interface name translation 39 */ 40#define IFP_IS_ETH(ifp) (ifp->if_type == IFT_ETHER) 41#define IFP_IS_LOOP(ifp) (ifp->if_type == IFT_LOOP) 42 43struct l_sockaddr { 44 unsigned short sa_family; 45 char sa_data[14]; 46}; 47 48#define LINUX_ARPHRD_ETHER 1 49#define LINUX_ARPHRD_LOOPBACK 772 50 51/* 52 * Supported address families 53 */ 54#define LINUX_AF_UNSPEC 0 55#define LINUX_AF_UNIX 1 56#define LINUX_AF_INET 2 57#define LINUX_AF_AX25 3 58#define LINUX_AF_IPX 4 59#define LINUX_AF_APPLETALK 5 60#define LINUX_AF_INET6 10 61#define LINUX_AF_NETLINK 16 62 63#define LINUX_NETLINK_ROUTE 0 64#define LINUX_NETLINK_SOCK_DIAG 4 65#define LINUX_NETLINK_NFLOG 5 66#define LINUX_NETLINK_SELINUX 7 67#define LINUX_NETLINK_AUDIT 9 68#define LINUX_NETLINK_FIB_LOOKUP 10 69#define LINUX_NETLINK_NETFILTER 12 70#define LINUX_NETLINK_KOBJECT_UEVENT 15 71 72/* 73 * net device flags 74 */ 75#define LINUX_IFF_UP 0x0001 76#define LINUX_IFF_BROADCAST 0x0002 77#define LINUX_IFF_DEBUG 0x0004 78#define LINUX_IFF_LOOPBACK 0x0008 79#define LINUX_IFF_POINTOPOINT 0x0010 80#define LINUX_IFF_NOTRAILERS 0x0020 81#define LINUX_IFF_RUNNING 0x0040 82#define LINUX_IFF_NOARP 0x0080 83#define LINUX_IFF_PROMISC 0x0100 84#define LINUX_IFF_ALLMULTI 0x0200 85#define LINUX_IFF_MASTER 0x0400 86#define LINUX_IFF_SLAVE 0x0800 87#define LINUX_IFF_MULTICAST 0x1000 88#define LINUX_IFF_PORTSEL 0x2000 89#define LINUX_IFF_AUTOMEDIA 0x4000 90#define LINUX_IFF_DYNAMIC 0x8000 91 92/* sigaltstack */ 93#define LINUX_SS_ONSTACK 1 94#define LINUX_SS_DISABLE 2 95 96int linux_to_bsd_sigaltstack(int lsa); 97int bsd_to_linux_sigaltstack(int bsa); 98 99/* sigset */ 100typedef struct { 101 uint64_t __mask; 102} l_sigset_t; 103 104/* primitives to manipulate sigset_t */ 105#define LINUX_SIGEMPTYSET(set) (set).__mask = 0 106#define LINUX_SIGISMEMBER(set, sig) (1UL & ((set).__mask >> _SIG_IDX(sig))) 107#define LINUX_SIGADDSET(set, sig) (set).__mask |= 1UL << _SIG_IDX(sig) 108 109void linux_to_bsd_sigset(l_sigset_t *, sigset_t *); 110void bsd_to_linux_sigset(sigset_t *, l_sigset_t *); 111 112/* signaling */ 113#define LINUX_SIGHUP 1 114#define LINUX_SIGINT 2 115#define LINUX_SIGQUIT 3 116#define LINUX_SIGILL 4 117#define LINUX_SIGTRAP 5 118#define LINUX_SIGABRT 6 119#define LINUX_SIGIOT LINUX_SIGABRT 120#define LINUX_SIGBUS 7 121#define LINUX_SIGFPE 8 122#define LINUX_SIGKILL 9 123#define LINUX_SIGUSR1 10 124#define LINUX_SIGSEGV 11 125#define LINUX_SIGUSR2 12 126#define LINUX_SIGPIPE 13 127#define LINUX_SIGALRM 14 128#define LINUX_SIGTERM 15 129#define LINUX_SIGSTKFLT 16 130#define LINUX_SIGCHLD 17 131#define LINUX_SIGCONT 18 132#define LINUX_SIGSTOP 19 133#define LINUX_SIGTSTP 20 134#define LINUX_SIGTTIN 21 135#define LINUX_SIGTTOU 22 136#define LINUX_SIGURG 23 137#define LINUX_SIGXCPU 24 138#define LINUX_SIGXFSZ 25 139#define LINUX_SIGVTALRM 26 140#define LINUX_SIGPROF 27 141#define LINUX_SIGWINCH 28 142#define LINUX_SIGIO 29 143#define LINUX_SIGPOLL LINUX_SIGIO 144#define LINUX_SIGPWR 30 145#define LINUX_SIGSYS 31 146#define LINUX_SIGTBLSZ 31 147#define LINUX_SIGRTMIN 32 148#define LINUX_SIGRTMAX 64 149 150#define LINUX_SIG_VALID(sig) ((sig) <= LINUX_SIGRTMAX && (sig) > 0) 151 152int linux_to_bsd_signal(int sig); 153int bsd_to_linux_signal(int sig); 154 155extern LIST_HEAD(futex_list, futex) futex_list; 156extern struct mtx futex_mtx; 157 158void linux_dev_shm_create(void); 159void linux_dev_shm_destroy(void); 160 161/* 162 * mask=0 is not sensible for this application, so it will be taken to mean 163 * a mask equivalent to the value. Otherwise, (word & mask) == value maps to 164 * (word & ~mask) | value in a bitfield for the platform we're converting to. 165 */ 166struct bsd_to_linux_bitmap { 167 int bsd_mask; 168 int bsd_value; 169 int linux_mask; 170 int linux_value; 171}; 172 173int bsd_to_linux_bits_(int value, struct bsd_to_linux_bitmap *bitmap, 174 size_t mapcnt, int no_value); 175int linux_to_bsd_bits_(int value, struct bsd_to_linux_bitmap *bitmap, 176 size_t mapcnt, int no_value); 177 178/* 179 * These functions are used for simplification of BSD <-> Linux bit conversions. 180 * Given `value`, a bit field, these functions will walk the given bitmap table 181 * and set the appropriate bits for the target platform. If any bits were 182 * successfully converted, then the return value is the equivalent of value 183 * represented with the bit values appropriate for the target platform. 184 * Otherwise, the value supplied as `no_value` is returned. 185 */ 186#define bsd_to_linux_bits(_val, _bmap, _noval) \ 187 bsd_to_linux_bits_((_val), (_bmap), nitems((_bmap)), (_noval)) 188#define linux_to_bsd_bits(_val, _bmap, _noval) \ 189 linux_to_bsd_bits_((_val), (_bmap), nitems((_bmap)), (_noval)) 190 191/* 192 * Easy mapping helpers. BITMAP_EASY_LINUX represents a single bit to be 193 * translated, and the FreeBSD and Linux values are supplied. BITMAP_1t1_LINUX 194 * is the extreme version of this, where not only is it a single bit, but the 195 * name of the macro used to represent the Linux version of a bit literally has 196 * LINUX_ prepended to the normal name. 197 */ 198#define BITMAP_EASY_LINUX(_name, _linux_name) \ 199 { \ 200 .bsd_value = (_name), \ 201 .linux_value = (_linux_name), \ 202 } 203#define BITMAP_1t1_LINUX(_name) BITMAP_EASY_LINUX(_name, LINUX_##_name) 204 205int bsd_to_linux_errno(int error); 206void linux_check_errtbl(void); 207 208#endif /* _LINUX_MI_H_ */ 209