]> git.meshlink.io Git - meshlink/log
meshlink
7 years agoRemove debug messages incorrectly marked as warnings.
Guus Sliepen [Sun, 25 Jun 2017 15:12:42 +0000 (17:12 +0200)]
Remove debug messages incorrectly marked as warnings.

7 years agoUpdate the C++ header file.
Guus Sliepen [Fri, 11 Mar 2016 15:17:00 +0000 (16:17 +0100)]
Update the C++ header file.

7 years agoAdd the meshlink_get_port() and meshlink_set_port() functions.
Guus Sliepen [Fri, 11 Mar 2016 15:10:55 +0000 (16:10 +0100)]
Add the meshlink_get_port() and meshlink_set_port() functions.

The latter can be used to change the port on which MeshLink
listens. It may only be called when the mesh is not running.

7 years agoAdd modify_config_file() to allow overwriting existing configuration values.
Guus Sliepen [Fri, 11 Mar 2016 15:01:24 +0000 (16:01 +0100)]
Add modify_config_file() to allow overwriting existing configuration values.

7 years agoFix processing of mixed ID and SPTPS data.
Guus Sliepen [Sun, 25 Jun 2017 14:32:15 +0000 (16:32 +0200)]
Fix processing of mixed ID and SPTPS data.

When making a connection with another peer, the ID message and the first
SPTPS data is sent using separate send() calls, but they can be merged
along the way to the other side. When receiving the ID message, we
accidentily discarded the rest of the received packet. Handle this
properly.

The problem was found to trigger much more often on Linux kernel 4.4 in
KVM.

7 years agoAdd meshlink_get_external_address() and meshlink_add_external_address().
Guus Sliepen [Fri, 11 Mar 2016 11:08:48 +0000 (12:08 +0100)]
Add meshlink_get_external_address() and meshlink_add_external_address().

These functions try to discover the local node's external address by
contacting the meshlink.io server. The get function just returns the
discovered address as a string, the add function adds it as an Address,
so it will end up in the list of addresses when calling
meshlink_export().

7 years agoUse free_known_addresses() to free memory allocated by get_known_addresses().
Guus Sliepen [Thu, 17 Dec 2015 17:44:21 +0000 (18:44 +0100)]
Use free_known_addresses() to free memory allocated by get_known_addresses().

We know what struct addrinfo looks like, but the standard says nothing about
how it is allocated. So we cannot trust freeaddrinfo() to work correctly on
the struct addrinfo list we allocated ourselves in get_known_addresses().
To make a distinction by allocations from the latter and from str2addrinfo(),
we keep two pointers (*ai and *aip) in struct outgoing, and use the freeing
function that is appropriate for each.

7 years agoFix resource leaks found by cppcheck.
Guus Sliepen [Sun, 15 Nov 2015 16:18:37 +0000 (17:18 +0100)]
Fix resource leaks found by cppcheck.

7 years agoMake repeated calls to meshlink_start() without meshlink_stop() safe.
Guus Sliepen [Fri, 13 Nov 2015 08:51:39 +0000 (08:51 +0000)]
Make repeated calls to meshlink_start() without meshlink_stop() safe.

7 years agoFix race condition when calling meshlink_stop() immediately after meshlink_start().
Guus Sliepen [Fri, 13 Nov 2015 08:50:45 +0000 (08:50 +0000)]
Fix race condition when calling meshlink_stop() immediately after meshlink_start().

The event loop didn't react to event_loop_stop() if it wasn't started yet
(because that is done in mesh->thread). The solution is to add a
event_loop_start() function that is to be called by meshlink_start().

7 years agoSend a UDP packet to ourself instead of doing a dummy connect().
Guus Sliepen [Sat, 7 Nov 2015 22:48:37 +0000 (22:48 +0000)]
Send a UDP packet to ourself instead of doing a dummy connect().

This is simpler, hopefully with less chance of failing.

7 years agoFix check for succesful opening of UDP ports.
Guus Sliepen [Sat, 7 Nov 2015 22:24:48 +0000 (22:24 +0000)]
Fix check for succesful opening of UDP ports.

7 years agoFix meshlink_stop() on Mac OS X.
Guus Sliepen [Fri, 6 Nov 2015 22:33:58 +0000 (23:33 +0100)]
Fix meshlink_stop() on Mac OS X.

