aboutsummaryrefslogtreecommitdiffstats
path: root/common.h (unfollow)
Commit message (Collapse)AuthorFilesLines
2019-12-11Use siphash for hashtablesThomas Gschwantner8-18/+315
2019-12-11Allow /32 and /128 to be omitted in ip= keysThomas Gschwantner1-12/+15
2019-12-11radix-trie: fix add() when no poolnodes existThomas Gschwantner1-0/+5
2019-12-11Properly send and display wg_errno and errmsgThomas Gschwantner4-21/+54
2019-12-11Change request_ip protocolThomas Gschwantner4-42/+29
ipv4 and ipv6 keys have been combined into one common key, ip. To distinguish between multiple IPs in later versions ip=0.0.0.0/32 and ip=::/128 respectively now mean we want to be assigned a random address from the server. Releasing/not wanting an IP is now done by just not listing that IP, i.e. if we only wanted an (random) ipv4 address the request would look as follows: request_ip=1 ip=0.0.0.0/32
2019-12-11Postpone freeing memory for leases until after updating allowedipsLinus Nordberg1-25/+19
Changing struct allowedips_update to hold pointers to addresses introduced a use after free bug. Take the opportunity to keep one pointer instead of three.
2019-12-11radix-trie: implement ipp_removepool_v{4,6}Thomas Gschwantner3-10/+109
2019-12-11radix-trie: fix issues related to shadow-/countingThomas Gschwantner1-106/+144
Previously it was possible that pools would not be correctly shadowed and/or the left or right counters were not updated properly. To fix that, every node now has flags indicating what type of node it is, and if it's shadowed. Furthermore, We determine if a poolnode needs to be (un)shadowed by walking the trie now. remove_node() now also only modifies the left right counters if the target node was actually found.
2019-12-11radix-trie: fix bug where /64 pools would overflowThomas Gschwantner1-10/+8
2019-12-11Fix parsing issue with split messagesThomas Gschwantner2-17/+18
Previously this would trigger a BUG_ON() since the calculation of length & offset was wrong since we added the previous part of the buffer (req->buf) in parse_request(). This meant handle_request() couldn't know how much bytes where actually left in the buffer or their offset.
2019-12-11radix-trie: allow full use of the v4 address spaceThomas Gschwantner3-5/+5
2019-12-11Rename struct ip_pool to be more descriptiveThomas Gschwantner3-101/+102
2019-12-11Fix random_bounded() to always be in [0, bound)Thomas Gschwantner3-15/+19
Previously random_bounded(1) would return values in [0, 1], while values > 1 would return [0, bound).
2019-12-11Fixup client, including a lot of refactoringThomas Gschwantner4-364/+197
2019-12-11Extract all RTNETLINK code into ipm.{c,h}Thomas Gschwantner6-128/+263
2019-12-11Serialize/deserialize messages into a structThomas Gschwantner3-301/+331
Instead of a list of attributes, parse messages into a proper struct to avoid duplicating code in the server/client for handling this list, as well as making parsing nicer in general.
2019-12-11Don't validate RTA_GATEWAY and fix an error stringLinus Nordberg1-8/+1
2019-12-11Stop passing devname and ifindex aroundLinus Nordberg3-25/+28
2019-12-11Ignore routes not for the wg interfaceLinus Nordberg3-9/+31
Adding 127.0.0.0/8 (lo) for example is not what we want. Didn't happen in tests/netsh.sh because the use of network namespaces.
2019-12-11server: restore leases from allowedips at startupLinus Nordberg2-1/+191
2019-12-11server: add --leasetime as a commandline optionLinus Nordberg3-8/+37
2019-12-11lease: handle allowedips updates and improve APILinus Nordberg4-136/+229
2019-09-27Fix typo in the previous commits NULL checkLinus Nordberg1-1/+1
2019-09-10Fix incorrect use of pubkey ptr in new_lease()Thomas Gschwantner1-3/+16
Before this, leases_ht would store the (temporary) pointer to pubkey that's given to new_lease() directly. The memory it's pointing to is overwritten as soon as a new connection comes in however and thus breaking the hashtable. Instead make our own copy of the pubkey and store the pointer to that.
2019-08-21Fix build issue that occurs on gcc debian 6.3.0-18Thomas Gschwantner1-1/+5
CC lease.o In file included from /usr/include/arpa/inet.h:22:0, from lease.c:3: lease.c: In function 'new_lease': lease.c:93:30: error: 'const struct in6_addr' has no member named 's6_addr32' bool wants_ipv6 = !ipv6 || !IN6_IS_ADDR_UNSPECIFIED(ipv6); ^ lease.c:93:30: error: 'const struct in6_addr' has no member named 's6_addr32' bool wants_ipv6 = !ipv6 || !IN6_IS_ADDR_UNSPECIFIED(ipv6); ^ lease.c:93:30: error: 'const struct in6_addr' has no member named 's6_addr32' bool wants_ipv6 = !ipv6 || !IN6_IS_ADDR_UNSPECIFIED(ipv6); ^ lease.c:93:30: error: 'const struct in6_addr' has no member named 's6_addr32' bool wants_ipv6 = !ipv6 || !IN6_IS_ADDR_UNSPECIFIED(ipv6); ^ lease.c: In function 'leases_refresh': lease.c:213:10: error: 'const struct in6_addr' has no member named 's6_addr32' if (!IN6_IS_ADDR_UNSPECIFIED(ipv6)) ^ lease.c:213:10: error: 'const struct in6_addr' has no member named 's6_addr32' if (!IN6_IS_ADDR_UNSPECIFIED(ipv6)) ^ lease.c:213:10: error: 'const struct in6_addr' has no member named 's6_addr32' if (!IN6_IS_ADDR_UNSPECIFIED(ipv6)) ^ lease.c:213:10: error: 'const struct in6_addr' has no member named 's6_addr32' if (!IN6_IS_ADDR_UNSPECIFIED(ipv6)) ^ <builtin>: recipe for target 'lease.o' failed make: *** [lease.o] Error 1
2019-08-20Improve error handling and serializationThomas Gschwantner3-88/+88
2019-08-20Don't build wg-dynamic-client until it's fixedThomas Gschwantner1-1/+1
2019-08-17Initialize pools from routes via netlinkThomas Gschwantner5-29/+191
2019-08-02radix-trie: implement pool shadowingThomas Gschwantner2-27/+60
Pools are created from routes which can overlap. Consider the following: ip route add 192.168.4.0/28 ip route add 192.168.4.0/24 sleep 3600 ip route del 192.168.4.0/24 Here, the pool created from the first route is being shadowed by the pool from the second route. However, since the second pool is later removed again we cannot simply combine them. So instead this commit shadows them, to avoid them being double counted.
2019-07-18Move counting logic from lease.c to radix-trie.cThomas Gschwantner3-108/+94
2019-07-18Implement lease expirationThomas Gschwantner8-36/+120
2019-07-16radix-trie: inline find_node() into ipp_addpool()Thomas Gschwantner1-16/+8
The way find_node() was written to suit ipp_addpool() means it's not really generic and rather confusing, so we inline it instead.
2019-06-14Use epoll() instead of poll()Thomas Gschwantner4-123/+143
This enables us to later use the timeout parameter of epoll_wait() to timely remove expired leases.
2019-06-14Remove CLOCK_MONOTONIC commentThomas Gschwantner1-4/+0
The CLOCK_MONOTONIC change was reverted: https://git.kernel.org/torvalds/c/a3ed0e43
2019-06-14Fix use-after-free and memory leak in ipp_free()Thomas Gschwantner1-14/+11
2019-06-14Add missing #include in netlink.hThomas Gschwantner1-0/+1
2019-06-13Don't overwrite peer changes by othersThomas Gschwantner1-46/+28
2019-06-12Implement basic lease managementThomas Gschwantner10-162/+536
2019-06-02radix-trie: implement ipp_addrnd_* and relatedThomas Gschwantner2-70/+328
2019-06-02Add BUG() and BUG_ON()Thomas Gschwantner2-1/+4
2019-06-02radix-trie: allow both ipv4 and ipv6 debug outputThomas Gschwantner2-12/+30
2019-06-02radix-trie: fix fls/fls64Thomas Gschwantner1-6/+6
2019-06-02radix-trie: remove bits arg from radix_insert_v4/6Thomas Gschwantner2-6/+6
2019-06-02Use hashtable to match ll-ip with pubkeyThomas Gschwantner2-31/+661
The link-local IP is always /128, so using a hashtable is more appropriate here. We only use the lower 64 bits as key, since the first 64 bits of link-local addresses are always the same.
2019-05-26Sleep lessLinus Nordberg1-3/+5
Only sleep after failed try_connect(), because it might fail quickly. The read should be blocking for 1s (SO_RCVTIMEO).
2019-05-26Use blocking I/O in clientLinus Nordberg1-119/+39
Avoiding the unnecessary complexity of non-blocking I/O.
2019-05-26No need to clear bits in pollfd reventsLinus Nordberg2-5/+0
POSIX says: "In each pollfd structure, poll() shall clear the revents member, except that where the application requested a report on a condition by setting one of the bits of events listed above, poll() shall set the corresponding bit in revents if the requested condition is true."
2019-05-26Fix backwards logic in debug loggingLinus Nordberg1-2/+2
2019-05-26Implement client sending ip-request and configuring interfaceLinus Nordberg3-24/+521
2019-05-26Implement faked allocations, server sideLinus Nordberg3-104/+433
Reject clients not connecting from an IPv6 address. Reject clients not connecting from the correct port. Fake address allocation. Update allowed-ips with leases handed out. Send response messages. Extend protocol to include lease start and lease time, errno and errmsg. Move common code to common.[ch].