Scurry-0.0.1: src/C/help.h
#ifndef __HELP_HASKELL_VPN__
#define __HELP_HASKELL_VPN__ __HELP_HASKELL_VPN__
#include <assert.h>
typedef uint32_t ip4_addr_t;
#define TAP_DESC_SIZE 32
/* A union that serves to be a common storage medium for
* whatever the OS wants to use as a device descriptor
* for the TAP device. In Linux, this is just a file
* descriptor. */
union tap_desc {
char pad[TAP_DESC_SIZE];
#if defined(MINGW32)
struct
{
HANDLE desc;
unsigned long context;
};
#elif defined(LINUX)
int desc;
#elif defined(BSD)
int desc;
#else
#error "ERROR: This platform not supported."
#endif
};
/* A struct used to pass information about
* a tap device around. */
struct tap_info {
union tap_desc * desc;
char mac[8]; /* Use 8, instead of 6, to force alignment */
};
/* Open a tap device. The file descriptor and the
* MAC address are written to the tap_info struct.
* On failure, a negative value is returned. */
int open_tap(ip4_addr_t local_ip,
ip4_addr_t local_mask,
struct tap_info * ti);
/* Close a tap device. */
void close_tap(union tap_desc * td);
/* Read a frame from a tap device. The buffer needs
* to be at least as large as the MTU of the device. */
int read_tap(union tap_desc * td, char * buf, int len);
/* Write a frame to a tap device. The frame length
* must be less than the MTU of the device. */
int write_tap(union tap_desc * td, const char * buf, int len);
#endif /* __HELP_HASKELL_VPN__ */