Mac OS X doesn't like shutdown(SHUT_RDWR) on listening sockets, and also
doesn't allow reopening a listening socket right after closing the
previous one on the same port. So avoid the whole business of closing
and reopening sockets by stopping the event loop and then doing a dummy
connect() to ourself to ensure select() in the network thread returns
immediately.

# Conflicts:
# src/meshlink.c

7 years agomeshlink_start() now fails when the listening socket could not be opened.
Guus Sliepen [Fri, 6 Nov 2015 21:56:34 +0000 (22:56 +0100)]
meshlink_start() now fails when the listening socket could not be opened.

7 years agoLibtool wants AM_PROG_AR.
Guus Sliepen [Fri, 6 Nov 2015 21:53:57 +0000 (22:53 +0100)]
Libtool wants AM_PROG_AR.

7 years agoAdd meshlink_get_self().
Guus Sliepen [Wed, 28 Oct 2015 21:57:49 +0000 (22:57 +0100)]
Add meshlink_get_self().

This returns a handle for the local node. This can also be used to determine
our own name using meshlink_get_self(mesh)->name.

7 years agoFix the basicpp test.
Guus Sliepen [Wed, 28 Oct 2015 21:06:52 +0000 (22:06 +0100)]
Fix the basicpp test.

7 years agoAdd a function to destroy a MeshLink instance.
Guus Sliepen [Wed, 28 Oct 2015 21:06:21 +0000 (22:06 +0100)]
Add a function to destroy a MeshLink instance.

This will remove all configuration files related to a MeshLink instance.

7 years agoFix incorrect SPTPS session labels.
Guus Sliepen [Mon, 26 Oct 2015 22:06:53 +0000 (23:06 +0100)]
Fix incorrect SPTPS session labels.

To prevent a MITM from being able to splice different SPTPS sessions
together, each session has a unique label. snprintf() was used to fill a
buffer with the label, however the buffer was not big enough for the whole
label. Linux made sure the last byte of the buffer was a NUL character,
Windows did not, resulting in the two unable to connect to each other.

7 years agoDouble the default size of the replay window in SPTPS.
Guus Sliepen [Thu, 15 Oct 2015 11:27:18 +0000 (13:27 +0200)]
Double the default size of the replay window in SPTPS.

7 years agoRemove unused replay window and RTT/bandwidth estimation code.
Guus Sliepen [Thu, 15 Oct 2015 11:26:31 +0000 (13:26 +0200)]
Remove unused replay window and RTT/bandwidth estimation code.

The replay window handling is done by SPTPS. The replaywin member of node_t
was not used at all. Somehwat related, there was RTT and bandwidth
estimation code that didn't work anymore and is not used anyway.

7 years agoDetermine the local node's address(es) and add them to its host config file.
Guus Sliepen [Tue, 13 Oct 2015 12:14:08 +0000 (14:14 +0200)]
Determine the local node's address(es) and add them to its host config file.

Use the "UDP connect() to an external IP address" trick to determine the
local node's addresses in a platform independent way, without sending any
actual packets. Do this at meshlink_open() time, so the application has
immediate access to them when calling meshlink_export().

7 years agoDon't append duplicate entries to configuration files.
Guus Sliepen [Tue, 13 Oct 2015 12:12:13 +0000 (14:12 +0200)]
Don't append duplicate entries to configuration files.

Automatically detected addresses are appended to host config files by
Catta. However, it doesn't check whether the address is already known.
Have append_config_file() check that it doesn't write duplicate entries.

7 years agoFix a memory leak when retrying outgoing connections.
Guus Sliepen [Fri, 9 Oct 2015 20:47:55 +0000 (22:47 +0200)]
Fix a memory leak when retrying outgoing connections.

When retry_outgoing_handler() calls setup_outgoing_connection(), it can
be that the old configuration is still in memory. So clean that up
before reading in new configuration data.

7 years agoIgnore address hints for our local node.
Guus Sliepen [Wed, 21 Jun 2017 20:57:34 +0000 (22:57 +0200)]
Ignore address hints for our local node.

Catta also sees itself, which causes MeshLink to add address hints for
its own node. That causes link-local addresses to be added. When calling
meshlink_invite(), the first link-local address would then be used for
the invitation URL, which is not desirable.

9 years agofix for autoconnect (prevent ping pong)
Niklas Hofmann [Sat, 27 Dec 2014 14:02:33 +0000 (15:02 +0100)]
fix for autoconnect (prevent ping pong)

