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