Compare commits

...

7 Commits

7 changed files with 73 additions and 29 deletions

View File

@ -1,6 +1,8 @@
libtun libtun
====== ======
![](branding/logo.png)
TUN/TAP adapter for D-based applications TUN/TAP adapter for D-based applications
## Usage ## Usage
@ -11,9 +13,9 @@ First add it to your dub-based project via:
dub add libtun dub add libtun
``` ```
### `TUNAdapter` ### `Adapter`
The `TUNAdapter` class provides you with all you need to get started. One can construct a new adapter as follows: The `Adapter` class provides you with all you need to get started. One can construct a new adapter as follows:
```d ```d
import libtun.adapter; import libtun.adapter;
@ -56,4 +58,4 @@ There are two types of adapters:
## License ## License
LGPLv3 LGPLv3

BIN
branding/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

BIN
branding/logo.xcf Normal file

Binary file not shown.

View File

@ -6,7 +6,5 @@
"description": "TUN adapter for D", "description": "TUN adapter for D",
"license": "LGPL-3.0", "license": "LGPL-3.0",
"name": "libtun", "name": "libtun",
"targetType": "library", "targetType": "library"
"preBuildCommands": ["cc $PACKAGE_DIR/source/libtun/tunctl.c -o $PACKAGE_DIR/source/tunctl.o -c"],
"lflags": ["$PACKAGE_DIR/source/tunctl.o"]
} }

View File

@ -8,13 +8,15 @@ import core.stdc.stdio;
/** /**
* TUN maintenance routines in `tunctl.c` * TUN maintenance routines in `tunctl.c`
* TODO: Use import C here
*/ */
extern (C) int createTun(char* interfaceName, int iffFlags); import libtun.tunctl;
extern (C) int destroyTun(int fd); // extern (C) int createTun(char* interfaceName, int iffFlags);
extern (C) int tunWrite(int fd, char* data, int length); // extern (C) int destroyTun(int fd);
extern (C) int tunRead(int fd, char* data, int amount); // extern (C) int tunWrite(int fd, char* data, int length);
// extern (C) int tunRead(int fd, char* data, int amount);
public class TUNAdapter public class Adapter
{ {
/* Tunnel device descriptor */ /* Tunnel device descriptor */
private int tunFD; private int tunFD;
@ -24,6 +26,15 @@ public class TUNAdapter
private byte[] scratch; private byte[] scratch;
/**
* Instantiates a new Adapter with the given interface name
* and optionally you can specifiy the adapter type (default
* is TAP)
*
* Params:
* interfaceName = the name of the interface to create
* adapterType = The AdapterType to use
*/
this(string interfaceName, AdapterType adapterType = AdapterType.TAP) this(string interfaceName, AdapterType adapterType = AdapterType.TAP)
{ {
init(interfaceName, adapterType); init(interfaceName, adapterType);
@ -50,6 +61,17 @@ public class TUNAdapter
} }
} }
public void setAddress()
{
}
/**
* Closes the adapter
*
* Throws:
* TUNException if the operation failed
*/
public void close() public void close()
{ {
sanityCheck(); sanityCheck();
@ -58,7 +80,15 @@ public class TUNAdapter
destroyTun(tunFD); destroyTun(tunFD);
} }
/**
* Blocks to receive into the buffer
*
* Params:
* buffer = The buffer variable to write the received
* data into
* Throws:
* TUNException if the read failed
*/
public void receive(ref byte[] buffer) public void receive(ref byte[] buffer)
{ {
sanityCheck(); sanityCheck();
@ -90,17 +120,16 @@ public class TUNAdapter
/* Copy the data into their buffer (and of correct length) */ /* Copy the data into their buffer (and of correct length) */
buffer = scratch[0..status].dup; buffer = scratch[0..status].dup;
} }
} }
/**
* Sends the provided data
*
* Params:
* buffer = The data to send
* Throws:
* TUNException if an error occurs
*/
public void send(byte[] buffer) public void send(byte[] buffer)
{ {
sanityCheck(); sanityCheck();

View File

@ -8,7 +8,7 @@ import core.thread;
void main() void main()
{ {
writeln("Edit source/app.d to start your project."); writeln("Edit source/app.d to start your project.");
TUNAdapter adapter = new TUNAdapter("testInterface0"); Adapter adapter = new Adapter("testInterface0");
while(true) while(true)
{ {

View File

@ -20,11 +20,20 @@
#include<string.h> #include<string.h>
#include<sys/ioctl.h> #include<sys/ioctl.h>
#include<unistd.h> #include<unistd.h>
#include<stdint.h>
int createTun(char* interfaceName, int iffFlags) /* TODO: Update types here using stdint */
//TODO: We could possibly use directly
uint32_t createTun(char* interfaceName, int32_t iffFlags)
{ {
/* TODO: Add all required error checking */ /* TODO: Add all required error checking */
int tunFD = open("/dev/net/tun", O_RDWR); int32_t tunFD = open("/dev/net/tun", O_RDWR);
/* If error */
if(tunFD < 0)
{
return tunFD;
}
/* TUN properties */ /* TUN properties */
struct ifreq interfaceReqData; struct ifreq interfaceReqData;
@ -38,22 +47,24 @@ int createTun(char* interfaceName, int iffFlags)
strcpy(interfaceReqData.ifr_name, interfaceName); strcpy(interfaceReqData.ifr_name, interfaceName);
/* Attempt to bring up the tun device node */ /* Attempt to bring up the tun device node */
int tunStatus = ioctl(tunFD, TUNSETIFF, &interfaceReqData); int32_t tunStatus = ioctl(tunFD, TUNSETIFF, &interfaceReqData);
if(tunStatus < 0) if(tunStatus < 0)
{ {
tunFD = tunStatus; tunFD = tunStatus;
} }
return tunFD; return tunFD;
} }
int destroyTun(int fd) //TOOD: Maybe use directly
uint32_t destroyTun(uint32_t fd)
{ {
return close(fd); return close(fd);
} }
int tunWrite(int fd, char* data, int length) //TODO: Maybe use directly
uint32_t tunWrite(uint32_t fd, char* data, int length)
{ {
write(fd, data, length); write(fd, data, length);
} }
@ -64,7 +75,11 @@ int tunWrite(int fd, char* data, int length)
* *
* (FIXME: For now we just read 20 bytes) * (FIXME: For now we just read 20 bytes)
*/ */
int tunRead(int fd, char* data, int amount) //TODO: Maybe use directly
uint32_t tunRead(uint32_t fd, char* data, int amount)
{ {
return read(fd, data, amount); return read(fd, data, amount);
} }
// uint32_t tunSet()