9 years agoReturn an appropriate value from channel_accept.
Aaron Krebs [Tue, 2 Dec 2014 16:39:18 +0000 (17:39 +0100)]
Return an appropriate value from channel_accept.

9 years agoCheck in trampoline callbacks that mesh instance is not destructed.
Aaron Krebs [Tue, 2 Dec 2014 16:24:05 +0000 (17:24 +0100)]
Check in trampoline callbacks that mesh instance is not destructed.

9 years agoUpdate UTCP to the latest commit, which changes the return value of utcp_timeout().
Guus Sliepen [Fri, 5 Dec 2014 21:30:14 +0000 (22:30 +0100)]
Update UTCP to the latest commit, which changes the return value of utcp_timeout().

Conflicts:
src/utcp

9 years agoMake echo-fork handle arbitrary long streams of data.
Guus Sliepen [Fri, 5 Dec 2014 21:28:21 +0000 (22:28 +0100)]
Make echo-fork handle arbitrary long streams of data.

9 years agoCall stop in close, as stated in documentation.
Aaron Krebs [Fri, 5 Dec 2014 15:18:46 +0000 (16:18 +0100)]
Call stop in close, as stated in documentation.

9 years agoUpdated echo-fork test program.
Aaron Krebs [Thu, 4 Dec 2014 13:14:04 +0000 (14:14 +0100)]
Updated echo-fork test program.

9 years agoCleaned up test example.
Aaron Krebs [Wed, 3 Dec 2014 21:32:10 +0000 (22:32 +0100)]
Cleaned up test example.

9 years agoTest case for sending large messages.
Aaron Krebs [Wed, 3 Dec 2014 21:10:21 +0000 (22:10 +0100)]
Test case for sending large messages.

9 years agofix private key file read and write on windows (binary read/write)
Niklas Hofmann [Thu, 4 Dec 2014 20:59:52 +0000 (21:59 +0100)]
fix private key file read and write on windows (binary read/write)

9 years agoMake sure header src and dst are always null-terminated.
Aaron Krebs [Mon, 1 Dec 2014 15:52:54 +0000 (16:52 +0100)]
Make sure header src and dst are always null-terminated.

9 years agohack to wait for SPTPS to complete before opening a channel
Sven M. Hallberg [Thu, 6 Nov 2014 17:39:33 +0000 (18:39 +0100)]
hack to wait for SPTPS to complete before opening a channel

9 years agoadd more and timestamped debug output to channels test
Sven M. Hallberg [Thu, 6 Nov 2014 17:38:27 +0000 (18:38 +0100)]
add more and timestamped debug output to channels test

9 years agolog incoming packet payload as hex (not verbatim)
Sven M. Hallberg [Thu, 6 Nov 2014 17:35:12 +0000 (18:35 +0100)]
log incoming packet payload as hex (not verbatim)

9 years agomingw compatibility
Niklas Hofmann [Thu, 20 Nov 2014 23:20:50 +0000 (00:20 +0100)]
mingw compatibility

9 years agoIn case two nodes start a SPTPS session simultaneously, deterministically choose...
Guus Sliepen [Tue, 18 Nov 2014 21:03:12 +0000 (22:03 +0100)]
In case two nodes start a SPTPS session simultaneously, deterministically choose one to succeed.

This fixes the problem where two nodes send a REQ_KEY to each other
simultaneously, which causes both of them to drop their current state
and respond to the other's REQ_KEY with an ANS_KEY, which won't succeed
any more because both of them forgot that state.

9 years agotest/channel: don't let both sides connect to each other simultaneously.
Guus Sliepen [Fri, 7 Nov 2014 23:53:58 +0000 (23:53 +0000)]
test/channel: don't let both sides connect to each other simultaneously.

The channel test fails to work reliably when the two threads are started
exactly simultaneously and both sides try to connect to each other. Both
sides simultaneously initiate a end-to-end SPTPS connection by sending
the appropriate req_key request, but upon reception of each others
request they reset their own state, causing SPTPS packets from the old
and the new state to cross each other. A timeout will occur eventually,
causing one side to try to restart the SPTPS connection. Since the
timeouts are slightly randomized, this sometimes causes the channel test
to work, sometimes not.

9 years agoUse strncpy instead of memcpy to not read off the end of source buffer.
Aaron Krebs [Mon, 3 Nov 2014 14:32:08 +0000 (15:32 +0100)]
Use strncpy instead of memcpy to not read off the end of source buffer.

