5
0
mirror of https://github.com/cwinfo/yggdrasil-go.git synced 2024-11-27 14:41:37 +00:00
Commit Graph

826 Commits

Author SHA1 Message Date
Arceliar
34939d4b18 update for wire format changes 2018-06-02 16:30:05 -05:00
Neil Alexander
bbdcee1015 Export fields of sessionPing, dhtReq, dhtRes 2018-06-02 22:19:42 +01:00
Neil Alexander
49af65296d Export fields of wire structs 2018-06-02 21:21:05 +01:00
Arceliar
28e6c738e2
Merge branch 'master' into iterdht 2018-06-02 15:00:24 -05:00
Arceliar
09baad48e3 retry failed iterative searches, possibly becoming parallel if things are just slow, and keep track of / skip nodes that were already visited in the search 2018-06-02 14:57:06 -05:00
Neil Alexander
bc37d4fb76 Improve formatting of dot: dashed grey for unknown nodes, sans-serif text 2018-06-02 14:24:06 +01:00
Arceliar
ed6c9c2a54 deduplicate dht responses when adding them to the search, limit the search toVisit size 2018-06-02 00:29:36 -05:00
Arceliar
10a72444e3 get itersearch to run in the sim 2018-06-02 00:16:47 -05:00
Arceliar
ecf7e490d7 start of iterative dht searches 2018-06-01 23:34:21 -05:00
Neil Alexander
ec80a81ed5 Mark extrapolated nodes with dashed outline 2018-06-01 23:33:02 +01:00
Neil Alexander
e4082f218f Add text to dot graph explaining how a node is known 2018-06-01 23:23:24 +01:00
Neil Alexander
a2df5107f0
Change colour scheme: green for self, yellow for peer, blue for open session, white for DHT 2018-06-01 14:20:47 +01:00
Arceliar
ca15bbea57 try color coding dot output 2018-05-31 20:28:09 -05:00
Neil Alexander
ccf71af6b7
Move Init from core.go to debug.go as function is only for simulator 2018-05-27 23:37:57 +01:00
Neil Alexander
460a22c063
Clean up some exported constants 2018-05-27 23:31:34 +01:00
Neil Alexander
a9e61d0d37
Add support for building "release" builds that don't contain pprof which are substantially smaller. To build a "debug" build, use "-tags debug" with "go build" 2018-05-27 23:22:50 +01:00
Neil Alexander
35173e2388
Fix starting TUN read/write 2018-05-27 22:35:30 +01:00
Neil Alexander
4c115de633
De-debug 2018-05-27 22:13:37 +01:00
Arceliar
38e7704161 use backpressure instead of estimated bandwidth, sorted by uptime to break ties 2018-05-27 13:37:35 -05:00
Arceliar
02ba9dc97c fix npe, these don't need to be pointers 2018-05-27 13:22:21 -05:00
Arceliar
7b12493417 panic if tcp startup fails, since otherwise a nil pointer occurs in multicast. make udp do the same thing. 2018-05-27 12:56:33 -05:00
Neil Alexander
a0f547cc1b
Fix being able to enable/disable multicast 2018-05-26 21:50:47 +01:00
Neil Alexander
bc899c395a
Fix accidental truncation of addresses ending in 8 on macOS and BSD 2018-05-26 21:47:54 +01:00
Neil Alexander
5d87601118
Add getMulticastInterfaces and getSelf to yggdrasilctl 2018-05-23 22:13:52 +01:00
Neil Alexander
1fd53bcb7d
Update comments in configuration 2018-05-23 14:02:13 +01:00
Neil Alexander
ce854a76bd
Add -normaliseconf option and temporarily correct old config item names in running config 2018-05-23 12:04:27 +01:00
Neil Alexander
9d9083e373
Update configuration names, fix multicast interface selection 2018-05-23 11:28:20 +01:00
Neil Alexander
6f79184c9b
Move multicasting into yggdrasil package 2018-05-23 11:13:53 +01:00
Neil Alexander
388ae09fca
Rename some config items 2018-05-22 23:43:29 +01:00
Arceliar
b10ae51565
Merge pull request #85 from neilalexander/yggdrasilctl
Human-readable formatting in yggdrasilctl
2018-05-21 19:21:00 -05:00
Neil Alexander
04b3e84023
Show your IPv6 address and subnet when starting 2018-05-21 16:15:31 +01:00
Neil Alexander
9567446f50
Offload formatting to yggdrasilctl and keep precision in JSON 2018-05-21 15:21:23 +01:00
Neil Alexander
59688dcab3
Fix formatting of bytes_sent, bytes_recvd, last_seen, uptime 2018-05-21 15:05:01 +01:00
Neil Alexander
ca3e541d3b
Friendly formats for getDHT, getSessions, setTunTap etc 2018-05-21 14:14:57 +01:00
Neil Alexander
201701ae4a
Add some pretty printing to yggdrasilctl, small modifications to JSON formatting in admin socket 2018-05-21 13:54:51 +01:00
Neil Alexander
bd32f5890b
Run gofmt -s -w 2018-05-21 07:28:03 +01:00
Neil Alexander
79131bb959
Minor tweaks 2018-05-20 23:25:07 +01:00
Neil Alexander
aae570de2a
Optional parameters are now square instead of pointed brackets, avoid nils for help 2018-05-20 21:57:05 +01:00
Neil Alexander
c765e0566f
Convert rest of functions, fix setTunTap 2018-05-20 21:54:15 +01:00
Neil Alexander
c75566d5ac
Various fixes and error catching, add setTunTap 2018-05-20 21:44:30 +01:00
Neil Alexander
4ecc7ce860
Add getTunTap to JSON admin socket 2018-05-20 19:42:37 +01:00
Neil Alexander
c3ca5c64b1
Add some more functions to JSON admin socket 2018-05-20 19:23:43 +01:00
Neil Alexander
9713e73969
Fix dot 2018-05-20 17:25:13 +01:00
Neil Alexander
a6ef7166ea
Start JSON-ifying the admin socket 2018-05-20 17:21:14 +01:00
Arceliar
5c0636eb3d add uptime and bytes sent/recvd to peer struct and getPeers 2018-05-18 20:41:02 -05:00
Neil Alexander
ca96bbf014
Accept exchanging an MTU of 0 to signify that TUN/TAP is disabled, don't send traffic to a node in that case 2018-05-18 18:56:33 +01:00
Neil Alexander
ec371af84f
Track TX/RX bytes over session and if MTU was adjusted, add to admin socket getSession 2018-05-18 17:59:29 +01:00
Arceliar
ec8fe338d5 more insertIfNew bugfixes, and add peerOnly to getDHT output (true if a node is in the bucket.peers slice instead of bucket.others--it means they're not regularly pinged, they're only there to make sure DHT lookups include them as a result, for bootstrapping reasons) 2018-05-17 21:43:26 -05:00
Arceliar
fe518f4e3f bugfixes related to peer timeouts in the DHT, significantly improve DHT bootstrap speed 2018-05-17 21:20:31 -05:00
Arceliar
8d9887294c add dht time since last ping to admin socket, some DHT code cleanup, bugfix to insertIfNew 2018-05-17 19:32:29 -05:00
Arceliar
d98640fd59 switch cleanup 2018-05-16 17:48:53 -05:00
Arceliar
6b51b44cbf slightly better variable naming 2018-05-16 17:36:37 -05:00
Arceliar
800ccaa3d4 cleanup 2018-05-16 17:32:26 -05:00
Arceliar
fe712d24f8 don't allow buckets to overflow when the next bucket isn't full 2018-05-16 17:24:38 -05:00
Arceliar
8228242eed misc dht and tree changes to stabilize coords and bootstrap the dht faster 2018-05-15 23:57:00 -05:00
Arceliar
96c55da987
Merge pull request #76 from neilalexander/hjson
Use HJSON for config instead of JSON
2018-05-13 15:09:28 -05:00
Neil Alexander
5299783e35
Add getTunTap to admin socket 2018-05-10 09:48:12 +01:00
Neil Alexander
e381808704
Add ability to select interface by friendly name on Windows 2018-05-09 16:42:24 +01:00
Neil Alexander
8ea3070a02
Small tweaks/clean up 2018-05-09 14:03:28 +01:00
Neil Alexander
45b106168e
Use HJSON instead of JSON 2018-05-09 13:54:31 +01:00
Arceliar
5dac273a3d rename to 'AllowedBoxPubs' and similar 2018-05-07 17:05:54 -05:00
Arceliar
6ce16d8192 debug admin socket 2018-05-06 19:48:26 -05:00
Arceliar
94dd231e13 add (not working) admin functions for auth keys, needs debugging 2018-05-06 19:31:19 -05:00
Arceliar
0b391b6e3a debugging and cleanup 2018-05-06 19:01:52 -05:00
Arceliar
80f893aac3 let the peer's linkLoop call close if the peer receives no announcements for too long 2018-05-06 17:17:12 -05:00
Arceliar
6026e0a014 Optional peer authentication, if non-empty then incoming TCP and all UDP peers must match one of these box keys 2018-05-06 16:32:34 -05:00
Arceliar
3a1b67da8c
Update admin.go 2018-05-05 20:20:38 -05:00
Arceliar
cdedd304af make removePeers work for TCP connections and minor admin cleanup 2018-05-05 17:14:03 -05:00
Arceliar
8b9a91be57 possibly fix weird issue I was having with netns, still not sure I understand why it was a problem 2018-04-28 16:39:58 -05:00
Neil Alexander
bdf9e45082
Default to previous scheme when url.Parse returns an error
In response to:
```
panic: parse x.x.x.x:xxx: first path segment in URL cannot contain colon

goroutine 33 [running]:
yggdrasil.(*Core).DEBUG_addPeer(0x8e58000, 0x8e34080, 0x12)
        /go/src/github.com/{{ORG_NAME}}/{{REPO_NAME}}/src/yggdrasil/debug.go:317 +0x420
main.(*node).init.func1(0x8e48000, 0x8e58000)
        /go/src/github.com/{{ORG_NAME}}/{{REPO_NAME}}/yggdrasil.go:75 +0x70
created by main.(*node).init
        /go/src/github.com/{{ORG_NAME}}/{{REPO_NAME}}/yggdrasil.go:69 +0x410
```
2018-04-27 09:53:31 +01:00
Jeff Becker
fe13fea1e5
remove hard coded tor config options 2018-04-26 10:26:10 -04:00
Jeff Becker
7756891510
support socks proxy in peer url and decouple explicit tor/i2p routing 2018-04-26 10:23:21 -04:00
Jeff Becker
769b058004
more docs 2018-04-25 10:11:11 -04:00
Jeff Becker
1be8bbed1c
more docs 2018-04-25 10:09:09 -04:00
Jeff Becker
de69860e9b
* only enable tor proxy dialer when tor is enabled
* add docstrings
2018-04-25 10:06:13 -04:00
Jeff Becker
c16e354a44
Merge remote-tracking branch 'origin/master' into tor-auto 2018-04-25 10:01:10 -04:00
Arceliar
8ef2e55de6 try sending pings before sending searches for an unresponsive session 2018-04-22 15:31:30 -05:00
Jeff Becker
5e23185ddc
use address only not port 2018-04-20 08:41:09 -04:00
Jeff Becker
3c4fee0492
tor auto config 2018-04-19 10:30:40 -04:00
Neil Alexander
48ced483d6
Merge pull request #64 from Arceliar/dht
Limit DHT pings to 1/min per node
2018-03-17 20:46:47 +00:00
Arceliar
fe5ef4e867 don't add things to the dht rumorMill if they've been pinged in the last minute (arbitrary time, needs investigating) 2018-03-17 15:28:22 -05:00
Arceliar
0459f88b92 add a udp close packet, and partial support for a removePeer admin call (sends close to UDP peers, but doesn't close TCP connections yet) 2018-03-16 18:24:28 -05:00
Neil Alexander
bf0413a0c4
Modify ICMPv6 source address for "Packet Too Big" messages to a routable address so that it correctly routes to nodes in an yggdrasil /64 subnet 2018-03-10 22:31:36 +00:00
Arceliar
b34345229a remove any peers from the dht if a reset is triggered (from coord changes) 2018-03-10 15:16:39 -06:00
Arceliar
9ce0b7fbea keep peers separate from other nodes in dht 2018-03-10 13:58:48 -06:00
Neil Alexander
1155816df8 Show both UDP and TCP listen addresses in stdout (#51) 2018-03-07 09:41:04 +00:00
Neil Alexander
166d25619d Attempt to support NetBSD
This code actually consolidates a lot of the BSD code together, and even setting the interface MTU with SIOCSIFMTU seems to work fine.

What doesn't work though is setting the interface address using SIOCSIFADDR_IN6, which I attempted to plagiarise from the Darwin code.

As a fallback, ifconfig is used, which solves the problem enough to get it working.
2018-03-04 23:47:01 +00:00
Arceliar
cd0d1a1d26 get the fd instead of depending on water to do it 2018-03-04 13:57:34 -06:00
Arceliar
039c4a5a35 only try to build on openbsd and freebsd for now, darwin needs work too 2018-03-04 11:02:54 -06:00
Arceliar
478b80a07a cleanup 2018-03-04 10:56:46 -06:00
Arceliar
e7726cfb00 deduplicate some bsd tuntap code, still untested 2018-03-04 10:55:32 -06:00
Neil Alexander
c30792245a Add FreeBSD support in TAP mode 2018-03-04 16:24:50 +00:00
Neil Alexander
a92e6c2588
Merge pull request #29 from Arceliar/netlink
Linux: use netlink instead of ip
2018-03-04 10:47:34 +00:00
Arceliar
5ec6265a70 use netlink instead of ip commands to set address/mtu and bring up the tuntap device on linux 2018-03-03 16:41:36 -06:00
Arceliar
0460fdd301 panic if tun.write or tun.read returns an error and was launched from debug.go, since there's no way to recover in these scenarios 2018-03-03 13:56:26 -06:00
Arceliar
a367f2ca17 gofmt 2018-03-03 11:49:24 -06:00
Arceliar
0578a9f273 manual merge 2018-03-03 11:07:08 -06:00
Neil Alexander
4e5627f933 Update default interface MTU to use per-platform instead of global value 2018-03-03 12:43:39 +00:00
Neil Alexander
4917ea3dd2 Per-platform TUN defaults 2018-03-03 12:30:54 +00:00
Neil Alexander
bec898a326 Don't allow exceeding maximum MTU for a given platform 2018-03-03 11:47:14 +00:00
Neil Alexander
7c0102e43d Be a little bit less verbose on OpenBSD 2018-03-01 15:31:49 +00:00
Neil Alexander
6640b33334 Fix using 'auto' as device name on OpenBSD - default to /dev/tap0 2018-03-01 15:19:20 +00:00
Neil Alexander
24be3f1d67 Turns out FreeBSD is a bit different so restrict this to OpenBSD for now 2018-03-01 15:11:12 +00:00
Neil Alexander
90393ae03b Set interface flags properly on OpenBSD 2018-03-01 15:02:53 +00:00
Neil Alexander
9e4d169208 Set interface IP and MTU on BSD 2018-03-01 13:37:05 +00:00
Neil Alexander
f8dda26dba Add BSD support (openbsd, freebsd, solaris) 2018-03-01 11:49:49 +00:00
Neil Alexander
ebc4eacee4 Allow sane defaults on setTunTap 2018-02-28 15:27:58 +00:00
Neil Alexander
fdd32b9571 Add setTunTap 2018-02-28 15:15:57 +00:00
Neil Alexander
2b48fd1fce Add addPeer to admin socket 2018-02-28 13:43:06 +00:00
Arceliar
ddc4773b19 don't drop send/recv traffic going through the crypto workers, just block until they're free (TODO run further tests to make sure this doesn't cycle/deadlock) 2018-02-26 18:12:28 -06:00
Arceliar
63b55cda62 Mostly working PMTU discovery when going over UDP links 2018-02-25 20:24:36 -06:00
Arceliar
0470f6f1c1 cleanup 2018-02-23 13:04:52 -06:00
Arceliar
bb3ae8b39b temporarily limit PMTU to 2048, as a workaround to some pathelogical behavior where a TCP stream carried over a UDP peer can throttle down to 0 in the presence of significant packet loss 2018-02-23 12:46:22 -06:00
Arceliar
d3dc7765f2 trying to debug UDP+large MTU issues 2018-02-20 17:31:12 -06:00
Arceliar
a81c361484 tcp reconnect bufix, test with bufio, and switch back to tcp auto-peering by default to continue testing 2018-02-19 23:22:36 -06:00
Arceliar
a21a039b57 remove unused field from peer 2018-02-19 19:47:11 -06:00
Arceliar
4045597516 Use larger UDP chunks for link-local IP and let the OS fragment it. Switch to UDP for link-local peers. Minor code cleanup for TCP. 2018-02-19 19:34:51 -06:00
Arceliar
71150fcb86 ignore root tstamp updates if we just updated, to throttle the rate at which updates (and new signatures) can propagate 2018-02-17 23:57:24 -06:00
Arceliar
a66a29779a Slightly nicer way to throttle peer announcements 2018-02-17 23:41:42 -06:00
Arceliar
0fc7401635 check root before adding peers to the switch lookupTable, instead of during each lookup 2018-02-17 23:14:23 -06:00
Arceliar
430d49d8a4 send fewer link announcements, fix a ttl encoding bug, and remove unnecessary key field from the wire format for dht req/res 2018-02-17 21:59:08 -06:00
Arceliar
8ba11b86bb remove duplicate tcp connections 2018-02-17 20:44:23 -06:00
Arceliar
25f00c1c7a disable keys in link protocol traffic, since these are already known, *breaks backwards compat* 2018-02-17 20:30:59 -06:00
Arceliar
da44ec282f Add a rumor mill to throttle dht maintenance traffic 2018-02-17 17:10:08 -06:00
Neil Alexander
02473158d4 Allow setting IfName to 'none' to run without TUN/TAP 2018-02-15 22:29:13 +00:00
Neil Alexander
366d2af1d3 Fix first queued packet on session pcreation 2018-02-15 18:02:08 +00:00
Neil Alexander
1c59338f01 Fix checksums and packet buffers, sends ICMPv6 Packet Too Big messages successfully now 2018-02-15 13:38:54 +00:00
Neil Alexander
37e4492b86 Send ICMPv6 response to packets larger than session MTU (WIP: checksum wrong?) 2018-02-14 22:59:24 +00:00
Arceliar
a3a9696880
Merge pull request #14 from neilalexander/icmpv6
Replace ndp.go with icmpv6.go
2018-02-14 11:16:24 -06:00
Neil Alexander
844212e95b Highlight packets that exceed the agreed session MTU 2018-02-14 14:08:40 +00:00
Neil Alexander
34b264067e Run gofmt -s -w . 2018-02-14 11:46:10 +00:00
Neil Alexander
0bf43b758f Split create_icmpv6 into create_icmpv6_tun and create_icmpv6_tap 2018-02-14 11:39:55 +00:00
Neil Alexander
d78e0f7067 Improve icmpv6.go
- Now doesn't use unsafe
- Much cleaner
- Doesn't run in a goroutine perpetually
- Has a function to create ICMPv6 packets
2018-02-14 11:23:46 +00:00
Neil Alexander
6571a8c300 Don't use channels for ICMPv6 packets 2018-02-12 20:00:55 +00:00
Neil Alexander
fac4bf796e Add some error handling and other fixes to icmpv6.go 2018-02-12 19:40:13 +00:00
Neil Alexander
be0d6feeba Remove ndp.go and add icmpv6.go 2018-02-12 18:19:31 +00:00
Neil Alexander
7a0b48ffb3 Clean up session.go 2018-02-12 00:01:15 +00:00
Neil Alexander
11a7c5c458 Exchange MTU on wire 2018-02-11 23:58:30 +00:00
Neil Alexander
536974f20c Try to exchange MTUs when creating sessions 2018-02-11 23:09:05 +00:00
Neil Alexander
e9bd98d213 Add "IfTAPMode" configuration option to allow selecting TAP mode on supported platforms 2018-02-11 21:45:44 +00:00
Arceliar
d424489329 add tcp support and use it by default 2018-02-09 17:42:55 -06:00
Arceliar
4acce71468 Merge branch 'master' into bigmtu 2018-02-07 17:49:04 -06:00
Arceliar
e9adf327b0 possibly fix deadlock from race in peer linkloop goroutine, add some related debug code to the admin 2018-02-07 17:48:30 -06:00
Arceliar
b704d7b497 change mtu and enable udp chunking 2018-02-04 11:25:20 -06:00
Arceliar
63aadf6e88 use smaller buffer sizes for buffered channels 2018-02-03 18:44:28 -06:00
Arceliar
2dd8152a0c reorganize and add more to the admin 2018-01-29 18:48:14 -06:00
Arceliar
c18d863a3e update comments, mostly TODO/FIXME notes 2018-01-26 17:30:51 -06:00
Neil Alexander
e44f64bea0 Fix MTU issues with TAP adapters 2018-01-25 17:44:56 +00:00
Arceliar
d52fab8af6 disable/enable the tap device at startup to clear any old settings, e.g. old addresses 2018-01-24 21:14:26 -06:00
Arceliar
06e3c8c997 if you could go ahead and include your port number in your multicast announcements, that'd be great 2018-01-24 18:45:29 -06:00
Neil Alexander
761e7cdeb0 Remove apparently excessive escaping from netsh in tun_windows.go 2018-01-24 22:37:08 +00:00
Neil Alexander
ff55070458 TAP support added
- Supports Windows using OpenVPN NDIS 6 TAP driver
- Supports NDP Neighbor Solicitation and Advertisements in ndp.go
- Supports TAP encapsulation and decapsulation in tun.go
2018-01-24 10:59:01 +00:00
Arceliar
2b7c6eafcd In admin dot, reverse direction of peer links, include the switch port for each link, and sort the output by coords 2018-01-21 16:19:39 -06:00
Neil Alexander
36f9cc5041 Highlight own node on dot graph 2018-01-21 21:54:50 +00:00
Arceliar
87a4af7841 update admin dot to better handle missing nodes and to direct links towards parent, based on neilalexander's work 2018-01-21 14:58:54 -06:00
Arceliar
625b97c511 add and use a thread-safe way of reading router internal state, and include active sessions in the admin query 2018-01-21 12:55:45 -06:00
Neil Alexander
8ef852469b Formatting 2018-01-21 17:53:25 +00:00
Neil Alexander
483d90a728 Draw dot draphs (although maybe not very well) 2018-01-21 17:51:51 +00:00
Neil Alexander
c4ac0a90ac Add the ability to see switch ports and DHT 2018-01-21 12:57:54 +00:00
Neil Alexander
b754d68068 Add an admin socket 2018-01-21 00:17:15 +00:00
Arceliar
502ab3cfaa check that the source IP inside a packet matches the address or prefix for the session that transmitted it 2018-01-19 17:33:04 -06:00
Arceliar
f929df1ea9 minor performance adjustments 2018-01-18 18:48:34 -06:00
Neil Alexander
62c45e7cc7 Use MTU from interface definition 2018-01-15 14:39:07 +00:00
Neil Alexander
d7be706413 Move to unix.Syscall etc and tidy up 2018-01-15 14:35:37 +00:00
Neil Alexander
5d2dd061f0 Fix definition of SIOCAIFADDR_IN6 2018-01-15 14:14:18 +00:00
Neil Alexander
8e86c4b853 Merge /Users/neilalexander/Desktop/Projects/yggdrasil-go into macos-interface 2018-01-15 11:22:54 +00:00
Arceliar
75965b6da4 Switch connAddr (udp map key) from string to a struct that allocates less. Reduce some other allocations. Use larger channel buffers to reduce backpressure from runtime jitter. 2018-01-13 07:26:26 -06:00
Arceliar
ef1e0c902f Add regexp to limit which link-local IPv6 zones allow peering, and check that a peer isn't from within the networks address block (prevents accidental tunneling) 2018-01-09 02:08:54 -06:00
Neil Alexander
d69190715f Added a darwin tun module. It should work, but it doesn't! 2018-01-06 16:39:30 +00:00
Neil Alexander
c3600d14d6 Implement a tun interface to reduce dependency on Water library 2018-01-05 23:35:59 +00:00
Neil Alexander
b3ebe76b59 Run gofmt -s -w . 2018-01-04 22:37:51 +00:00
Neil Alexander
ae7b07ae6a Move Linux-specific ifname logic to tun_linux.go and place a generic in tun_other.go 2018-01-04 22:34:17 +00:00
Neil Alexander
1c799b305d Add support for specifying tun device name 2018-01-04 13:31:48 +00:00
Arceliar
e5d526881d Disable tun panic on IPv4 packets and add a link to a Vyatta router config 2018-01-03 15:27:13 -06:00
Arceliar
82fd435211 Avoid sending unnecessairy udp key packets, and try config peers less often 2018-01-02 18:45:09 -06:00
Arceliar
d7e6d814a0 first code/readme/license commit 2017-12-28 22:16:20 -06:00