Compare commits

..

237 Commits

Author SHA1 Message Date
Adrien Gallouët
f65ecac5fe Skip ip rule errors for now
Signed-off-by: Adrien Gallouët <adrien@gallouet.fr>
2017-11-30 16:31:57 +00:00
Adrien Gallouët
086fa412ed Add CAP_NET_RAW by default (needed by mtu-auto)
Signed-off-by: Adrien Gallouët <adrien@gallouet.fr>
2017-11-30 16:31:26 +00:00
Adrien Gallouët
8476332224 Set mtu-auto by default in glorytun-setup
Signed-off-by: Adrien Gallouët <adrien@gallouet.fr>
2017-11-30 16:22:11 +00:00
Adrien Gallouët
9dacd85713 Add missing include
Signed-off-by: Adrien Gallouët <adrien@gallouet.fr>
2017-11-30 16:17:47 +00:00
Adrien Gallouët
ff83707581 Update autotools and add missing files
Signed-off-by: Adrien Gallouët <adrien@gallouet.fr>
2017-11-27 20:59:33 +00:00
Adrien Gallouët
a02839712e Force restart systemd-networkd
Signed-off-by: Adrien Gallouët <adrien@gallouet.fr>
2017-11-27 11:52:05 +00:00
Adrien Gallouët
495138ffe4 Try to guess pref in glorytun-run
Signed-off-by: Adrien Gallouët <adrien@gallouet.fr>
2017-11-27 11:12:48 +00:00
Adrien Gallouët
e26ecf37a3 Cleanup glorytun-setup
Signed-off-by: Adrien Gallouët <adrien@gallouet.fr>
2017-11-26 20:52:36 +00:00
Adrien Gallouët
827876647f Fix typo
Signed-off-by: Adrien Gallouët <adrien@gallouet.fr>
2017-11-26 17:20:35 +00:00
Adrien Gallouët
d1940692b2 Update README.md
Signed-off-by: Adrien Gallouët <adrien@gallouet.fr>
2017-11-26 14:11:36 +00:00
Adrien Gallouët
d3307a22f8 Add missing netinet/in.h (for freebsd)
Signed-off-by: Adrien Gallouët <adrien@gallouet.fr>
2017-11-26 14:02:53 +00:00
Adrien Gallouët
93cefd6dba Dependency systemd is not mandatory
Signed-off-by: Adrien Gallouët <adrien@gallouet.fr>
2017-11-26 13:52:20 +00:00
Adrien Gallouët
21718c8c14 Update README.md
Signed-off-by: Adrien Gallouët <adrien@gallouet.fr>
2017-11-26 13:22:51 +00:00
Adrien Gallouët
aa54a72bbc Update mud
Signed-off-by: Adrien Gallouët <adrien@gallouet.fr>
2017-11-26 13:18:07 +00:00
Adrien Gallouët
32e6e7575a Update README.md
Signed-off-by: Adrien Gallouët <adrien@gallouet.fr>
2017-11-26 13:13:37 +00:00
Adrien Gallouët
19eea3e96d Add a start section in glorytun-setup
Signed-off-by: Adrien Gallouët <adrien@gallouet.fr>
2017-11-26 12:44:13 +00:00
Adrien Gallouët
75b2903ac2 Add unit systemd files
Signed-off-by: Adrien Gallouët <adrien@gallouet.fr>
2017-11-26 08:23:25 +00:00
Adrien Gallouët
0f5a6f5d98 Update .gitignore
Signed-off-by: Adrien Gallouët <adrien@gallouet.fr>
2017-11-17 14:43:55 +00:00
Adrien Gallouët
ed90fdea02 Cleanup meson build
Signed-off-by: Adrien Gallouët <adrien@gallouet.fr>
2017-11-17 14:42:56 +00:00
Adrien Gallouët
520bd33cb3 Update README.md
Signed-off-by: Adrien Gallouët <adrien@gallouet.fr>
2017-11-17 08:35:31 +00:00
Adrien Gallouët
361c695c5c Remove .build.sh
Signed-off-by: Adrien Gallouët <adrien@gallouet.fr>
2017-11-17 08:33:44 +00:00
Adrien Gallouët
bc5d622169 Update README.md
Signed-off-by: Adrien Gallouët <adrien@gallouet.fr>
2017-11-17 08:32:48 +00:00
Adrien Gallouët
7859746f66 Add meson.build
Signed-off-by: Adrien Gallouët <adrien@gallouet.fr>
2017-11-17 08:19:22 +00:00
Adrien Gallouët
c3b8c44c68 Show only version
Signed-off-by: Adrien Gallouët <adrien@gallouet.fr>
2017-11-17 08:18:30 +00:00
Adrien Gallouët
297e93ed54 Add persist option
Signed-off-by: Adrien Gallouët <adrien@gallouet.fr>
2017-11-16 15:52:30 +00:00
Adrien Gallouët
325575c6a7 Update mud and add option keygen
Signed-off-by: Adrien Gallouët <adrien@gallouet.fr>
2017-11-16 15:20:11 +00:00
Adrien Gallouët
3b1c9db3f8 Remove gt_na() and gt_fatal()
Signed-off-by: Adrien Gallouët <adrien@gallouet.fr>
2017-11-15 23:31:17 +00:00
Adrien Gallouët
557d3f7869 Update mud 2017-03-07 10:46:38 +00:00
Adrien Gallouët
195908d379 Add iface.[ch] 2017-03-07 10:36:23 +00:00
Adrien Gallouët
eb5c6853c1 Allow undefined PACKAGE_STRING 2017-03-07 10:36:16 +00:00
Adrien Gallouët
3c2481dc33 Allow undefined TUNSETPERSIST 2017-02-10 15:13:05 +00:00
Adrien Gallouët
355040f576 Don't destroy tun on SIGHUP 2017-02-10 11:54:19 +00:00
Adrien Gallouët
bbf1c12f7a Update mud 2017-01-29 12:03:27 +00:00
Adrien Gallouët
c54303da8f Update mud 2017-01-20 09:53:58 +00:00
Adrien Gallouët
e3440cf1e9 Update mud 2017-01-19 14:55:09 +00:00
Adrien Gallouët
86916f1999 Add buf-size option and increase buffer size 2017-01-19 14:13:29 +00:00
Adrien Gallouët
9cebabfe01 Remove while(1) 2017-01-19 12:47:06 +00:00
Adrien Gallouët
0664fc3b21 Update mud 2017-01-18 15:27:18 +00:00
Adrien Gallouët
2cb24c0523 Update mud 2017-01-16 16:11:18 +00:00
Adrien Gallouët
65be22202c Update mud 2017-01-12 13:26:35 +00:00
Adrien Gallouët
6cc32bafd9 Code cleanup 2017-01-12 13:26:23 +00:00
Adrien Gallouët
6c268e658f Reset default MTU to 1500 2017-01-06 13:17:46 +00:00
Adrien Gallouët
33e24632d0 Update mud 2017-01-06 11:50:31 +00:00
Adrien Gallouët
e1b4c6aafc Add debug.bin 2017-01-06 11:02:09 +00:00
Adrien Gallouët
09d1932588 Code cleanup 2017-01-06 10:16:13 +00:00
Adrien Gallouët
4988479df4 Drop packets with bad length (too small) 2017-01-05 16:45:14 +00:00
Adrien Gallouët
7779e61c15 Update mud 2017-01-04 14:37:51 +00:00
Adrien Gallouët
2cc8caec35 Don't try to send empty packet 2017-01-04 14:35:26 +00:00
Adrien Gallouët
8c8715187b Code cleanup 2017-01-04 14:27:55 +00:00
Adrien Gallouët
c591a4d3cc Drop too large packets 2017-01-04 14:15:18 +00:00
Adrien Gallouët
76cd7ed4b8 Don't handle errors in tun.c 2017-01-04 14:07:30 +00:00
Adrien Gallouët
a8595c36b4 Update mud 2016-12-22 13:44:31 +00:00
Adrien Gallouët
1dfe105bd0 Don't modify mtu from mud_get_mtu() 2016-12-22 10:25:34 +00:00
Adrien Gallouët
f2ead2e4e2 Set nonblock to all fds 2016-12-22 10:22:16 +00:00
Adrien Gallouët
234f0d8592 Update and fix MTU 2016-12-21 16:14:40 +00:00
Adrien Gallouët
bd102c5fb0 Don't use linux/if_tun.h
This allows to build easily with other libc.
2016-12-21 11:43:19 +00:00
Adrien Gallouët
521d02e6e8 Code cleanup 2016-12-20 16:29:40 +00:00
Adrien Gallouët
91efdfe4e8 Exit only on EBADF for select() 2016-12-20 11:44:42 +00:00
Adrien Gallouët
deba26a7cb Code cleanup 2016-12-20 10:57:42 +00:00
Adrien Gallouët
b2f01687a8 Ignore SIGUSR2 2016-12-20 10:25:00 +00:00
Adrien Gallouët
dc295f9dc0 Remove old gt.info 2016-12-20 10:24:20 +00:00
Adrien Gallouët
04f7c20494 Remove fd_read*() 2016-12-20 10:19:05 +00:00
Adrien Gallouët
cd1f122a59 Add gt_print_secretkey() 2016-12-20 10:06:24 +00:00
Adrien Gallouët
8ecd24564f Remove old fd_write*() 2016-12-20 10:00:24 +00:00
Adrien Gallouët
577938432a Remove buffer.h 2016-12-20 08:51:11 +00:00
Adrien Gallouët
89f8379c73 Remove statefile option 2016-12-20 08:49:43 +00:00
Adrien Gallouët
5934e3b94d Update mud 2016-12-19 16:46:17 +00:00
Adrien Gallouët
0e5974aea2 Update README.md and mud 2016-12-15 10:10:05 +00:00
Adrien Gallouët
3675820555 Add mtu-auto option 2016-12-14 14:56:53 +00:00
Adrien Gallouët
3ba1b914d6 Update mud 2016-12-13 13:54:33 +00:00
Adrien Gallouët
1dbf3fcc80 Update mud 2016-12-12 16:41:28 +00:00
Adrien Gallouët
6167145454 Update mud 2016-12-12 15:11:52 +00:00
Adrien Gallouët
97ae583707 Update mud 2016-12-08 11:24:15 +00:00
Adrien Gallouët
0d97df6b50 Reformat 2016-12-05 15:05:54 +00:00
Adrien Gallouët
0645f0d4d0 Update mud 2016-12-02 11:19:21 +00:00
Adrien Gallouët
3656ab9e2a Add bind-backup option 2016-11-28 11:02:06 +00:00
Adrien Gallouët
adb791d3ba Update mud 2016-11-25 16:44:00 +00:00
Adrien Gallouët
f1a5d55613 Update mud 2016-11-18 18:03:12 +00:00
Adrien Gallouët
f46305847e Rework buffer 2016-11-18 11:55:21 +00:00
Adrien Gallouët
a75f3b0fd8 Remove STARTED and STOPPED 2016-11-07 15:08:25 +00:00
Adrien Gallouët
2934228005 Remove pull/push of mud 2016-10-27 15:04:11 +00:00
Adrien Gallouët
d599e545f7 Update mud 2016-10-25 09:15:34 +00:00
Frank Denis
048870e280 <linux/if.h> is not required any more (#19) 2016-10-24 11:19:43 +02:00
Frank Denis
31045456fe include <net/if.h> for the ifreq structure (#18)
Required on BSD. Doesn't break anything elsewhere.
2016-10-23 12:38:32 +02:00
Adrien Gallouët
0bb5be63b9 Get ICMP type 3 to set the next-hop MTU 2016-10-18 16:44:20 +00:00
Adrien Gallouët
c9f737197c Remove multiqueue (not used with mud) 2016-10-05 09:49:14 +00:00
Adrien Gallouët
d4e70feddc Update mud 2016-10-05 08:02:48 +00:00
Adrien Gallouët
726a3eed13 Add MTU negotiation 2016-10-04 15:27:37 +00:00
Adrien Gallouët
caeed75918 Update mud 2016-09-21 16:17:20 +00:00
Adrien Gallouët
9a6795125d Update mud 2016-09-16 15:13:18 +00:00
Adrien Gallouët
db26fc5676 Update mud 2016-09-06 08:46:23 +00:00
Adrien Gallouët
05cc7b1087 Be more verbose when mud fails 2016-09-06 08:45:53 +00:00
Adrien Gallouët
6df1f9e243 Update mud 2016-09-05 09:31:34 +00:00
Adrien Gallouët
73ce84ccf7 Fixes #15 2016-08-26 11:19:52 +00:00
Adrien Gallouët
91bb0b1231 Forward tos/tclass to mud 2016-07-25 15:15:27 +00:00
Adrien Gallouët
84156a9eba Update mud 2016-07-20 15:15:11 +00:00
Adrien Gallouët
b13501b9fb Update mud 2016-07-19 16:53:53 +00:00
Adrien Gallouët
3363e219a7 Update mud 2016-07-15 18:45:36 +00:00
Adrien Gallouët
00ee23b0b6 Allow IPv4 and IPv6 only on Linux 2016-07-15 18:42:28 +00:00
Adrien Gallouët
1286b0f69e Update mud 2016-07-15 17:35:45 +00:00
Adrien Gallouët
fe5bc5454e Add chacha20 option and AES-NI negotiation 2016-07-12 17:01:41 +00:00
Adrien Gallouët
f4e94a9089 Remove -flto for now 2016-07-11 10:24:47 +00:00
Adrien Gallouët
6a7da371e2 Add .build.sh 2016-07-11 09:34:16 +00:00
Adrien Gallouët
4cf5f7a118 Update mud 2016-07-07 14:39:19 +00:00
Adrien Gallouët
35fd01f9ee Update mud 2016-07-06 13:42:30 +00:00
Adrien Gallouët
04aad57789 Update mud 2016-07-05 15:41:32 +00:00
Adrien Gallouët
7a277a8810 Update configure.ac 2016-06-30 09:52:34 +00:00
Adrien Gallouët
b232a101d2 Update mud 2016-06-30 09:41:32 +00:00
Adrien Gallouët
a01dc81500 Don't wait too long when we have data to send 2016-06-27 11:19:16 +00:00
Adrien Gallouët
1db628d84a Update mud 2016-06-24 13:21:02 +00:00
Adrien Gallouët
f11cd34dc4 Update mud 2016-06-22 17:55:18 +00:00
Adrien Gallouët
d0376e3aa5 Update mud 2016-06-22 09:18:34 +00:00
Adrien Gallouët
a7518c0e5a Update mud 2016-06-21 16:51:24 +00:00
Adrien Gallouët
378316bd68 Add mtu option 2016-06-13 15:43:45 +00:00
angt
286d6abf2d Update mud 2016-05-10 10:46:15 +00:00
angt
1f1464e90d Update mud 2016-05-09 14:23:17 +00:00
angt
55d9dd9277 Update mud 2016-05-02 09:18:44 +00:00
angt
2f290dbf85 Update mud and merge from master 2016-04-26 06:54:30 +00:00
angt
39e3f53139 Add v{4,6}only option 2016-04-25 16:29:20 +00:00
angt
babe14d544 Quit on tun error 2016-04-25 10:24:42 +00:00
angt
278fc69789 Update mud 2016-04-21 15:35:35 +00:00
angt
99262777fc Update mud 2016-04-17 10:16:13 +00:00
angt
b0f60caab2 Update mud 2016-04-14 20:12:45 +00:00
angt
efd5e0bb36 Remove down-timeout and use timeout for send-timeout 2016-04-08 14:38:07 +00:00
angt
ade4617d53 Update mud 2016-04-08 13:00:52 +00:00
angt
64a5fd8227 Update mud 2016-04-05 14:23:45 +00:00
angt
eba968797c Add {down,send,pong}-timeout and time-tolerance option 2016-04-05 14:17:07 +00:00
angt
d60f28a7fe Update mud 2016-04-05 06:42:03 +00:00
angt
32069eb104 Print tun device on STARTED and STOPPED too 2016-04-04 20:05:33 +00:00
angt
a6adcefc25 Update mud 2016-04-04 16:48:11 +00:00
angt
743b0ee0da Don't check AES-NI 2016-04-01 16:50:04 +00:00
angt
ba06a6fc10 Update mud 2016-04-01 16:37:02 +00:00
Adrien Gallouët
80d4c2814f Update README.md 2016-03-24 18:52:18 +01:00
angt
b0d5007bfb Restore STARTED and STOPPED states 2016-03-24 14:45:15 +00:00
angt
d2046eb00b Revert "Add branch name in version"
This reverts commit 03cd87df1c.
2016-03-09 11:42:51 +00:00
angt
d04acc9c0f Update mud 2016-03-09 10:59:52 +00:00
angt
03cd87df1c Add branch name in version 2016-03-09 10:20:01 +00:00
angt
8e8ad7178d Update mud 2016-03-04 11:32:42 +00:00
angt
0e26b4def7 Update mud 2016-03-04 11:20:15 +00:00
angt
f800985766 Update mud 2016-03-04 11:01:43 +00:00
angt
7b88c28a45 Update mud 2016-03-03 10:49:28 +00:00
angt
194dfe17d3 Update mud 2016-03-02 12:59:33 +00:00
angt
664160e0cc Add bind-port option 2016-03-01 15:11:16 +00:00
angt
1dd760e382 Code cleanup 2016-03-01 08:13:05 +00:00
angt
05219b81f7 Update README.md 2016-02-29 16:14:08 +00:00
angt
0bb7e4f1d0 Update mud 2016-02-29 15:35:57 +00:00
angt
a7fbf806fb Use a list to setup mud_bind() 2016-02-29 15:28:37 +00:00
angt
e750c46665 Update mud 2016-02-25 15:22:47 +00:00
angt
935111cfea Fix Makefile.am 2016-02-04 11:31:02 +01:00
angt
c4b2512df4 Add .gitmodules 2016-02-04 10:44:53 +01:00
angt
27970e24fb Import and use mud 2016-02-04 10:39:36 +01:00
angt
acc3ee3461 Encrypt only one packet at a time 2016-01-26 12:18:00 +01:00
angt
eefa7722c5 Use timeout in connect() too 2016-01-21 16:22:31 +01:00
angt
17547f555d Add SECRETKEY state 2016-01-18 18:07:35 +01:00
angt
ec9c59ce69 Code cleanup 2016-01-18 18:00:41 +01:00
angt
679927a684 Show device name in INITIALIZED state 2016-01-18 17:58:20 +01:00
angt
2999faf5d7 Move up state_init() 2016-01-18 17:26:42 +01:00
angt
219384b7e5 Remove the old school daemon option 2016-01-18 16:09:29 +01:00
angt
3649e46b03 Remove the absolute path restriction on statefile 2016-01-18 16:02:29 +01:00
angt
88f314bc75 Add state.[ch] 2016-01-18 15:59:18 +01:00
angt
e2b3dc1b46 Use only v[0-9].* tags to get VERSION 2016-01-17 10:56:55 +01:00
angt
1815ea519f Create a tcp_entry only on ACK 2016-01-17 10:18:39 +01:00
angt
33356d5d35 Don't work too much 2016-01-17 09:40:56 +01:00
angt
4a5d07ec45 Merge pull request #11 from jedisct1/notag
Cope with branches that don't have tags
2016-01-16 16:16:05 +01:00
Frank Denis
a50882e1ac Cope with branches that don't have tags
`version.sh` used to return only the hash of the last commit, causing
VERSION_MAJOR to possibly contain non-numeric junk.
2016-01-16 15:37:42 +01:00
angt
b2cb8ebcbe The minimum value for buffer-size option is GT_PKT_MAX 2016-01-15 17:02:11 +01:00
angt
6fd6cf8c4a Merge pull request #10 from jedisct1/socket
Include <sys/socket.h> for AF_INET/AF_INET6 definitions
2016-01-14 17:14:56 +01:00
Frank Denis
f0fc2751e5 Include <sys/socket.h> for AF_INET/AF_INET6 definitions
Required on OpenBSD
2016-01-14 17:11:27 +01:00
angt
81cab007d0 Resend packet on partial tun_write() 2016-01-14 10:25:37 +01:00
angt
606396839f Don't update sa->base with old acks 2016-01-14 09:27:15 +01:00
angt
a8e37bafb9 Use realloc(): easier, better, faster, stronger 2016-01-13 16:19:58 +01:00
angt
87a38012cd Don't forget to free() seq_elem 2016-01-13 16:16:05 +01:00
angt
f04816e9a5 Try to detect TCP retransmission 2016-01-12 18:07:58 +01:00
angt
7107d036b1 Code cleanup 2016-01-07 08:30:21 +01:00
angt
30502e05ec Print state info in stdout if no statefile 2016-01-06 18:41:39 +01:00
angt
905673ecec Add timeout option 2016-01-06 18:33:59 +01:00
angt
cfbb77c710 Code cleanup 2016-01-06 17:57:12 +01:00
angt
13dcdc5afb Reduce GT_BUFFER_SIZE 2016-01-06 16:03:42 +01:00
angt
56ec81bf92 Fix last commit 2016-01-06 12:15:28 +01:00
angt
f1024381e0 Remove old code from qos 2016-01-06 11:29:13 +01:00
angt
3f3b21f08d Update Makefile.am 2016-01-05 14:16:30 +01:00
angt
40dd5ce18a Code cleanup 2016-01-05 14:07:18 +01:00
angt
5efb379251 Remove byte_*() as we don't use freestanding anymore 2016-01-05 12:26:38 +01:00
angt
2eb6521f9c Add a simple tcp tracker in debug mode 2016-01-05 08:24:03 +01:00
angt
bfd81e9666 Code cleanup 2016-01-04 20:07:11 +01:00
angt
8fa2322314 Add VERSION in the tarball 2016-01-01 12:32:20 +01:00
angt
8982f27220 Update LICENSE 2016-01-01 11:47:17 +01:00
angt
a5f97fcc8c States need EOL 2016-01-01 11:00:29 +01:00
angt
35a9bf27df Add state INITIALIZED 2015-12-31 16:07:36 +01:00
angt
ba0af8cc20 Define VERSION_MAJOR and use it in handshake 2015-12-29 18:31:23 +01:00
angt
ec85be5c6a Code cleanup 2015-12-29 12:59:55 +01:00
angt
fe989851ab Print more debug info 2015-12-29 12:58:39 +01:00
angt
46842dd200 Write state after the close() 2015-12-28 07:18:00 +01:00
angt
e5eb30598d Code cleanup 2015-12-24 17:38:08 +01:00
angt
c81ad0a7c6 One more time 2015-12-24 17:35:01 +01:00
angt
97641d6dda Reserve exclam for very bad message 2015-12-24 17:32:32 +01:00
angt
e48dac775c The statefile option needs an absolute path and a fifo 2015-12-24 17:29:41 +01:00
angt
6282f36ac7 Add statefile option 2015-12-24 16:53:50 +01:00
angt
cf022af4a9 Simplify the db by merging size and mask 2015-12-24 13:13:43 +01:00
angt
597c586657 Don't free data in db_remove() 2015-12-23 22:26:53 +01:00
angt
fc7f9aa0c8 Add a very simple low cost database 2015-12-23 17:11:20 +01:00
angt
7492f977b6 Define a simple proto 2015-12-21 12:34:24 +01:00
angt
38b7333533 Refuse to start the client without keyfile 2015-12-18 16:07:14 +01:00
angt
1ab854f058 Code cleanup 2015-12-18 11:57:20 +01:00
angt
c59def90fb Try to use SO_ACCEPTFILTER to defer accept on non-linux platforms 2015-12-17 23:20:31 +01:00
angt
347a3ecce7 Try to open tunX instead of glorytun by default in Linux 2015-12-17 17:06:04 +01:00
angt
98d13ef510 Print the tun name, not the path 2015-12-17 17:01:31 +01:00
angt
35b95001c4 Warn only when tun_create() fail 2015-12-17 14:07:14 +01:00
angt
75c12b36d6 Code cleanup 2015-12-17 13:59:40 +01:00
angt
db01c8b33f Update README.md 2015-12-17 08:51:07 +01:00
angt
fb4f6f6cb9 Do the md5sum after deploy 2015-12-16 11:27:53 +01:00
angt
a86aea431d Let travis do the md5sum 2015-12-16 08:35:20 +01:00
angt
1a128a6d92 Print readable ip in debug mode 2015-12-15 17:32:03 +01:00
angt
ddae22a3d9 Use a new random secret key without keyfile 2015-12-15 09:07:44 +01:00
angt
893de45272 Accept lower-case in fromhex() 2015-12-15 08:28:10 +01:00
angt
78ba4c9a59 Do not call ip_get_version() again and again 2015-12-14 18:37:50 +01:00
angt
ffa549e444 Fix and cleanup gt_{from,to}hex 2015-12-13 11:26:58 +01:00
angt
6040f17e1c Code cleanup 2015-12-13 11:07:55 +01:00
angt
da30c9110a Do not ask too much to macosx 2015-12-12 13:30:27 +01:00
angt
05de7b8109 Show udp hdr too in debug mode 2015-12-12 13:18:56 +01:00
angt
7cc6d08d7a Use __FAVOR_BSD... 2015-12-12 13:07:51 +01:00
angt
d526a3cfa5 Fix retry when kx fails 2015-12-12 12:19:09 +01:00
angt
0e319b068d Listener should retry accept() by default 2015-12-12 11:05:58 +01:00
angt
c82026cfd7 Update README.md 2015-12-11 17:44:16 +01:00
angt
109f70c208 Secret key must be stored in upper-case hex now 2015-12-11 17:33:35 +01:00
angt
23cdc37ea8 Add gt_tohex() and gt_fromhex() 2015-12-11 16:33:45 +01:00
angt
7688209093 Show tcp hdr in debug 2015-12-11 11:32:22 +01:00
angt
52a3a4b853 Add debug option to show ip_proto 2015-12-10 15:28:45 +01:00
angt
4cf0e7bc68 Function dt_ms() is pure too 2015-12-10 13:19:24 +01:00
angt
f36fde5054 Add ip_get_proto() 2015-12-10 13:17:27 +01:00
angt
e08eb73f98 Remove TCP_INFO 2015-12-10 12:33:54 +01:00
angt
f3143eff83 Do not print error for EPIPE or ECONNRESET on write() 2015-12-09 20:38:49 +01:00
angt
ea1fa120eb Allow IPv6 2015-12-09 20:27:40 +01:00
angt
be29a12842 Deploy only on linux-gcc 2015-12-09 11:25:51 +01:00
angt
113f1ae58d Use file_glob in travis 2015-12-08 18:27:59 +01:00
angt
73fff34bfe Try to deploy with travis 2015-12-08 18:10:39 +01:00
angt
84ae6dae32 Use printf instead of echo -n 2015-12-08 15:16:22 +01:00
30 changed files with 1285 additions and 1352 deletions

2
.gitignore vendored
View File

@@ -11,3 +11,5 @@ build-aux
.deps .deps
.dirstamp .dirstamp
glorytun glorytun
build*
VERSION

3
.gitmodules vendored Normal file
View File

@@ -0,0 +1,3 @@
[submodule "mud"]
path = mud
url = https://github.com/angt/mud.git

View File

@@ -18,3 +18,18 @@ before_script:
script: script:
- ./configure --disable-dependency-tracking && make distcheck - ./configure --disable-dependency-tracking && make distcheck
deploy:
provider: releases
api_key:
secure: Ira1jd3j+17QVFbJ7KlkytTNp0oMZLTqCWPQLxNHLEt32PVY/IPs/16BcvTbFpKrY+Ma7E3KCihfufTVG8T+jRlZ5hFO7HNpoQMgi7L7yZZAGScYO5pnMQvsr8O9hf7jzSi1DjFXgFHznbPJJ3lOSwegcqzSrbZflokiCR50GTLLWewHoPpfs+1gJ5XbtVyRhZlmXhMPC0NEH2sh33X2WdUiKUJUMOnlYC0atPBL+4n12qxnugF9YA9wPK5NHJSLiPHue7I2rHlSrOLX5NkN3vqnEvusiuIFQX1y0NuKtkpOscFD9n1CLHThGLuzMvPlwpdQfzRMVxwjYFGu6Ma5alf64ksFnMKl8Oo0yCXEA7WvHXz+qUai/a1gzYZLTGuasHtjrHN/mgKxM4QRSiHo8t5hj3CczUW+OFglytawZQyGjyUUiKdwx2kvlO96RVDIYEhUD4DeHzHR8rhvDLmlMlGAWqUPXq7d4D+bExqKmqWCCSkhrbubq5B1kChRmgw7/gly4SryqGy+R0xsC4oq9jUUxd7Sl801BIKcYDb5r5gFSw+hEhOzBb+uE2xJYFNO2KZ+eG69lkFeG3oNJMTy8afs8fRRUXq0poQJ39wFWerps3Md7h8Sxs61YLIAKHvLJJMfoMI+AORTcjnnpqujMhgWGWt8wLhJZdxaSycoQkU=
skip_cleanup: true
file_glob: true
file: glorytun-*.tar.gz
on:
tags: true
repo: angt/glorytun
condition: "${TRAVIS_OS_NAME}-${CC} == linux-gcc"
after_deploy:
- md5sum glorytun-*.tar.gz

View File

@@ -1,4 +1,4 @@
Copyright (c) 2015, angt Copyright (c) 2015-2016, angt
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without

View File

@@ -6,17 +6,32 @@ glorytun_CFLAGS = $(libsodium_CFLAGS)
glorytun_LDADD = $(libsodium_LIBS) glorytun_LDADD = $(libsodium_LIBS)
glorytun_SOURCES = \ glorytun_SOURCES = \
src/common.h \ src/common.h \
src/common-static.h \
src/common.c \ src/common.c \
src/ip-static.h \ src/ip.h \
src/str.h \
src/main.c \ src/main.c \
src/option.c \ src/option.c \
src/option.h \ src/option.h \
src/tun.c \ src/tun.c \
src/tun.h src/tun.h \
src/iface.c \
src/iface.h \
src/db.c \
src/db.h \
mud/mud.h \
mud/mud.c
EXTRA_DIST = \ EXTRA_DIST = \
LICENSE \ LICENSE \
README.md \ README.md \
autogen.sh \ VERSION \
version.sh systemd/glorytun-client.network \
systemd/glorytun-run \
systemd/glorytun-setup \
systemd/glorytun.network \
systemd/glorytun@.service.in \
mud/LICENSE \
mud/README.md \
meson.build \
autogen.sh \
version.sh

View File

@@ -1,22 +1,53 @@
# Glorytun # Glorytun
Small, Simple and Stupid **TCP** VPN. Small, Simple and Stupid VPN over [mud](https://github.com/angt/mud).
**Work In Progress:** Do not touch! This code will probably format your harddisk! ### Build and Install
Glorytun depends on [libsodium](https://github.com/jedisct1/libsodium) version >= 1.0.4 Glorytun depends on [libsodium](https://github.com/jedisct1/libsodium) version >= 1.0.4.
and needs an AES-NI capable CPU.
To build and install the latest version: On Ubuntu, the following command should be sufficient:
$ git clone https://github.com/angt/glorytun $ sudo apt-get install meson libsodium-dev pkg-config
Grab the latest release from github:
$ git clone https://github.com/angt/glorytun --recursive
$ cd glorytun $ cd glorytun
$ ./autogen.sh
$ ./configure
$ make
# make install
To create and use a new secret key: To build and install the latest version with [meson](http://mesonbuild.com):
$ dd if=/dev/urandom of=glorytun.key bs=32 count=1 $ meson build
# glorytun keyfile glorytun.key [...] $ sudo ninja -C build install
The more classical autotools suite is also available.
### Easy setup with systemd
Just call `glorytun-setup` and follow the instructions.
First, setup the server:
$ sudo glorytun-setup
Config filename (tun0):
Server ip (enter for server conf):
Server key (enter to generate a new one):
Your new key: NEW_KEY
Start glorytun now ? (enter to skip): y
Copy the new generated key and use it when configuring the client:
$ sudo glorytun-setup
Config filename (tun0):
Server ip (enter for server conf): SERVER_IP
Server key (enter to generate a new one): NEW_KEY
Start glorytun now ? (enter to skip): y
You can check easily if it works by looking at your public ip.
To stop the service:
$ sudo systemctl stop glorytun@tun0
---
For feature requests and bug reports, please create an [issue](https://github.com/angt/glorytun/issues).

View File

@@ -4,17 +4,19 @@ AC_INIT([glorytun],
[https://github.com/angt/glorytun/issues], [https://github.com/angt/glorytun/issues],
[glorytun], [glorytun],
[https://github.com/angt/glorytun]) [https://github.com/angt/glorytun])
AC_DEFINE_UNQUOTED([VERSION_MAJOR], [m4_esyscmd([./version.sh major])])
AC_CONFIG_SRCDIR([src/common.h]) AC_CONFIG_SRCDIR([src/common.h])
AC_CONFIG_AUX_DIR([build-aux]) AC_CONFIG_AUX_DIR([build-aux])
AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_MACRO_DIR([m4])
AM_INIT_AUTOMAKE([1.9 -Wall -Werror foreign tar-ustar subdir-objects]) AM_INIT_AUTOMAKE([1.12 -Wall -Werror foreign tar-ustar subdir-objects])
AM_DEP_TRACK AM_DEP_TRACK
AM_SILENT_RULES([yes]) AM_SILENT_RULES([yes])
AM_PROG_CC_C_O AM_PROG_CC_C_O
AC_PROG_CC_C99 AC_PROG_CC_C99
AC_USE_SYSTEM_EXTENSIONS AC_USE_SYSTEM_EXTENSIONS
AC_SEARCH_LIBS([getaddrinfo], [resolv nsl])
AC_SEARCH_LIBS([socket], [socket]) AC_SEARCH_LIBS([socket], [socket])
AC_CHECK_LIB([rt], [clock_gettime])
AC_CHECK_FUNCS([clock_gettime])
PKG_CHECK_MODULES([libsodium], [libsodium >= 1.0.4]) PKG_CHECK_MODULES([libsodium], [libsodium >= 1.0.4])
AC_CONFIG_FILES([Makefile]) AC_CONFIG_FILES([Makefile])
AC_OUTPUT AC_OUTPUT

View File

@@ -1,6 +1,6 @@
dnl pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- # pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*-
dnl serial 11 (pkg-config-0.29) # serial 12 (pkg-config-0.29.2)
dnl
dnl Copyright © 2004 Scott James Remnant <scott@netsplit.com>. dnl Copyright © 2004 Scott James Remnant <scott@netsplit.com>.
dnl Copyright © 2012-2015 Dan Nicholson <dbn.lists@gmail.com> dnl Copyright © 2012-2015 Dan Nicholson <dbn.lists@gmail.com>
dnl dnl
@@ -41,7 +41,7 @@ dnl
dnl See the "Since" comment for each macro you use to see what version dnl See the "Since" comment for each macro you use to see what version
dnl of the macros you require. dnl of the macros you require.
m4_defun([PKG_PREREQ], m4_defun([PKG_PREREQ],
[m4_define([PKG_MACROS_VERSION], [0.29]) [m4_define([PKG_MACROS_VERSION], [0.29.2])
m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1, m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1,
[m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])]) [m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])])
])dnl PKG_PREREQ ])dnl PKG_PREREQ
@@ -142,7 +142,7 @@ AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl
AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl
pkg_failed=no pkg_failed=no
AC_MSG_CHECKING([for $1]) AC_MSG_CHECKING([for $2])
_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) _PKG_CONFIG([$1][_CFLAGS], [cflags], [$2])
_PKG_CONFIG([$1][_LIBS], [libs], [$2]) _PKG_CONFIG([$1][_LIBS], [libs], [$2])
@@ -152,7 +152,7 @@ and $1[]_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.]) See the pkg-config man page for more details.])
if test $pkg_failed = yes; then if test $pkg_failed = yes; then
AC_MSG_RESULT([no]) AC_MSG_RESULT([no])
_PKG_SHORT_ERRORS_SUPPORTED _PKG_SHORT_ERRORS_SUPPORTED
if test $_pkg_short_errors_supported = yes; then if test $_pkg_short_errors_supported = yes; then
$1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1`
@@ -173,7 +173,7 @@ installed software in a non-standard prefix.
_PKG_TEXT])[]dnl _PKG_TEXT])[]dnl
]) ])
elif test $pkg_failed = untried; then elif test $pkg_failed = untried; then
AC_MSG_RESULT([no]) AC_MSG_RESULT([no])
m4_default([$4], [AC_MSG_FAILURE( m4_default([$4], [AC_MSG_FAILURE(
[The pkg-config script could not be found or is too old. Make sure it [The pkg-config script could not be found or is too old. Make sure it
is in your PATH or set the PKG_CONFIG environment variable to the full is in your PATH or set the PKG_CONFIG environment variable to the full

49
meson.build Normal file
View File

@@ -0,0 +1,49 @@
project('glorytun', 'c',
version: run_command('./version.sh').stdout(),
license: 'BSD-3-Clause',
default_options : [ 'buildtype=debugoptimized' ]
)
prefix = get_option('prefix')
bindir = join_paths(prefix, get_option('bindir'))
conf_data = configuration_data()
conf_data.set('prefix', prefix)
conf_data.set('bindir', bindir)
add_global_arguments('-DPACKAGE_VERSION="'+meson.project_version()+'"', language : 'c')
src = [
'src/common.c',
'src/iface.c',
'src/option.c',
'src/tun.c',
'mud/mud.c',
'src/main.c'
]
deps = [
dependency('libsodium', version : '>=1.0.4')
]
executable('glorytun', install: true, sources: src, dependencies: deps)
systemd = dependency('systemd', required: false)
if systemd.found()
systemdutildir = systemd.get_pkgconfig_variable('systemdutildir')
configure_file(
input: 'systemd/glorytun@.service.in',
output: 'glorytun@.service',
configuration: conf_data,
install_dir: join_paths(systemdutildir, 'system')
)
install_data('systemd/glorytun.network',
install_dir: join_paths(systemdutildir, 'network'))
install_data('systemd/glorytun-client.network',
install_dir: join_paths(systemdutildir, 'network'))
install_data('systemd/glorytun-run',
install_dir: bindir)
install_data('systemd/glorytun-setup',
install_dir: bindir)
endif

1
mud Submodule

Submodule mud added at 13cf44c813

View File

@@ -1,142 +0,0 @@
#pragma once
#include "common.h"
#include <unistd.h>
#include <errno.h>
static inline void byte_set (void *dst, const char value, size_t size)
{
if (!dst)
return;
char *restrict d = dst;
while (size--)
*d++ = value;
}
static inline void byte_cpy (void *dst, const void *src, size_t size)
{
if (!dst || !src)
return;
char *restrict d = dst;
const char *restrict s = src;
while (size--)
*d++ = *s++;
}
static inline size_t str_cpy (char *restrict dst, const char *restrict src, size_t len)
{
if (!dst || !src)
return 0;
size_t i;
for (i=0; i<len && src[i]; i++)
dst[i] = src[i];
dst[i] = 0;
return i;
}
static inline int str_cmp (const char *restrict sa, const char *restrict sb)
{
if (!sa || !sb)
return 1;
while (*sa==*sb++)
if (!*sa++)
return 0;
return 1;
}
static inline size_t str_len (const char *restrict str)
{
if (!str)
return 0;
size_t i = 0;
while (str[i])
i++;
return i;
}
static inline char *str_cat (const char *const strs[], size_t count)
{
size_t size = 1;
for (size_t i=0; i<count; i++)
size += str_len(strs[i]);
char *str = malloc(size);
if (!str)
return NULL;
char *p = str;
for (size_t i=0; i<count; i++) {
size_t len = str_len(strs[i]);
byte_cpy(p, strs[i], len);
p += len;
}
p[0] = 0;
return str;
}
static inline void buffer_setup (buffer_t *buffer, void *data, size_t size)
{
if (!data)
data = malloc(ALIGN(size));
buffer->data = data;
buffer->read = data;
buffer->write = data;
buffer->end = data;
buffer->end += size;
}
static inline void buffer_format (buffer_t *buffer)
{
buffer->write = buffer->data;
buffer->read = buffer->data;
}
static inline size_t buffer_size (buffer_t *buffer)
{
return buffer->end-buffer->data;
}
static inline size_t buffer_write_size (buffer_t *buffer)
{
return buffer->end-buffer->write;
}
static inline size_t buffer_read_size (buffer_t *buffer)
{
return buffer->write-buffer->read;
}
static inline void buffer_shift (buffer_t *buffer)
{
if (buffer->read==buffer->write) {
buffer_format(buffer);
} else {
const uint8_t *src = PALIGN_DOWN(buffer->read);
const size_t size = ALIGN(buffer->write-src);
if (buffer->data+size<src) {
byte_cpy(buffer->data, src, size);
buffer->read -= src-buffer->data;
buffer->write -= src-buffer->data;
}
}
}

View File

@@ -1,22 +1,24 @@
#include "common.h" #include "common.h"
#include <stdio.h>
#include <stdarg.h> #include <stdarg.h>
#include <stdio.h>
int gt_print (const char *fmt, ...) int
gt_print(const char *fmt, ...)
{ {
va_list ap; va_list ap;
va_start(ap, fmt); va_start(ap, fmt);
int ret = vfprintf(stdout, fmt, ap); int ret = vfprintf(stdout, fmt, ap);
va_end(ap); va_end(ap);
if (ret<0) if (ret < 0)
return 0; return 0;
return ret; return ret;
} }
void gt_log (const char *fmt, ...) void
gt_log(const char *fmt, ...)
{ {
va_list ap; va_list ap;
va_start(ap, fmt); va_start(ap, fmt);
@@ -24,17 +26,60 @@ void gt_log (const char *fmt, ...)
va_end(ap); va_end(ap);
} }
void gt_fatal (const char *fmt, ...) int
gt_tohex(char *dst, size_t dst_size, const uint8_t *src, size_t src_size)
{ {
va_list ap; if (_0_(!dst_size))
va_start(ap, fmt); return -1;
vfprintf(stderr, fmt, ap);
va_end(ap);
exit(EXIT_FAILURE); if (_0_(((dst_size - 1) / 2) < src_size))
return -1;
static const char tbl[] = "0123456789ABCDEF";
for (size_t i = 0; i < src_size; i++) {
*dst++ = tbl[0xF & (src[i] >> 4)];
*dst++ = tbl[0xF & (src[i])];
}
*dst = 0;
return 0;
} }
void gt_na (const char *name) _const_ static inline int
fromhex(const char c)
{ {
gt_log("%s is not available on your platform!\n", name); if (c >= '0' && c <= '9')
return c - '0';
if (c >= 'A' && c <= 'F')
return c - 'A' + 10;
if (c >= 'a' && c <= 'f')
return c - 'a' + 10;
return -1;
}
int
gt_fromhex(uint8_t *dst, size_t dst_size, const char *src, size_t src_size)
{
if (_0_(src_size & 1))
return -1;
if (_0_(dst_size < (src_size / 2)))
return -1;
for (size_t i = 0; i < src_size; i += 2) {
const int a = fromhex(src[i]);
const int b = fromhex(src[i + 1]);
if (_0_(a == -1 || b == -1))
return -1;
*dst++ = (a << 4) | b;
}
return 0;
} }

View File

@@ -2,8 +2,11 @@
#include <stdlib.h> #include <stdlib.h>
#include <stdint.h> #include <stdint.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#define COUNT(x) (sizeof(x)/sizeof(x[0])) #define COUNT(x) (sizeof(x)/sizeof(x[0]))
#define ALIGN_SIZE (1<<4) #define ALIGN_SIZE (1<<4)
#define ALIGN_MASK (ALIGN_SIZE-1) #define ALIGN_MASK (ALIGN_SIZE-1)
@@ -17,21 +20,23 @@
#define _1_(x) (__builtin_expect((x), 1)) #define _1_(x) (__builtin_expect((x), 1))
#define _0_(x) (__builtin_expect((x), 0)) #define _0_(x) (__builtin_expect((x), 0))
#define _printf_(A,B) __attribute__((format(printf,A,B))) #define CLZ(x) (__builtin_clz(x))
#define _noreturn_ __attribute__((noreturn))
#define _unused_ __attribute__((unused))
#define _align_(...) __attribute__((aligned(__VA_ARGS__)))
typedef struct buffer buffer_t; #define _printf_(A,B) __attribute__ ((format(printf,A,B)))
#define _noreturn_ __attribute__ ((noreturn))
#define _unused_ __attribute__ ((unused))
#define _pure_ __attribute__ ((pure))
#define _const_ __attribute__ ((const))
#define _align_(...) __attribute__ ((aligned(__VA_ARGS__)))
struct buffer { #undef MAX
uint8_t *data; #define MAX(x,y) ({ __typeof__(x) X=(x); __typeof__(y) Y=(y); X > Y ? X : Y; })
uint8_t *read;
uint8_t *write; #undef MIN
uint8_t *end; #define MIN(x,y) ({ __typeof__(x) X=(x); __typeof__(y) Y=(y); X < Y ? X : Y; })
};
int gt_print (const char *, ...) _printf_(1,2); int gt_print (const char *, ...) _printf_(1,2);
void gt_log (const char *, ...) _printf_(1,2); void gt_log (const char *, ...) _printf_(1,2);
void gt_fatal (const char *, ...) _printf_(1,2) _noreturn_;
void gt_na (const char *); int gt_tohex (char *, size_t, const uint8_t *, size_t);
int gt_fromhex (uint8_t *, size_t, const char *, size_t);

158
src/db.c Normal file
View File

@@ -0,0 +1,158 @@
#include "common.h"
#include "db.h"
#include "str.h"
#define CBIT(X) (1 & (intptr_t)(X))
#define CBIT_PTR(X) (uint8_t *)(1 | (intptr_t)(X))
#define CBIT_NODE(X) (struct node *)(1 ^ (intptr_t)(X))
struct node {
uint8_t *child[2];
uint32_t point;
};
_pure_ static inline size_t
db_size(const uint8_t *a)
{
return (a[0] ?: str_len((char *)a + 1)) + 1;
}
_pure_ static inline size_t
db_cmp(const uint8_t *a, const uint8_t *b)
{
const size_t size = a[0];
if (size != b[0])
return 1;
if (!size) {
size_t i = str_cmp((char *)a + 1, (char *)b + 1);
return i ? i + 1 : 0;
}
for (size_t i = 1; i <= size; i++) {
if (a[i] != b[i])
return i + 1;
}
return 0;
}
_pure_ static inline int
db_dir(const uint32_t point, uint8_t *data, const size_t size)
{
const size_t pos = point >> 8;
if (pos >= size)
return 0;
return ((point | data[pos]) & 255) == 255;
}
uint8_t *
db_search(uint8_t **p, uint8_t *data)
{
if (_0_(!*p))
return NULL;
uint8_t *r = *p;
const size_t size = db_size(data);
while (CBIT(r)) {
struct node *node = CBIT_NODE(r);
r = node->child[db_dir(node->point, data, size)];
}
if (!db_cmp(r, data))
return r;
return NULL;
}
uint8_t *
db_insert(uint8_t **p, uint8_t *data)
{
if (_0_(CBIT(data)))
return NULL;
if (_0_(!*p)) {
*p = data;
return data;
}
uint8_t *r = *p;
size_t size = db_size(data);
while (CBIT(r)) {
struct node *node = CBIT_NODE(r);
r = node->child[db_dir(node->point, data, size)];
}
const size_t diff = db_cmp(r, data);
if (_0_(!diff))
return r;
const size_t pos = diff - 1;
const uint8_t mask = ~((1u << 31) >> CLZ(r[pos] ^ data[pos]));
const size_t point = (pos << 8) | mask;
while (CBIT(*p)) {
struct node *node = CBIT_NODE(*p);
if (node->point > point)
break;
p = node->child + db_dir(node->point, data, size);
}
struct node *node = malloc(sizeof(struct node));
if (_0_(!node))
return NULL;
const int dir = (mask | r[pos]) == 255;
node->child[dir] = *p;
node->child[1 - dir] = data;
node->point = point;
*p = CBIT_PTR(node);
return data;
}
uint8_t *
db_remove(uint8_t **p, uint8_t *data)
{
if (_0_(!*p))
return NULL;
const size_t size = db_size(data);
uint8_t **p_old = NULL;
struct node *node = NULL;
int dir = 0;
while (CBIT(*p)) {
p_old = p;
node = CBIT_NODE(*p);
dir = db_dir(node->point, data, size);
p = node->child + dir;
}
if (_0_(db_cmp(data, *p)))
return NULL;
uint8_t *r = *p;
if (p_old) {
*p_old = node->child[1 - dir];
free(node);
} else {
*p = NULL;
}
return r;
}

7
src/db.h Normal file
View File

@@ -0,0 +1,7 @@
#pragma once
#include <stdint.h>
uint8_t *db_search (uint8_t **, uint8_t *);
uint8_t *db_insert (uint8_t **, uint8_t *);
uint8_t *db_remove (uint8_t **, uint8_t *);

30
src/iface.c Normal file
View File

@@ -0,0 +1,30 @@
#include "common.h"
#include "str.h"
#include "iface.h"
#include <sys/ioctl.h>
#include <net/if.h>
int
iface_set_mtu(char *dev_name, int mtu)
{
struct ifreq ifr = {
.ifr_mtu = mtu,
};
str_cpy(ifr.ifr_name, dev_name, IFNAMSIZ - 1);
int fd = socket(AF_INET, SOCK_DGRAM, 0);
if (fd == -1)
return -1;
int ret = ioctl(fd, SIOCSIFMTU, &ifr);
int err = errno;
close(fd);
errno = err;
return ret;
}

3
src/iface.h Normal file
View File

@@ -0,0 +1,3 @@
#pragma once
int iface_set_mtu (char *, int);

View File

@@ -1,39 +0,0 @@
#pragma once
#include <stdint.h>
static inline int ip_get_version (const uint8_t *data, size_t size)
{
if (size<20) // XXX
return -1; // XXX
return data[0]>>4;
}
static inline void ip_set_size (uint8_t *data, size_t size)
{
data[2] = 0xFF&(size>>8);
data[3] = 0xFF&(size);
}
static inline ssize_t ip_get_size (const uint8_t *data, size_t size)
{
switch (ip_get_version(data, size)) {
case 4:
return (data[2]<<8)|data[3];
case -1:
return -1;
}
return 0;
}
static inline int ip_get_dscp (const uint8_t *data, size_t size)
{
switch (ip_get_version(data, size)) {
case 4:
return data[1]>>2;
}
return 0;
}

45
src/ip.h Normal file
View File

@@ -0,0 +1,45 @@
#pragma once
#include <stdint.h>
struct ip_common {
uint8_t version;
uint8_t tc;
uint8_t proto;
uint8_t hdr_size;
uint16_t size;
};
_pure_ static inline uint8_t
ip_get_version(const uint8_t *data, size_t size)
{
if (size < 20)
return 0;
return data[0] >> 4;
}
static inline int
ip_get_common(struct ip_common *ic, const uint8_t *data, size_t size)
{
ic->version = ip_get_version(data, size);
switch (ic->version) {
case 4:
ic->tc = data[1];
ic->proto = data[9];
ic->hdr_size = (data[0] & 0xF) << 2;
ic->size = ((data[2] << 8) | data[3]);
if (ic->size >= 20)
return 0;
break;
case 6:
ic->tc = ((data[0] & 0xF) << 4) | (data[1] >> 4);
ic->proto = data[6];
ic->hdr_size = 40;
ic->size = ((data[4] << 8) | data[5]) + 40;
return 0;
}
return -1;
}

1377
src/main.c

File diff suppressed because it is too large Load Diff

View File

@@ -1,25 +1,25 @@
#include "common-static.h" #include "common.h"
#include <stdio.h>
#include <stdlib.h>
#include "option.h" #include "option.h"
#include "str.h"
int option_str (void *data, int argc, char **argv) int
option_str(void *data, int argc, char **argv)
{ {
if (argc<2 || !argv[1]) { if (argc < 2 || str_empty(argv[1])) {
gt_print("option `%s' need a string argument\n", argv[0]); gt_print("option `%s' need a string argument\n", argv[0]);
return -1; return -1;
} }
byte_cpy(data, &argv[1], sizeof(argv[1])); memcpy(data, &argv[1], sizeof(argv[1]));
return 1; return 1;
} }
int option_long (void *data, int argc, char **argv) int
option_long(void *data, int argc, char **argv)
{ {
if (argc<2 || !argv[1]) { if (argc < 2 || str_empty(argv[1])) {
gt_print("option `%s' need an integer argument\n", argv[0]); gt_print("option `%s' need an integer argument\n", argv[0]);
return -1; return -1;
} }
@@ -28,19 +28,20 @@ int option_long (void *data, int argc, char **argv)
char *end; char *end;
long val = strtol(argv[1], &end, 0); long val = strtol(argv[1], &end, 0);
if (errno || argv[1]==end) { if (errno || argv[1] == end) {
gt_print("argument `%s' is not a valid integer\n", argv[1]); gt_print("argument `%s' is not a valid integer\n", argv[1]);
return -1; return -1;
} }
byte_cpy(data, &val, sizeof(val)); memcpy(data, &val, sizeof(val));
return 1; return 1;
} }
int option_is_set (struct option *opts, const char *name) int
option_is_set(struct option *opts, const char *name)
{ {
for (int k=0; opts[k].name; k++) { for (int k = 0; opts[k].name; k++) {
if (!str_cmp(opts[k].name, name)) if (!str_cmp(opts[k].name, name))
return opts[k].set; return opts[k].set;
} }
@@ -48,20 +49,21 @@ int option_is_set (struct option *opts, const char *name)
return 0; return 0;
} }
int option_option (void *data, int argc, char **argv) int
option_option(void *data, int argc, char **argv)
{ {
if (!data) if (!data)
return 0; return 0;
struct option *opts = (struct option *)data; struct option *opts = (struct option *)data;
for (int k=0; opts[k].name; k++) for (int k = 0; opts[k].name; k++)
opts[k].set = 0; opts[k].set = 0;
for (int i=1; i<argc; i++) { for (int i = 1; i < argc; i++) {
int found = 0; int found = 0;
for (int k=0; opts[k].name; k++) { for (int k = 0; opts[k].name; k++) {
if (str_cmp(opts[k].name, argv[i])) if (str_cmp(opts[k].name, argv[i]))
continue; continue;
@@ -70,9 +72,9 @@ int option_option (void *data, int argc, char **argv)
return -1; return -1;
} }
int ret = opts[k].call(opts[k].data, argc-i, &argv[i]); int ret = opts[k].call(opts[k].data, argc - i, &argv[i]);
if (ret<0) if (ret < 0)
return -1; return -1;
opts[k].set = 1; opts[k].set = 1;
@@ -83,29 +85,30 @@ int option_option (void *data, int argc, char **argv)
} }
if (!found) if (!found)
return i-1; return i - 1;
} }
return argc; return argc;
} }
static int option_usage (struct option *opts, int slen) static int
option_usage(struct option *opts, int slen)
{ {
if (!opts) if (!opts)
return 0; return 0;
int len = 0; int len = 0;
for (int k=0; opts[k].name; k++) { for (int k = 0; opts[k].name; k++) {
if (len>40) { if (len > 40) {
gt_print("\n%*s", slen, ""); gt_print("\n%*s", slen, "");
len = 0; len = 0;
} }
len += gt_print(" [%s", opts[k].name); len += gt_print(" [%s", opts[k].name);
if (opts[k].call==option_option) { if (opts[k].call == option_option) {
len += option_usage((struct option *)opts[k].data, slen+len); len += option_usage((struct option *)opts[k].data, slen + len);
} else { } else {
len += gt_print(" ARG"); len += gt_print(" ARG");
} }
@@ -116,21 +119,22 @@ static int option_usage (struct option *opts, int slen)
return len; return len;
} }
int option (struct option *opts, int argc, char **argv) int
option(struct option *opts, int argc, char **argv)
{ {
int ret = option_option(opts, argc, argv); int ret = option_option(opts, argc, argv);
if (ret==argc) if (ret == argc)
return 0; return 0;
if (ret<0 || ret+1>=argc) if (ret < 0 || ret + 1 >= argc)
return 1; return 1;
gt_print("option `%s' is unknown\n", argv[ret+1]); gt_print("option `%s' is unknown\n", argv[ret + 1]);
int slen = gt_print("usage: %s", argv[0]); int slen = gt_print("usage: %s", argv[0]);
if (slen>40) { if (slen > 40) {
slen = 12; slen = 12;
gt_print("\n%*s", slen, ""); gt_print("\n%*s", slen, "");
} }

75
src/str.h Normal file
View File

@@ -0,0 +1,75 @@
#pragma once
#include "common.h"
static inline size_t
str_cpy(char *restrict dst, const char *restrict src, size_t len)
{
if (!dst || !src)
return 0;
size_t i;
for (i = 0; i < len && src[i]; i++)
dst[i] = src[i];
dst[i] = 0;
return i;
}
_pure_ static inline int
str_empty(const char *restrict str)
{
return !str || !str[0];
}
_pure_ static inline size_t
str_cmp(const char *restrict sa, const char *restrict sb)
{
if (!sa || !sb)
return 1;
size_t i = 0;
while (sa[i] == sb[i])
if (!sa[i++])
return 0;
return i + 1;
}
_pure_ static inline size_t
str_len(const char *restrict str)
{
if (!str)
return 0;
return strlen(str);
}
static inline char *
str_cat(const char **strs, size_t count)
{
size_t size = 1;
for (size_t i = 0; i < count; i++)
size += str_len(strs[i]);
char *str = malloc(size);
if (!str)
return NULL;
char *p = str;
for (size_t i = 0; i < count; i++) {
size_t len = str_len(strs[i]);
memcpy(p, strs[i], len);
p += len;
}
p[0] = 0;
return str;
}

278
src/tun.c
View File

@@ -1,168 +1,203 @@
#include "common-static.h" #include "common.h"
#include "ip-static.h"
#include "ip.h"
#include "str.h"
#include "tun.h" #include "tun.h"
#include <stdio.h>
#include <fcntl.h> #include <fcntl.h>
#include <stdio.h>
#include <sys/ioctl.h> #include <sys/ioctl.h>
#include <sys/socket.h> #include <sys/socket.h>
#include <sys/uio.h> #include <sys/uio.h>
#include <net/if.h>
#ifdef __linux__ #ifdef __linux__
# include <linux/if.h> #define IFF_TUN 0x0001
# include <linux/if_tun.h> #define IFF_NO_PI 0x1000
#define TUNSETIFF _IOW('T', 202, int)
#define TUNSETPERSIST _IOW('T', 203, int)
#endif #endif
#ifdef __APPLE__ #ifdef __APPLE__
# include <sys/sys_domain.h> #include <net/if_utun.h>
# include <sys/kern_control.h> #include <sys/kern_control.h>
# include <net/if_utun.h> #include <sys/sys_domain.h>
#endif #endif
#if defined(__APPLE__) || defined(__OpenBSD__) #if defined(__APPLE__) || defined(__OpenBSD__)
# define GT_BSD_TUN 1 #define GT_BSD_TUN
#endif #endif
#ifdef __linux__ #ifdef __APPLE__
int tun_create (char *name, int multiqueue)
{
int fd = open("/dev/net/tun", O_RDWR);
if (fd<0) { static int
perror("open /dev/net/tun"); tun_create_by_id(char *name, size_t size, unsigned id)
{
int fd = socket(PF_SYSTEM, SOCK_DGRAM, SYSPROTO_CONTROL);
if (fd == -1)
return -1;
struct ctl_info ci;
memset(&ci, 0, sizeof(ci));
str_cpy(ci.ctl_name, UTUN_CONTROL_NAME, sizeof(ci.ctl_name) - 1);
if (ioctl(fd, CTLIOCGINFO, &ci)) {
int err = errno;
close(fd);
errno = err;
return -1; return -1;
} }
struct ifreq ifr = { struct sockaddr_ctl sc = {
.ifr_flags = IFF_TUN|IFF_NO_PI, .sc_id = ci.ctl_id,
.sc_len = sizeof(sc),
.sc_family = AF_SYSTEM,
.ss_sysaddr = AF_SYS_CONTROL,
.sc_unit = id + 1,
}; };
if (multiqueue) { if (connect(fd, (struct sockaddr *)&sc, sizeof(sc))) {
#ifdef IFF_MULTI_QUEUE int err = errno;
ifr.ifr_flags |= IFF_MULTI_QUEUE; close(fd);
#else errno = err;
gt_na("IFF_MULTI_QUEUE");
#endif
}
str_cpy(ifr.ifr_name, name, IFNAMSIZ-1);
int ret = ioctl(fd, TUNSETIFF, &ifr);
if (ret<0) {
perror("ioctl TUNSETIFF");
return -1; return -1;
} }
gt_log("tun name: %s\n", ifr.ifr_name); snprintf(name, size, "utun%u", id);
return fd; return fd;
} }
#elif defined(__APPLE__)
int tun_create (_unused_ char *name, _unused_ int mq) static int
tun_create_by_name(char *name, size_t size, char *dev_name)
{ {
for (unsigned dev_id = 0; dev_id < 32; dev_id++) { unsigned id = 0;
struct ctl_info ci;
byte_set(&ci, 0, sizeof(ci)); if (sscanf(dev_name, "utun%u", &id) != 1) {
str_cpy(ci.ctl_name, UTUN_CONTROL_NAME, sizeof(ci.ctl_name)-1); errno = EINVAL;
return -1;
int fd = socket(PF_SYSTEM, SOCK_DGRAM, SYSPROTO_CONTROL);
if (fd==-1)
return -1;
if (ioctl(fd, CTLIOCGINFO, &ci)==-1) {
close(fd);
continue;
}
struct sockaddr_ctl sc = {
.sc_id = ci.ctl_id,
.sc_len = sizeof(sc),
.sc_family = AF_SYSTEM,
.ss_sysaddr = AF_SYS_CONTROL,
.sc_unit = dev_id+1,
};
if (connect(fd, (struct sockaddr *)&sc, sizeof(sc))==-1) {
close(fd);
continue;
}
gt_log("tun name: /dev/utun%u\n", dev_id);
return fd;
} }
return -1; return tun_create_by_id(name, size, id);
} }
#else
int tun_create (_unused_ char *name, _unused_ int mq) #else /* not __APPLE__ */
#ifdef __linux__
static int
tun_create_by_name(char *name, size_t size, char *dev_name)
{ {
for (unsigned dev_id = 0; dev_id < 32; dev_id++) { int fd = open("/dev/net/tun", O_RDWR);
char dev_path[11];
snprintf(dev_path, sizeof(dev_path), "/dev/tun%u", dev_id); if (fd == -1)
return -1;
int fd = open(dev_path, O_RDWR); struct ifreq ifr = {
.ifr_flags = IFF_TUN | IFF_NO_PI,
};
if (fd==-1) str_cpy(ifr.ifr_name, dev_name, IFNAMSIZ - 1);
continue;
gt_log("tun name: %s\n", dev_path); if (ioctl(fd, TUNSETIFF, &ifr)) {
close(fd);
return fd; return -1;
} }
return -1; str_cpy(name, ifr.ifr_name, size - 1);
return fd;
} }
#else /* not __linux__ not __APPLE__ */
static int
tun_create_by_name(char *name, size_t size, char *dev_name)
{
char path[64];
snprintf(path, sizeof(path), "/dev/%s", dev_name);
str_cpy(name, dev_name, size - 1);
return open(path, O_RDWR);
}
#endif /* not __APPLE__ */
static int
tun_create_by_id(char *name, size_t size, unsigned id)
{
char dev_name[64];
snprintf(dev_name, sizeof(dev_name), "tun%u", id);
return tun_create_by_name(name, size, dev_name);
}
#endif #endif
ssize_t tun_read (int fd, void *data, size_t size) int
tun_create(char *dev_name, char **ret_name)
{
char name[64] = {0};
int fd = -1;
if (str_empty(dev_name)) {
for (unsigned id = 0; id < 32 && fd == -1; id++)
fd = tun_create_by_id(name, sizeof(name), id);
} else {
fd = tun_create_by_name(name, sizeof(name), dev_name);
}
if (fd != -1 && ret_name)
*ret_name = strdup(name);
return fd;
}
int
tun_read(int fd, void *data, size_t size)
{ {
if (!size) if (!size)
return -1; return 0;
#ifdef GT_BSD_TUN #ifdef GT_BSD_TUN
uint32_t family; uint32_t family;
struct iovec iov[2] = { struct iovec iov[2] = {
{ .iov_base = &family, .iov_len = sizeof(family) }, {
{ .iov_base = data, .iov_len = size } .iov_base = &family,
.iov_len = sizeof(family),
},
{
.iov_base = data,
.iov_len = size,
},
}; };
ssize_t ret = readv(fd, iov, 2); ssize_t ret = readv(fd, iov, 2);
#else
ssize_t ret = read(fd, data, size);
#endif
if (ret==-1) { if (ret <= (ssize_t)0)
if (errno==EAGAIN || errno==EINTR) return ret;
return -1;
if (errno) if (ret <= (ssize_t)sizeof(family))
perror("tun read");
return 0;
}
#ifdef GT_BSD_TUN
if (ret<(ssize_t) sizeof(family))
return 0; return 0;
return ret-sizeof(family); return ret - sizeof(family);
#else #else
return ret; return read(fd, data, size);
#endif #endif
} }
ssize_t tun_write (int fd, const void *data, size_t size) int
tun_write(int fd, const void *data, size_t size)
{ {
if (!size) if (!size)
return -1; return 0;
#ifdef GT_BSD_TUN #ifdef GT_BSD_TUN
uint32_t family; uint32_t family;
@@ -175,35 +210,42 @@ ssize_t tun_write (int fd, const void *data, size_t size)
family = htonl(AF_INET6); family = htonl(AF_INET6);
break; break;
default: default:
errno = EINVAL;
return -1; return -1;
} }
struct iovec iov[2] = { struct iovec iov[2] = {
{ .iov_base = &family, .iov_len = sizeof(family) }, {
{ .iov_base = (void *) data, .iov_len = size }, .iov_base = &family,
.iov_len = sizeof(family),
},
{
.iov_base = (void *)data,
.iov_len = size,
},
}; };
ssize_t ret = writev(fd, iov, 2); ssize_t ret = writev(fd, iov, 2);
#else
ssize_t ret = write(fd, data, size);
#endif
if (ret==-1) { if (ret <= (ssize_t)0)
if (errno==EAGAIN || errno==EINTR) return ret;
return -1;
if (errno) if (ret <= (ssize_t)sizeof(family))
perror("tun write");
return 0;
}
#ifdef GT_BSD_TUN
if (ret<(ssize_t) sizeof(family))
return 0; return 0;
return ret-sizeof(family); return ret - sizeof(family);
#else #else
return ret; return write(fd, data, size);
#endif
}
int
tun_set_persist(int fd, int on)
{
#ifdef TUNSETPERSIST
return ioctl(fd, TUNSETPERSIST, on);
#else
errno = ENOSYS;
return -1;
#endif #endif
} }

View File

@@ -1,7 +1,6 @@
#pragma once #pragma once
#include <unistd.h> int tun_create (char *, char **);
int tun_read (int, void *, size_t);
int tun_create (char *, int); int tun_write (int, const void *, size_t);
ssize_t tun_read (int, void *, size_t); int tun_set_persist (int, int);
ssize_t tun_write (int, const void *, size_t);

View File

@@ -0,0 +1,10 @@
[Match]
Name=gtc-*
[Network]
Description=Glorytun client device
DHCP=ipv4
[DHCP]
CriticalConnection=yes
RouteTable=200

37
systemd/glorytun-run Executable file
View File

@@ -0,0 +1,37 @@
#!/bin/sh
set -e
if [ ! -f "$1" ]; then
echo "usage: $(basename "$0") FILE"
exit 1
fi
. "$(readlink -f "$1")"
DEV="gt${HOST:+c}-$(basename "$1")"
# Setting BIND is like going to 'expert mode'
# This helper is pretty stupid and still needs some work
if [ -n "$HOST" ]; then
if [ -z "$PREF" ]; then
PREF=$(ip rule | awk '/from all lookup main/{print $1; exit}' | tr -d :)
PREF=$((PREF-1))
fi
if [ -z "$BIND" ]; then
BIND=$(ip route get "$HOST" | awk '/src/{getline;print $0}' RS=' ')
ip rule add from "$BIND" table main pref "$((PREF-1))" || true
fi
ip rule add from all table 200 pref "$PREF" || true
fi
exec glorytun \
v4only \
keyfile "$1".key \
dev "$DEV" \
${HOST:+host "$HOST"} \
${PORT:+port "$PORT"} \
${BIND:+bind "$BIND"} \
${BIND_PORT:+bind-port "$BIND_PORT"} \
${MTU:+mtu "$MTU"} \
${MTU_AUTO:+mtu-auto}

41
systemd/glorytun-setup Executable file
View File

@@ -0,0 +1,41 @@
#!/bin/sh
set -e
_ask() {
printf "%s: " "$1"
read -r "$2"
}
_ask "Config filename (tun0)" NAME
NAME=${NAME:-tun0}
if [ -f /etc/glorytun/"$NAME" ]; then
echo "This config already exit!"
exit 1
fi
_ask "Server ip (enter for server conf)" HOST
_ask "Server key (enter to generate a new one)" KEY
if [ -z "$KEY" ]; then
KEY=$(glorytun keygen)
echo "Your new key: $KEY"
fi
# install files
mkdir -p /etc/glorytun
cat > /etc/glorytun/"$NAME" <<EOF
${HOST:+HOST="$HOST"}
MTU_AUTO=yes
EOF
( umask 077; echo "$KEY" > /etc/glorytun/"$NAME".key )
# start services
_ask "Start glorytun now ? (enter to skip)" START
case "$START" in y*|Y*)
systemctl restart systemd-networkd
systemctl start glorytun@"$NAME" ;;
esac

14
systemd/glorytun.network Normal file
View File

@@ -0,0 +1,14 @@
[Match]
Name=gt-*
[Network]
Description=Glorytun server device
Address=0.0.0.0/24
DHCPServer=yes
IPMasquerade=yes
[DHCPServer]
PoolOffset=2
PoolSize=1
EmitDNS=yes
DNS=9.9.9.9

View File

@@ -0,0 +1,12 @@
[Unit]
Description=Glorytun on %I
After=network.target
[Service]
Type=simple
Restart=always
ExecStart=@bindir@/glorytun-run /etc/glorytun/%i
CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_RAW
[Install]
WantedBy=multi-user.target

View File

@@ -1,9 +1,13 @@
#!/bin/sh #!/bin/sh
[ -z "${VERSION}" ] && VERSION=`git describe --tags --always 2>/dev/null` \ [ -z "${VERSION}" ] && VERSION=`git describe --tags --match='v[0-9].*' 2>/dev/null` \
&& VERSION=${VERSION#v} && VERSION=${VERSION#v}
[ -z "${VERSION}" ] && VERSION=`basename \`pwd\`` \ [ -z "${VERSION}" ] && VERSION=`cat VERSION 2>/dev/null`
&& VERSION=${VERSION#*-}
echo -n ${VERSION} [ -z "${VERSION}" ] && VERSION=0.0.0
[ "$1" = "major" ] && printf ${VERSION%%.*} \
&& exit 0
printf ${VERSION} | tee VERSION