9 years agoAdd a version of the channels test that forks.
Guus Sliepen [Sat, 1 Nov 2014 21:06:56 +0000 (22:06 +0100)]
Add a version of the channels test that forks.

This creates two separate programs that each run one MeshLink instance,
instead of one program that runs two instances simultaneously.

9 years agoSet receive callback when accepting channels.
Aaron Krebs [Fri, 31 Oct 2014 12:33:11 +0000 (13:33 +0100)]
Set receive callback when accepting channels.

9 years agoSet channel_poll_trampoline as default poll callback.
Aaron Krebs [Fri, 31 Oct 2014 12:02:02 +0000 (13:02 +0100)]
Set channel_poll_trampoline as default poll callback.

9 years agoFix compilation error in the basic C++ test.
Guus Sliepen [Sat, 1 Nov 2014 21:06:40 +0000 (22:06 +0100)]
Fix compilation error in the basic C++ test.

9 years agoAdded configure option to set UTCP_DEBUG.
Aaron Krebs [Thu, 30 Oct 2014 13:00:22 +0000 (14:00 +0100)]
Added configure option to set UTCP_DEBUG.

9 years agoChanged C++ channel API to use member functions.
Aaron Krebs [Wed, 29 Oct 2014 12:55:53 +0000 (13:55 +0100)]
Changed C++ channel API to use member functions.

9 years agoapple compatibility
Niklas Hofmann [Mon, 27 Oct 2014 05:47:56 +0000 (06:47 +0100)]
apple compatibility

9 years agowindows compatibility
Niklas Hofmann [Sat, 25 Oct 2014 20:17:51 +0000 (22:17 +0200)]
windows compatibility

9 years agoupdate to new catta, removal of libuuid dependency
Niklas Hofmann [Sat, 25 Oct 2014 15:47:59 +0000 (17:47 +0200)]
update to new catta, removal of libuuid dependency

9 years agoConfigure autotools to install public header files.
Aaron Krebs [Wed, 1 Oct 2014 12:26:24 +0000 (14:26 +0200)]
Configure autotools to install public header files.

9 years agoFix README stuff to compile correctly catta
Saverio Proto [Tue, 26 Aug 2014 12:31:48 +0000 (14:31 +0200)]
Fix README stuff to compile correctly catta

9 years agorename of avahi to catta
Niklas Hofmann [Fri, 22 Aug 2014 08:34:20 +0000 (10:34 +0200)]
rename of avahi to catta

9 years ago2nd approach again: class meshlink::mesh has the handle as member, not as base class.
Lars [Mon, 18 Aug 2014 13:40:43 +0000 (15:40 +0200)]
2nd approach again: class meshlink::mesh has the handle as member, not as base class.

Conflicts:
src/meshlink++.h

9 years agoindent with TAB, align with SPACEs
Lars [Mon, 18 Aug 2014 12:37:48 +0000 (14:37 +0200)]
indent with TAB, align with SPACEs

9 years agoFix path in README.catta
Saverio Proto [Sun, 17 Aug 2014 11:03:52 +0000 (13:03 +0200)]
Fix path in README.catta

9 years agolink to catta instead of avahi
Niklas Hofmann [Fri, 15 Aug 2014 10:54:00 +0000 (12:54 +0200)]
link to catta instead of avahi

9 years agosubmodule catta added
Niklas Hofmann [Fri, 15 Aug 2014 10:10:30 +0000 (12:10 +0200)]
submodule catta added

Conflicts:
.gitmodules

9 years agoremove avahi
Niklas Hofmann [Fri, 15 Aug 2014 10:00:57 +0000 (12:00 +0200)]
remove avahi

9 years agoAdd a function to set the default white/blacklisting behaviour.
Guus Sliepen [Tue, 16 Dec 2014 13:51:36 +0000 (14:51 +0100)]
Add a function to set the default white/blacklisting behaviour.

This function should be called right after meshlink_open(), and will
apply the default white/blacklist setting to newly learned nodes.
The status can later be changed using the meshlink_whitelist() and
meshlink_blacklist() functions.

9 years agoAdd a function to change a configuration file on disk.
Guus Sliepen [Tue, 16 Dec 2014 13:50:42 +0000 (14:50 +0100)]
Add a function to change a configuration file on disk.

