diff options
author | Grant Limberg <glimberg@gmail.com> | 2015-05-02 18:24:52 -0700 |
---|---|---|
committer | Grant Limberg <glimberg@gmail.com> | 2015-05-02 18:24:52 -0700 |
commit | 06ab338eccdbeab6a246073500ff10762983acfe (patch) | |
tree | 2010d5b6290f05ab909506c37b12ac4fb367c3f3 /java | |
parent | ad6ec22857bb3f4e702d6d5bd8f0abda31728481 (diff) | |
download | infinitytier-06ab338eccdbeab6a246073500ff10762983acfe.tar.gz infinitytier-06ab338eccdbeab6a246073500ff10762983acfe.zip |
added naive OneService implementation.
Does nothing but send packets to master nodes and listen for packets back.
Diffstat (limited to 'java')
-rw-r--r-- | java/src/com/zerotier/one/OneService.java | 198 |
1 files changed, 198 insertions, 0 deletions
diff --git a/java/src/com/zerotier/one/OneService.java b/java/src/com/zerotier/one/OneService.java new file mode 100644 index 00000000..0d56239e --- /dev/null +++ b/java/src/com/zerotier/one/OneService.java @@ -0,0 +1,198 @@ +/* + * ZeroTier One - Network Virtualization Everywhere + * Copyright (C) 2011-2015 ZeroTier, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + * -- + * + * ZeroTier may be used and distributed under the terms of the GPLv3, which + * are available at: http://www.gnu.org/licenses/gpl-3.0.html + * + * If you would like to embed ZeroTier into a commercial application or + * redistribute it in a modified binary form, please contact ZeroTier Networks + * LLC. Start here: http://www.zerotier.com/ + */ + + +package com.zerotier.one; + +import java.io.IOException; +import java.net.DatagramPacket; +import java.net.DatagramSocket; +import java.net.InetSocketAddress; +import java.net.ServerSocket; +import java.net.SocketException; + +import com.zerotier.sdk.Event; +import com.zerotier.sdk.EventListener; +import com.zerotier.sdk.Node; +import com.zerotier.sdk.PacketSender; +import com.zerotier.sdk.ResultCode; +import com.zerotier.sdk.Version; +import com.zerotier.sdk.VirtualNetworkConfig; +import com.zerotier.sdk.VirtualNetworkConfigListener; +import com.zerotier.sdk.VirtualNetworkConfigOperation; +import com.zerotier.sdk.VirtualNetworkFrameListener; + +public class OneService extends Thread implements Runnable, PacketSender, + EventListener, VirtualNetworkConfigListener, + VirtualNetworkFrameListener { + private Node _node; + private int _port; + + private DatagramSocket _udpSocket; + private ServerSocket _tcpSocket; + private DataStore _ds; + private long _nextBackgroundTaskDeadline = 0; + + private final Thread _udpReceiveThread = new Thread() { + @Override + public void run() { + try { + long[] bgtask = new long[1]; + byte[] buffer = new byte[16384]; + while(true) { + + bgtask[0] = 0; + DatagramPacket p = new DatagramPacket(buffer, buffer.length); + + _udpSocket.receive(p); + if(p.getLength() > 0) + { + System.out.println("Got Data From: " + p.getAddress().toString() +":" + p.getPort()); + + _node.processWirePacket(System.currentTimeMillis(), new InetSocketAddress(p.getAddress(), p.getPort()), 0, p.getData(), bgtask); + _nextBackgroundTaskDeadline = bgtask[0]; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + }; + + + public OneService(DataStoreFileProvider prov, int port) { + this._port = port; + this._ds = new DataStore(prov); + + try { + _udpSocket = new DatagramSocket(_port); + _tcpSocket = new ServerSocket(); + _tcpSocket.bind(new InetSocketAddress("127.0.0.1", _port)); + } catch (SocketException e) { + e.printStackTrace(); + return; + } catch (IOException e) { + e.printStackTrace(); + return; + } + + _udpReceiveThread.start(); + + _node = new Node( + System.currentTimeMillis(), + _ds, + _ds, + this, + this, + this, + this); + } + + @Override + public void run() { + while(true) { + try { + + long dl = _nextBackgroundTaskDeadline; + long now = System.currentTimeMillis(); + + if (dl <= now) { + long[] returnDeadline = {0}; + ResultCode rc = _node.processBackgroundTasks(now, returnDeadline); + _nextBackgroundTaskDeadline = returnDeadline[0]; + + if(rc != ResultCode.RESULT_OK) { + System.out.println(rc.toString()); + } + } + + long delay = (dl > now) ? (dl - now) : 100; + Thread.sleep(delay); + + } catch (Exception ex) { + System.out.println("Exception in run loop: " + ex.getMessage()); + ex.printStackTrace(); + } + } + } + + @Override + public int onSendPacketRequested(InetSocketAddress addr, + int linkDesperation, byte[] packetData) { + System.out.println("onSendPacketRequested to: " + addr.getHostString() +":"+ addr.getPort() + " "); + + if(_udpSocket == null) + return -1; + try { + DatagramPacket p = new DatagramPacket(packetData, packetData.length, addr); + _udpSocket.send(p); + System.out.println("Sent"); + } catch (Exception e) { + System.out.println("Error sending datagram: " + e.getMessage()); + return -1; + } + return 0; + } + + @Override + public void onVirtualNetworkFrame(long nwid, long srcMac, long destMac, + long etherType, long vlanId, byte[] frameData) { + // TODO Auto-generated method stub + + } + + @Override + public int onNetworkConfigurationUpdated(long nwid, + VirtualNetworkConfigOperation op, VirtualNetworkConfig config) { + // TODO Auto-generated method stub + return 0; + } + + @Override + public void onEvent(Event event) { + // TODO Auto-generated method stub + + } + + @Override + public void onNetworkError(Event event, InetSocketAddress source) { + // TODO Auto-generated method stub + + } + + @Override + public void onOutOfDate(Version newVersion) { + // TODO Auto-generated method stub + + } + + @Override + public void onTrace(String message) { + // TODO Auto-generated method stub + + } +} |