1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* 3 * Copyright (c) 2015 National Instruments 4 * 5 * (C) Copyright 2015 6 * Joe Hershberger <joe.hershberger@ni.com> 7 */ 8 9 #ifndef __ETH_RAW_OS_H 10 #define __ETH_RAW_OS_H 11 12 #define IFNAMSIZ 16 13 14 /** 15 * struct eth_sandbox_raw_priv - raw socket session 16 * 17 * sd: socket descriptor - the open socket during a session 18 * host_ifname: interface name on the host to use for sending our packets 19 * host_ifindex: interface index number on the host 20 * device: struct sockaddr_ll - the host interface packets move to/from 21 * local: 1 or 0 to select the local interface ('lo') or not 22 * local_bindsd: socket descriptor to prevent the kernel from sending 23 * a message to the server claiming the port is 24 * unreachable 25 * local_bind_udp_port: The UDP port number that we bound to 26 */ 27 struct eth_sandbox_raw_priv { 28 int sd; 29 char host_ifname[IFNAMSIZ]; 30 unsigned int host_ifindex; 31 void *device; 32 int local; 33 int local_bind_sd; 34 unsigned short local_bind_udp_port; 35 }; 36 37 /* A struct to mimic if_nameindex but that does not depend on Linux headers */ 38 struct sandbox_eth_raw_if_nameindex { 39 unsigned int if_index; /* Index of interface (1, 2, ...) */ 40 char *if_name; /* Null-terminated name ("eth0", etc.) */ 41 }; 42 43 /* Enumerate host network interfaces */ 44 struct sandbox_eth_raw_if_nameindex *sandbox_eth_raw_if_nameindex(void); 45 /* Free the data structure of enumerated network interfaces */ 46 void sandbox_eth_raw_if_freenameindex(struct sandbox_eth_raw_if_nameindex *ptr); 47 48 /* 49 * Check if the interface named "ifname" is a localhost interface or not. 50 * ifname - the interface name on the host to check 51 * 52 * returns - 0 if real interface, 1 if local, negative if error 53 */ 54 int sandbox_eth_raw_os_is_local(const char *ifname); 55 56 /* 57 * Look up the name of the interface based on the ifindex populated in priv. 58 * 59 * Overwrite the host_ifname member in priv based on looking up host_ifindex 60 * 61 * returns - 0 if success, negative if error 62 */ 63 int sandbox_eth_raw_os_idx_to_name(struct eth_sandbox_raw_priv *priv); 64 65 int sandbox_eth_raw_os_start(struct eth_sandbox_raw_priv *priv, 66 unsigned char *ethmac); 67 int sandbox_eth_raw_os_send(void *packet, int length, 68 struct eth_sandbox_raw_priv *priv); 69 int sandbox_eth_raw_os_recv(void *packet, int *length, 70 const struct eth_sandbox_raw_priv *priv); 71 void sandbox_eth_raw_os_stop(struct eth_sandbox_raw_priv *priv); 72 73 #endif /* __ETH_RAW_OS_H */ 74