10 years agoClean up UTCP connections when stopping the mesh.
Guus Sliepen [Sat, 1 Nov 2014 14:57:42 +0000 (15:57 +0100)]
Clean up UTCP connections when stopping the mesh.

10 years agoTake the global lock in meshlink_channel_send().
Guus Sliepen [Sat, 1 Nov 2014 13:24:41 +0000 (14:24 +0100)]
Take the global lock in meshlink_channel_send().

10 years agoAdd argument validation to the channels API.
Guus Sliepen [Sat, 1 Nov 2014 13:24:00 +0000 (14:24 +0100)]
Add argument validation to the channels API.

10 years agoRegister channel poll callback to notify when a channel has succesfully opened.
Guus Sliepen [Fri, 31 Oct 2014 08:11:49 +0000 (09:11 +0100)]
Register channel poll callback to notify when a channel has succesfully opened.

10 years agoCall utcp_timeout() once every iteration of the event loop.
Guus Sliepen [Fri, 31 Oct 2014 08:10:23 +0000 (09:10 +0100)]
Call utcp_timeout() once every iteration of the event loop.

10 years agoFix definition of mesh::set_channel_accept_cb() and _poll_cb().
Guus Sliepen [Fri, 31 Oct 2014 07:27:34 +0000 (08:27 +0100)]
Fix definition of mesh::set_channel_accept_cb() and _poll_cb().

10 years agoUpdate TODO list.
Guus Sliepen [Sat, 25 Oct 2014 18:18:54 +0000 (20:18 +0200)]
Update TODO list.

10 years agoAdd a poll callback to channels.
Guus Sliepen [Wed, 1 Oct 2014 17:36:58 +0000 (19:36 +0200)]
Add a poll callback to channels.

The callback is called whenever the a call to meshlink_channel_send()
will accept a non-zero number of bytes.

10 years agoEnsure receive_cb and utcp structures have been properly initialized after setting...
Guus Sliepen [Sun, 14 Sep 2014 15:49:09 +0000 (17:49 +0200)]
Ensure receive_cb and utcp structures have been properly initialized after setting channel_accept_cb.

This allows the channels example to initiate a chat from one side only.

10 years agoChannels can now actually be opened.
Guus Sliepen [Sun, 14 Sep 2014 15:27:24 +0000 (17:27 +0200)]
Channels can now actually be opened.

It still requires both sides to call channel_open(), because otherwise utcp_init() is not called
on the receiving side.

10 years agoBuild the channels example.
Guus Sliepen [Sun, 14 Sep 2014 15:24:44 +0000 (17:24 +0200)]
Build the channels example.

10 years agoAdd devclass argument to calls to meshlink_open() in all tests.
Guus Sliepen [Sat, 13 Sep 2014 14:56:50 +0000 (16:56 +0200)]
Add devclass argument to calls to meshlink_open() in all tests.

10 years agoUpdate .gitignore files.
Guus Sliepen [Sat, 13 Sep 2014 14:22:10 +0000 (16:22 +0200)]
Update .gitignore files.

10 years agoFix queue handling in meshlink_send().
Guus Sliepen [Sat, 13 Sep 2014 14:09:11 +0000 (16:09 +0200)]
Fix queue handling in meshlink_send().

We need to copy the data from the application *here*. To avoid multiple copies, prepare the
whole vpn_packet_t in meshlink_send(), so meshlink_send_from_queue() only has to dequeue
and call route(). We also don't need to take the mesh_mutex, since the only information we
use is the name of ourself and the destination node, which is guaranteed to be stable.

10 years agoAdd an example chat program that uses the channels API.
Guus Sliepen [Fri, 5 Sep 2014 21:14:40 +0000 (23:14 +0200)]
Add an example chat program that uses the channels API.

10 years agomanynodes: put a prefix di graph json files because with LXC many machines write...
Saverio Proto [Fri, 5 Sep 2014 16:58:29 +0000 (18:58 +0200)]
manynodes: put a prefix di graph json files because with LXC many machines write into the same folder

10 years agomanynodes: export the graph always from node 0
Saverio Proto [Mon, 1 Sep 2014 06:31:09 +0000 (08:31 +0200)]
manynodes: export the graph always from node 0

10 years agomanynodes: add few backbone nodes and many portable nodes to make tests
Saverio Proto [Thu, 28 Aug 2014 13:18:00 +0000 (15:18 +0200)]
manynodes: add few backbone nodes and many portable nodes to make tests

10 years agomanynodes: implement stop command
Saverio Proto [Thu, 28 Aug 2014 13:17:15 +0000 (15:17 +0200)]
manynodes: implement stop command

10 years agoKeep private members out of the "public" meshlink structs.
Guus Sliepen [Fri, 22 Aug 2014 09:11:46 +0000 (11:11 +0200)]
Keep private members out of the "public" meshlink structs.

10 years agoUpdate to latest commit of UTCP.
Guus Sliepen [Fri, 22 Aug 2014 09:03:54 +0000 (11:03 +0200)]
Update to latest commit of UTCP.

10 years agoMerge branch 'channels'
Guus Sliepen [Fri, 22 Aug 2014 08:58:47 +0000 (10:58 +0200)]
Merge branch 'channels'

Conflicts:
.gitmodules
src/node.h

10 years agomeshlink_export: correctly export the mutex
Saverio Proto [Thu, 21 Aug 2014 16:51:37 +0000 (18:51 +0200)]
meshlink_export: correctly export the mutex

10 years agoDeleting variable defined but not used
Saverio Proto [Thu, 21 Aug 2014 16:33:31 +0000 (18:33 +0200)]
Deleting variable defined but not used

10 years agomanynodes: implemented /select to be able to select the node that will execute the...
Saverio Proto [Tue, 19 Aug 2014 14:17:20 +0000 (16:17 +0200)]
manynodes: implemented /select to be able to select the node that will execute the console commands
by default node0 will be executing the commands
doing /select 1 for example, the node 1 will execute the console commands

10 years agomanynodes: do not add localhost as node's address
Saverio Proto [Mon, 18 Aug 2014 15:35:56 +0000 (17:35 +0200)]
manynodes: do not add localhost as node's address

10 years agoDont learn localhost and IPv6 link local with AVAHI
Saverio Proto [Sun, 17 Aug 2014 13:15:57 +0000 (15:15 +0200)]
Dont learn localhost and IPv6 link local with AVAHI

10 years agoInvitation protocol: correctly initialize and reset mesh->thedatalen after join is...
Saverio Proto [Sun, 17 Aug 2014 11:01:37 +0000 (13:01 +0200)]
Invitation protocol: correctly initialize and reset mesh->thedatalen after join is finished

10 years agoRevert "Fixed a bug in the invitation code that prevented correct working of the...
Saverio Proto [Sun, 17 Aug 2014 10:17:45 +0000 (12:17 +0200)]
Revert "Fixed a bug in the invitation code that prevented correct working of the feature after the second call of /join"

This reverts commit 1b233d4c868011ec98b668d2d7fca576d921b8b6.

10 years agoFixed a bug in the invitation code that prevented correct working of the feature...
Saverio Proto [Thu, 14 Aug 2014 13:48:32 +0000 (15:48 +0200)]
Fixed a bug in the invitation code that prevented correct working of the feature after the second call of /join

The second time /join was called the correct name in meshlink.conf was not updated.

It appeared a wrong ConnectTo statement in the hosts/name file

10 years agofinalize_join: close file descriptor before return
Saverio Proto [Thu, 14 Aug 2014 08:16:08 +0000 (10:16 +0200)]
finalize_join: close file descriptor before return

10 years agobugfix handle case where count(edges) = 0
Niklas Hofmann [Thu, 14 Aug 2014 08:18:52 +0000 (10:18 +0200)]
bugfix handle case where count(edges) = 0

10 years agostart graph export timer via command line paramter in manynodes example
Niklas Hofmann [Wed, 13 Aug 2014 19:30:53 +0000 (21:30 +0200)]
start graph export timer via command line paramter in manynodes example

10 years agograph export timer for manynodes example
Niklas Hofmann [Wed, 13 Aug 2014 19:17:37 +0000 (21:17 +0200)]
graph export timer for manynodes example

10 years agodevtools added
Niklas Hofmann [Wed, 13 Aug 2014 18:15:12 +0000 (20:15 +0200)]
devtools added

10 years agojson export of node and edge structure
Niklas Hofmann [Wed, 13 Aug 2014 17:50:29 +0000 (19:50 +0200)]
json export of node and edge structure

10 years agowarning added to code comment
Niklas Hofmann [Wed, 13 Aug 2014 15:37:27 +0000 (17:37 +0200)]
warning added to code comment