Пример #1
0
        public void sendToCloudHelper_HelpWithNode(xbs_node node)
        {
            xbs_node_message_toCloudHelper_HelpWithNode msg = new xbs_node_message_toCloudHelper_HelpWithNode(node.ip_public, (UInt16)node.port_public);

            msg.receiver = this;
            sendNodeMessage(msg);
        }
Пример #2
0
        public void send_fromCloudhelper_helpWithAddingNode(xbs_node node)
        {
            xbs_node_message_fromCloudHelper_ContactNode msg = new xbs_node_message_fromCloudHelper_ContactNode(node.ip_public, (UInt16)node.port_public);

            msg.receiver = this;
            sendNodeMessage(msg);
        }
Пример #3
0
 public void addNode(xbs_node node)
 {
     lock (this)
     {
         foreach (xbs_node n in node_list)
         {
             if (n.Equals(node))
             {
                 return;
             }
         }
         node_list.Add(node);
     }
     xbs_messages.addInfoMessage(" + Added new node: " + node, xbs_message_sender.NODELIST);
     node.sendGetClientVersion();
     node.sendPing();
     node.sendGetNickname();
     if (notify_on_new_node)
     {
         System.Media.SoundPlayer sound_player = new System.Media.SoundPlayer();
         sound_player.SoundLocation = xbs_node_list.NOTIFICATION_SOUND_NODE_JOINED;
         try
         {
             sound_player.Play();
         }
         catch (Exception)
         {
         }
     }
     purgeAddedNodeFromAddingList(node);
     listHasJustChanged();
 }
Пример #4
0
 public bool Equals(xbs_node node)
 {
     if (ip_announced != null && node.ip_announced != null)
     {
         if (ip_announced.Equals(node.ip_announced) && port_announced == node.port_announced)
         {
             return(true);
         }
     }
     if (ip_sendfrom != null && node.ip_sendfrom != null)
     {
         if (ip_sendfrom.Equals(node.ip_sendfrom) && port_sendfrom == node.port_sendfrom)
         {
             return(true);
         }
     }
     if (ip_public != null && node.ip_public != null)
     {
         if (ip_public.Equals(node.ip_public) && port_public == node.port_public)
         {
             return(true);
         }
     }
     return(false);
 }
Пример #5
0
        public void updateNodeInCloud(String row_data)
        {
            IPAddress ip;
            int       port;

            try
            {
                NameValueCollection node_data = HttpUtility.ParseQueryString(row_data);
                ip   = IPAddress.Parse(node_data[xbs_cloudlist_getparameters.NODEIP]);
                port = int.Parse(node_data[xbs_cloudlist_getparameters.NODEPORT]);
            }
            catch (Exception e)
            {
                xbs_messages.addInfoMessage("!! Error getting updating node data: " + e.Message, xbs_message_sender.CLOUDLIST, xbs_message_type.ERROR);
                return;
            }
            xbs_node_list node_list = xbs_node_list.getInstance();

            if (node_list != null)
            {
                xbs_node node = node_list.findNode(ip, port);
                if (node == null)
                {
                    node = new xbs_node(ip, port);
                    if (!node_list.local_node.Equals(node))
                    {
#if DEBUG
                        xbs_messages.addDebugMessage(" x found new node in cloudlist update: " + node, xbs_message_sender.CLOUDLIST);
#endif
                        node_list.tryAddingNode(node, current_cloudname);
                    }
                }
            }
        }
Пример #6
0
        public void dispatch_in_msg(ref xbs_udp_message udp_msg)
        {
            xbs_node tmp_node     = null;
            xbs_node sending_node = node_list.findNode(udp_msg.src_ip, udp_msg.src_port);

# if DEBUG
            if (udp_msg.msg_type != xbs_node_message_type.PING && udp_msg.msg_type != xbs_node_message_type.PONG)
Пример #7
0
 public xbs_node_message_data(xbs_node node, byte[] data_bytes)
 {
     type     = ttype;
     data     = data_bytes;
     data_len = (UInt16)data.Length;
     receiver = node;
 }
Пример #8
0
 public xbs_node_message_clientversion(xbs_node node, String version_string)
 {
     type     = ttype;
     data     = getVersionStringByteArray(version_string);
     data_len = 4;
     receiver = node;
 }
Пример #9
0
        public xbs_node addNode(IPAddress ip_announced, int port_announced, IPAddress ip_from, int port_from)
        {
            xbs_node node = new xbs_node(ip_announced, port_announced, ip_from, port_from);

            addNode(node);
            return(node);
        }
Пример #10
0
 public void addNode(xbs_node node)
 {
     lock (this)
     {
         foreach (xbs_node n in node_list)
             if (n.Equals(node))
                 return;
         node_list.Add(node);
     }
     xbs_messages.addInfoMessage(" + Added new node: " + node, xbs_message_sender.NODELIST);
     node.sendGetClientVersion();
     node.sendPing();
     node.sendGetNickname();
     if (notify_on_new_node)
     {
         System.Media.SoundPlayer sound_player = new System.Media.SoundPlayer();
         sound_player.SoundLocation = xbs_node_list.NOTIFICATION_SOUND_NODE_JOINED;
         try
         {
             sound_player.Play();
         }
         catch (Exception)
         {
         }
     }
     purgeAddedNodeFromAddingList(node);
     listHasJustChanged();
 }
Пример #11
0
 public xbs_node_message_pong(xbs_node node, byte[] data)
 {
     this.data = data;
     data_len  = (UInt16)data.Length;
     type      = ttype;
     data_len  = 0;
     receiver  = node;
 }
Пример #12
0
        public void sendDelNodeMessage(xbs_node node)
        {
#if DEBUG
            xbs_messages.addInfoMessage(" ~ sending DelNodeMessage to " + this + " for node " + node, xbs_message_sender.NODE);
#endif
            xbs_node_message_delnode msg = new xbs_node_message_delnode(node.ip_public, (UInt16)node.port_public);
            msg.receiver = this;
            sendNodeMessage(msg);
        }
Пример #13
0
        public xbs_node_message_ping(xbs_node node)
        {
            DateTime now = DateTime.Now;

            data     = BitConverter.GetBytes(now.Ticks);
            data_len = (UInt16)data.Length;

            type     = ttype;
            receiver = node;
        }
Пример #14
0
        public void cloudhelper_helpWithNode(IPAddress ip_from, int port_from, IPAddress ip_to, int port_to)
        {
            xbs_node node_from = findNode(ip_from, port_from);
            xbs_node node_to   = findNode(ip_to, port_to);

            if (node_from != null && node_to != null)
            {
                node_to.send_fromCloudhelper_helpWithAddingNode(node_from);
            }
        }
Пример #15
0
 public xbs_node_message_string(xbs_node node, String str)
 {
     this.message_string = str;
     if (str != null && str.Length > 0)
     {
         updateBinarydata();
     }
     else
     {
         data_len = 0;
     }
     receiver = node;
 }
Пример #16
0
 public void informNodesOnDelNode(xbs_node node)
 {
     xbs_messages.addInfoMessage(" + informing all nodes of removed node " + node, xbs_message_sender.NODELIST);
     lock (this)
     {
         foreach (xbs_node n in node_list)
         {
             if (!node.Equals(n))
             {
                 n.sendDelNodeMessage(node);
             }
         }
     }
 }
Пример #17
0
 public void informNodesOnAddNode(xbs_node new_node)
 {
     xbs_messages.addInfoMessage(" + informing all nodes of new node " + new_node, xbs_message_sender.NODELIST);
     lock (this)
     {
         foreach (xbs_node node in node_list)
         {
             if (!node.Equals(new_node))
             {
                 node.sendAddNodeMessage(new_node);
             }
         }
     }
 }
Пример #18
0
        private void askCloudHelperToSendAddNodeMessage(xbs_node node)
        {
            xbs_node cloud_helper;

            lock (node_list)
            {
                cloud_helper = node_list.Count == 0 ? null : node_list[my_random.Next(0, node_list.Count - 1)];
            }
            if (cloud_helper == null)
            {
                return;
            }
            xbs_messages.addInfoMessage("+ asking (" + node.ask_cloudhelper_count + ") cloud_helper (" + cloud_helper + ") for help to add node " + node, xbs_message_sender.NODELIST);
            cloud_helper.sendToCloudHelper_HelpWithNode(node);
        }
Пример #19
0
        public void sendNodeListToNode(xbs_node new_node)
        {
#if DEBUG
            xbs_messages.addInfoMessage(" + sending Nodelist to " + new_node, xbs_message_sender.NODELIST);
#endif
            lock (this)
            {
                foreach (xbs_node node in node_list)
                {
                    if (!new_node.Equals(node))
                    {
                        new_node.sendKnownNodeMessage(node);
                    }
                }
            }
        }
Пример #20
0
        public void tryAddingNode(xbs_node new_node, String cloudname)
        {
            if (findNodeInAddingList(new_node.ip_public, new_node.port_public) != null)
            {
#if DEBUG
                xbs_messages.addDebugMessage(" + node already in addingList: " + new_node, xbs_message_sender.NODELIST);
#endif
                return;
            }
            lock (node_list_adding)
                node_list_adding.Add(new_node);
            //new_node.sendAddNodeMessage(local_node);
            xbs_node_message_announce msg = new xbs_node_message_announce(new_node.getSendToIP(), new_node.getSendToPort());
            if (cloudname != null)
            {
                msg.addOption(xbs_node_message_announce.OPTION_CLOUDNAME, cloudname);
            }
            new_node.sendNodeMessage(msg);
        }
Пример #21
0
        private void purgeAddedNodeFromAddingList(xbs_node new_node)
        {
#if DEBUG
            xbs_messages.addInfoMessage("+ trying to purged node from node_list_adding : " + new_node, xbs_message_sender.NODELIST);
#endif
            lock (node_list_adding)
            {
                for (int i = 0; i < node_list_adding.Count; i++)
                {
                    if (node_list_adding[i].Equals(new_node))
                    {
                        node_list_adding.RemoveAt(i);
#if DEBUG
                        xbs_messages.addInfoMessage("+ purged node from node_list_adding : " + new_node, xbs_message_sender.NODELIST);
#endif
                        break;
                    }
                }
            }
        }
Пример #22
0
        public void delNode(xbs_node node)
        {
            xbs_node deleted_node = null;

            lock (this)
            {
                foreach (xbs_node n in node_list)
                {
                    if (n.Equals(node))
                    {
                        xbs_messages.addInfoMessage(" + removed node " + n, xbs_message_sender.NODELIST);
                        deleted_node = n;
                        node_list.Remove(n);
                        if (notify_on_new_node)
                        {
                            System.Media.SoundPlayer sound_player = new System.Media.SoundPlayer();
                            sound_player.SoundLocation = xbs_node_list.NOTIFICATION_SOUND_NODE_LEFT;
                            try
                            {
                                sound_player.Play();
                            }
                            catch (Exception)
                            {
                            }
                        }
                        listHasJustChanged();
                        break;
                    }
                }
            }
            if (node.get_xbox_count() > 0)
            {
                foreach (xbs_xbox xbox in node.getXboxArray())
                {
                    xbs_nat.getInstance().informOfRemovedDevice(xbox.mac);
                }
            }
        }
Пример #23
0
 public xbs_node_message_pong(xbs_node node, byte[] data)
 {
     this.data = data;
     data_len = (UInt16)data.Length;
     type = ttype;
     data_len = 0;
     receiver = node;
 }
Пример #24
0
 public xbs_node_message_options(xbs_node node)
     : base(node, null)
 {
     data_len = 0;
     receiver = node;
 }
Пример #25
0
        public void updateNodeInCloud( String row_data )
        {
            IPAddress ip;
            int port;
            try
            {
                NameValueCollection node_data = HttpUtility.ParseQueryString( row_data );
                ip = IPAddress.Parse(node_data[xbs_cloudlist_getparameters.NODEIP]);
                port = int.Parse(node_data[xbs_cloudlist_getparameters.NODEPORT]);
            }
            catch (Exception e)
            {
                xbs_messages.addInfoMessage("!! Error getting updating node data: " + e.Message, xbs_message_sender.CLOUDLIST, xbs_message_type.ERROR);
                return;
            }
            xbs_node_list node_list = xbs_node_list.getInstance();
            if (node_list != null)
            {
                xbs_node node = node_list.findNode(ip, port);
                if (node == null)
                {
                    node = new xbs_node(ip, port);
                    if (!node_list.local_node.Equals(node))
                    {
#if DEBUG
                        xbs_messages.addDebugMessage(" x found new node in cloudlist update: " + node, xbs_message_sender.CLOUDLIST);
#endif
                        node_list.tryAddingNode(node, current_cloudname);
                    }
                }
            }
        }
Пример #26
0
 public xbs_node_message_clientversion(xbs_node node, String version_string)
 {
     type = ttype;
     data = getVersionStringByteArray(version_string);
     data_len = 4;
     receiver = node;
 }
Пример #27
0
        public void injectRemotePacket(ref byte[] data, PhysicalAddress dstMAC, PhysicalAddress srcMAC, ref xbs_node sending_node)
        {
            Packet       p      = null;
            ARPPacket    p_arp  = null;
            IPv4Packet   p_ipv4 = null;
            ICMPv4Packet p_icmp = null;
            UdpPacket    p_udp  = null;
            TcpPacket    p_tcp  = null;

            IPAddress source_IP = null;

            int srcMac_hash = srcMAC.GetHashCode();

            // collect all injected source MACs. sniffer needs this to filter packets out
            lock (injected_macs_hash)
            {
                if (!injected_macs_hash.Contains(srcMac_hash))
                {
                    injected_macs_hash.Add(srcMac_hash);
                    addMacToKnownMacListFromRemoteNodes(srcMAC);
                }
            }

            if (sending_node != null)
            {
                if (sending_node.addXbox(srcMAC))
                {
                    node_list.listHasJustChanged();
                }
            }

            try
            {
                p = Packet.ParsePacket(LinkLayers.Ethernet, data);
            }
            catch (PcapException pcex)
            {
#if DEBUG
                xbs_messages.addDebugMessage("!! ERROR! parse packet failed in injectRemotePacket (1): " + pcex.ToString(), xbs_message_sender.SNIFFER, xbs_message_type.ERROR);
#endif
                return;
            }
            catch (NotImplementedException niex)
            {
#if DEBUG
                xbs_messages.addDebugMessage("!! ERROR! parse packet failed in injectRemotePacket (2): " + niex.ToString(), xbs_message_sender.SNIFFER, xbs_message_type.ERROR);
#endif
                return;
            }

            // DETERMINE PACKET TYPE
            if (p.PayloadPacket is IPv4Packet)
            {
                p_ipv4    = p.PayloadPacket as IPv4Packet;
                source_IP = p_ipv4.SourceAddress;
                if (p_ipv4.PayloadPacket is UdpPacket)
                {
                    p_udp = p_ipv4.PayloadPacket as UdpPacket;
                }
                else if (p_ipv4.PayloadPacket is TcpPacket)
                {
                    p_tcp = p_ipv4.PayloadPacket as TcpPacket;
                }
            }
            else if (p.PayloadPacket is ARPPacket)
            {
                p_arp     = p.PayloadPacket as ARPPacket;
                source_IP = p_arp.SenderProtocolAddress;
            }
            else if (p.PayloadPacket is ICMPv4Packet)
            {
                p_icmp = p.PayloadPacket as ICMPv4Packet;
            }
            else
            {
                // UNKNOWN OR UNSUPPORTED PACKET TYPE
#if DEBUG
                //xbs_messages.addDebugMessage("?? WARNING! unknown incoming packet type: " + p.ToString(), xbs_message_sender.SNIFFER, xbs_message_type.WARNING);
#endif
                return;
            }

            // filter packet if needed
            if (is_injected_packet_to_be_filtered(ref p_arp, ref p_ipv4, ref p_udp, ref p_tcp))
            {
#if DEBUG
                xbs_messages.addDebugMessage("i> filtered packet: " + p, xbs_message_sender.SNIFFER);
#endif
                return;
            }

            // add IP to device from node
            if (sending_node != null && source_IP != null)
            {
                if (sending_node.addIPtoXbox(srcMAC, source_IP))
                {
#if DEBUG
                    xbs_messages.addDebugMessage("i> added new IP " + source_IP + " to xbox " + srcMAC + " for node " + sending_node, xbs_message_sender.SNIFFER);
#endif
                    node_list.listHasJustChanged();
                }
            }

#if DEBUG
            xbs_messages.addDebugMessage("i> " + p, xbs_message_sender.SNIFFER);
#endif
            if (NAT.NAT_enabled)
            {
#if DEBUG
                System.Diagnostics.Stopwatch stopWatch = new System.Diagnostics.Stopwatch();
                stopWatch.Start();
#endif
                EthernetPacketType p_type = NAT.NAT_incoming_packet_PacketDotNet(ref data, dstMAC, srcMAC, ref p, ref p_ipv4, ref p_arp);
#if DEBUG
                stopWatch.Stop();
                if (p_type == EthernetPacketType.IpV4)
                {
                    xbs_sniffer_statistics.NAT_callCount++;
                    if (xbs_sniffer_statistics.NAT_callCount > 1)
                    {
                        xbs_sniffer_statistics.NAT_timeInCode += (UInt64)stopWatch.ElapsedTicks;
                        UInt32 average    = (UInt32)(xbs_sniffer_statistics.NAT_timeInCode / (xbs_sniffer_statistics.NAT_callCount - 1));
                        double average_ms = new TimeSpan(average).TotalMilliseconds;
                        xbs_messages.addDebugMessage("- NAT time: " + stopWatch.ElapsedTicks + "t/" + stopWatch.ElapsedMilliseconds + "ms | NAT count: " + (xbs_sniffer_statistics.NAT_callCount - 1) + " Total Time: " + xbs_sniffer_statistics.NAT_timeInCode + "t=> Average " + average + "t / " + average_ms + "ms", xbs_message_sender.SNIFFER);
                    }
                }
                p = Packet.ParsePacket(LinkLayers.Ethernet, data);
                xbs_messages.addDebugMessage("i> " + p, xbs_message_sender.SNIFFER);
#endif
            }

            // inject the packet
            try
            {
                pdev.SendPacket(data, data.Length);
            }
            catch (PcapException pex)
            {
                xbs_messages.addInfoMessage("!! error while injecting packet from " + srcMAC + " to " + dstMAC + " (" + data.Length + ") : " + pex.Message, xbs_message_sender.SNIFFER, xbs_message_type.FATAL_ERROR);
            }
            catch (ArgumentException aex)
            {
                xbs_messages.addInfoMessage("!! error while injecting packet from " + srcMAC + " to " + dstMAC + " (" + data.Length + ") : " + aex.Message, xbs_message_sender.SNIFFER, xbs_message_type.FATAL_ERROR);
            }
        }
Пример #28
0
        private void dispatch_DATA_message(ref xbs_udp_message udp_msg, ref xbs_node sending_node)
        {
            if (xbs_sniffer.getInstance() == null)
                return;
            byte[] src_mac = new byte[6];
            byte[] dst_mac = new byte[6];
            Buffer.BlockCopy(udp_msg.data, 0, dst_mac, 0, 6);
            PhysicalAddress dstMAC = new PhysicalAddress(dst_mac);
            Buffer.BlockCopy(udp_msg.data, 6, src_mac, 0, 6);
            PhysicalAddress srcMAC = new PhysicalAddress(src_mac);
#if DEBUG
            //xbs_messages.addDebugMessage(" * DATA (" + udp_msg.data.Length + ") | " + srcMAC + " => " + dstMAC, xbs_message_sender.UDP_LISTENER);
#endif
            xbs_sniffer.getInstance().injectRemotePacket(ref udp_msg.data, dstMAC, srcMAC, ref sending_node);
        }
Пример #29
0
 public xbs_node_message_announce(xbs_node node)
     : base(node)
 {
     type = ttype;
 }
Пример #30
0
 public void delNode(xbs_node node)
 {
     xbs_node deleted_node = null;
     lock (this)
     {
         foreach (xbs_node n in node_list)
             if (n.Equals(node))
             {
                 xbs_messages.addInfoMessage(" + removed node " + n, xbs_message_sender.NODELIST);
                 deleted_node = n;
                 node_list.Remove(n);
                 if (notify_on_new_node)
                 {
                     System.Media.SoundPlayer sound_player = new System.Media.SoundPlayer();
                     sound_player.SoundLocation = xbs_node_list.NOTIFICATION_SOUND_NODE_LEFT;
                     try
                     {
                         sound_player.Play();
                     }
                     catch (Exception)
                     {
                     }
                 }
                 listHasJustChanged();
                 break;
             }
     }
     if (node.get_xbox_count() > 0)
         foreach (xbs_xbox xbox in node.getXboxArray())
             xbs_nat.getInstance().informOfRemovedDevice(xbox.mac);
 }
Пример #31
0
        public void sendNodeListToNode(xbs_node new_node)
        {
#if DEBUG
            xbs_messages.addInfoMessage(" + sending Nodelist to " + new_node, xbs_message_sender.NODELIST);
#endif
            lock (this)
            {
                foreach (xbs_node node in node_list)
                    if (!new_node.Equals(node))
                        new_node.sendKnownNodeMessage(node);
            }
        }
Пример #32
0
 public void informNodesOnAddNode(xbs_node new_node)
 {
     xbs_messages.addInfoMessage(" + informing all nodes of new node " + new_node, xbs_message_sender.NODELIST);
     lock (this)
     {
         foreach (xbs_node node in node_list)
             if (!node.Equals(new_node))
                 node.sendAddNodeMessage(new_node);
     }
 }
Пример #33
0
 public void informNodesOnDelNode(xbs_node node)
 {
     xbs_messages.addInfoMessage(" + informing all nodes of removed node " + node, xbs_message_sender.NODELIST);
     lock (this)
     {
         foreach (xbs_node n in node_list)
             if (!node.Equals(n))
                 n.sendDelNodeMessage(node);
     }
 }
Пример #34
0
        public void tryAddingNode(xbs_node new_node, String cloudname)
        {
            if (findNodeInAddingList(new_node.ip_public, new_node.port_public) != null)
            {
#if DEBUG
                xbs_messages.addDebugMessage(" + node already in addingList: " + new_node, xbs_message_sender.NODELIST);
#endif
                return;
            }
            lock (node_list_adding)
                node_list_adding.Add(new_node);
            //new_node.sendAddNodeMessage(local_node);
            xbs_node_message_announce msg = new xbs_node_message_announce(new_node.getSendToIP(), new_node.getSendToPort());
            if (cloudname!=null)
                msg.addOption(xbs_node_message_announce.OPTION_CLOUDNAME, cloudname);
            new_node.sendNodeMessage(msg);
        }
Пример #35
0
 private xbs_node_message_announce(xbs_node node, String options)
     : base(node, options)
 {
     type = ttype;
 }
Пример #36
0
 public xbs_node_message_nickname(xbs_node node, String nickname)
     : base(node, nickname)
 {
     type = ttype;
 }
Пример #37
0
 private xbs_node_message_announce(xbs_node node, String options)
     : base(node, options)
 {
     type = ttype;
 }
Пример #38
0
 public xbs_node_message_data(xbs_node node, byte[] data_bytes)
 {
     type = ttype;
     data = data_bytes;
     data_len = (UInt16)data.Length;
     receiver = node;
 }
Пример #39
0
        private void purgeAddedNodeFromAddingList(xbs_node new_node)
        {
#if DEBUG
            xbs_messages.addInfoMessage("+ trying to purged node from node_list_adding : " + new_node, xbs_message_sender.NODELIST);
#endif
            lock (node_list_adding)
            {
                for (int i=0;i<node_list_adding.Count;i++)
                    if (node_list_adding[i].Equals(new_node))
                    {
                        node_list_adding.RemoveAt(i);
#if DEBUG
                        xbs_messages.addInfoMessage("+ purged node from node_list_adding : " + new_node, xbs_message_sender.NODELIST);
#endif
                        break;
                    }
            }
        }
Пример #40
0
 public xbs_node addNode(IPAddress ip_announced, int port_announced, IPAddress ip_from, int port_from)
 {
     xbs_node node = new xbs_node(ip_announced, port_announced, ip_from, port_from);          
     addNode( node );
     return node;
 }
Пример #41
0
        public void injectRemotePacket(ref byte[] data, PhysicalAddress dstMAC, PhysicalAddress srcMAC, ref xbs_node sending_node)
        {
            Packet p = null;
            ARPPacket p_arp = null;
            IPv4Packet p_ipv4 = null;
            ICMPv4Packet p_icmp = null;
            UdpPacket p_udp = null;
            TcpPacket p_tcp = null;

            IPAddress source_IP = null;

            int srcMac_hash = srcMAC.GetHashCode();
            // collect all injected source MACs. sniffer needs this to filter packets out
            lock (injected_macs_hash)
            {
                if (!injected_macs_hash.Contains(srcMac_hash))
                {
                    injected_macs_hash.Add(srcMac_hash);
                    addMacToKnownMacListFromRemoteNodes(srcMAC);
                }
            }

            if (sending_node != null)
                if (sending_node.addXbox(srcMAC))
                    node_list.listHasJustChanged();

            try
            {
                p = Packet.ParsePacket(LinkLayers.Ethernet, data);
            }
            catch (PcapException pcex)
            {
#if DEBUG
                xbs_messages.addDebugMessage("!! ERROR! parse packet failed in injectRemotePacket (1): " + pcex.ToString(), xbs_message_sender.SNIFFER, xbs_message_type.ERROR);
#endif
                return;
            }
            catch (NotImplementedException niex)
            {
#if DEBUG
                xbs_messages.addDebugMessage("!! ERROR! parse packet failed in injectRemotePacket (2): " + niex.ToString(), xbs_message_sender.SNIFFER, xbs_message_type.ERROR);
#endif
                return;
            }

            // DETERMINE PACKET TYPE
            if (p.PayloadPacket is IPv4Packet)
            {
                p_ipv4 = p.PayloadPacket as IPv4Packet;
                source_IP = p_ipv4.SourceAddress;
                if (p_ipv4.PayloadPacket is UdpPacket)
                    p_udp = p_ipv4.PayloadPacket as UdpPacket;
                else if (p_ipv4.PayloadPacket is TcpPacket)
                    p_tcp = p_ipv4.PayloadPacket as TcpPacket;
            }
            else if (p.PayloadPacket is ARPPacket)
            {
                p_arp = p.PayloadPacket as ARPPacket;
                source_IP = p_arp.SenderProtocolAddress;            
            }
            else if (p.PayloadPacket is ICMPv4Packet)
                p_icmp = p.PayloadPacket as ICMPv4Packet;
            else
            {
                // UNKNOWN OR UNSUPPORTED PACKET TYPE
#if DEBUG
                //xbs_messages.addDebugMessage("?? WARNING! unknown incoming packet type: " + p.ToString(), xbs_message_sender.SNIFFER, xbs_message_type.WARNING);
#endif
                return;
            }

            // filter packet if needed
            if (is_injected_packet_to_be_filtered(ref p_arp, ref p_ipv4, ref p_udp, ref p_tcp))
            {
#if DEBUG
                xbs_messages.addDebugMessage("i> filtered packet: " + p, xbs_message_sender.SNIFFER);
#endif
                return;
            }

            // add IP to device from node
            if (sending_node != null && source_IP!=null)
                if (sending_node.addIPtoXbox(srcMAC, source_IP))
                {
#if DEBUG
                    xbs_messages.addDebugMessage("i> added new IP "+source_IP+" to xbox "+srcMAC+" for node " + sending_node, xbs_message_sender.SNIFFER);
#endif
                    node_list.listHasJustChanged();
                }

#if DEBUG
            xbs_messages.addDebugMessage("i> " + p, xbs_message_sender.SNIFFER);
#endif
            if (NAT.NAT_enabled)
            {
#if DEBUG
                System.Diagnostics.Stopwatch stopWatch = new System.Diagnostics.Stopwatch();
                stopWatch.Start();
#endif
                EthernetPacketType p_type = NAT.NAT_incoming_packet_PacketDotNet(ref data, dstMAC, srcMAC, ref p, ref p_ipv4, ref p_arp);
#if DEBUG
                stopWatch.Stop();
                if (p_type == EthernetPacketType.IpV4)
                {
                    xbs_sniffer_statistics.NAT_callCount++;
                    if (xbs_sniffer_statistics.NAT_callCount > 1)
                    {
                        xbs_sniffer_statistics.NAT_timeInCode += (UInt64)stopWatch.ElapsedTicks;
                        UInt32 average = (UInt32)(xbs_sniffer_statistics.NAT_timeInCode / (xbs_sniffer_statistics.NAT_callCount - 1));
                        double average_ms = new TimeSpan(average).TotalMilliseconds;
                        xbs_messages.addDebugMessage("- NAT time: " + stopWatch.ElapsedTicks + "t/" + stopWatch.ElapsedMilliseconds + "ms | NAT count: " + (xbs_sniffer_statistics.NAT_callCount - 1) + " Total Time: " + xbs_sniffer_statistics.NAT_timeInCode + "t=> Average " + average + "t / " + average_ms + "ms", xbs_message_sender.SNIFFER);
                    }
                }
                p = Packet.ParsePacket(LinkLayers.Ethernet, data);
                xbs_messages.addDebugMessage("i> " + p, xbs_message_sender.SNIFFER);
#endif
            }

            // inject the packet 
            try
            {
                pdev.SendPacket(data, data.Length);
            }
            catch (PcapException pex)
            {
                xbs_messages.addInfoMessage("!! error while injecting packet from " + srcMAC + " to " + dstMAC + " (" + data.Length + ") : " + pex.Message, xbs_message_sender.SNIFFER, xbs_message_type.FATAL_ERROR);
            }
            catch (ArgumentException aex)
            {
                xbs_messages.addInfoMessage("!! error while injecting packet from " + srcMAC + " to " + dstMAC + " (" + data.Length + ") : " + aex.Message, xbs_message_sender.SNIFFER, xbs_message_type.FATAL_ERROR);
            }
        }
Пример #42
0
 public xbs_node_message_getnickname(xbs_node node)
 {
     type = ttype;
     data_len = 0;
     receiver = node;
 }
Пример #43
0
 public xbs_node_message_chatmsg(xbs_node node, String chat_message) 
     : base (node, chat_message)
 {
     type = ttype;
 }
Пример #44
0
 public xbs_node_message_nickname(xbs_node node, String nickname)
     : base(node, nickname)
 {
     type = ttype;
 }
Пример #45
0
        private void updateNodeInMainInfoList(xbs_node node)
        {
            ListViewItem lv_item = new ListViewItem(node.ip_public.ToString());
            
            lv_item.SubItems.Add((node.port_sendfrom == node.port_public) ? node.port_public.ToString() : node.port_public + "/" + node.port_sendfrom);
            String ping = (node.last_ping_delay_ms >= 0) ? node.last_ping_delay_ms + "ms" : "N/A";
            lv_item.SubItems.Add(ping);
            lv_item.SubItems.Add(node.client_version);
            lv_item.SubItems.Add(node.nickname);
            lv_item.BackColor = (node.get_xbox_count() == 0) ? Color.FromArgb(255, 235, 235) : Color.FromArgb(235, 255, 235);
            lv_item.Name = lv_item.Text + lv_item.SubItems[1];

            int index = listView_nodes.Items.IndexOfKey(lv_item.Name);
            ListViewItem lv_item_in_list = (index>=0) ? listView_nodes.Items[index] : null;
            if (lv_item_in_list != null)
            {
                for (int i=2; i<=4; i++)
                    if (lv_item_in_list.SubItems[i].Text != lv_item.SubItems[i].Text)
                        lv_item_in_list.SubItems[i].Text = lv_item.SubItems[i].Text;
                if (lv_item.BackColor != lv_item_in_list.BackColor)
                    lv_item_in_list.BackColor = lv_item.BackColor;
            }
            else
                listView_nodes.Items.Add(lv_item);
        }
Пример #46
0
 public void sendKnownNodeMessage(xbs_node node)
 {
     sendKnownNodeMessage(node.ip_public, (UInt16)node.port_public);
 }
Пример #47
0
 public xbs_node_message_getclientversion(xbs_node node)
 {
     type = ttype;
     data_len = 0;
     receiver = node;
 }
Пример #48
0
 public bool Equals(xbs_node node)
 {
     if (ip_announced!=null && node.ip_announced!=null)
         if (ip_announced.Equals(node.ip_announced) && port_announced == node.port_announced)
             return true;
     if (ip_sendfrom!=null && node.ip_sendfrom!=null)
         if (ip_sendfrom.Equals(node.ip_sendfrom) && port_sendfrom == node.port_sendfrom)
             return true;
     if (ip_public != null && node.ip_public != null)
         if (ip_public.Equals(node.ip_public) && port_public == node.port_public)
             return true;
     return false;
 }
Пример #49
0
 protected xbs_node_message_options(xbs_node node, String options)
     : base(node, options)
 {
     receiver = node;
 }
Пример #50
0
        public void sendDelNodeMessage(xbs_node node)
        {
#if DEBUG
            xbs_messages.addInfoMessage(" ~ sending DelNodeMessage to " + this + " for node " + node, xbs_message_sender.NODE);
#endif
            xbs_node_message_delnode msg = new xbs_node_message_delnode(node.ip_public, (UInt16)node.port_public);
            msg.receiver = this;
            sendNodeMessage(msg);
        }
Пример #51
0
 public xbs_node_message_announce(xbs_node node)
     : base(node)
 {
     type = ttype;
 }
Пример #52
0
 public void sendToCloudHelper_HelpWithNode(xbs_node node)
 {
     xbs_node_message_toCloudHelper_HelpWithNode msg = new xbs_node_message_toCloudHelper_HelpWithNode(node.ip_public, (UInt16)node.port_public);
     msg.receiver = this;
     sendNodeMessage(msg);
 }
Пример #53
0
        public xbs_node_message_ping(xbs_node node)
        {
            DateTime now = DateTime.Now;
            data = BitConverter.GetBytes(now.Ticks);
            data_len = (UInt16)data.Length;

            type = ttype;
            receiver = node;
        }
Пример #54
0
 public void send_fromCloudhelper_helpWithAddingNode(xbs_node node)
 {
     xbs_node_message_fromCloudHelper_ContactNode msg = new xbs_node_message_fromCloudHelper_ContactNode(node.ip_public, (UInt16)node.port_public);
     msg.receiver = this;
     sendNodeMessage(msg);
 }
Пример #55
0
 public xbs_node_message_getclientversion(xbs_node node)
 {
     type     = ttype;
     data_len = 0;
     receiver = node;
 }
Пример #56
0
        public void dispatch_in_msg(ref xbs_udp_message udp_msg)
        {
            xbs_node tmp_node = null;
            xbs_node sending_node = node_list.findNode(udp_msg.src_ip, udp_msg.src_port);
# if DEBUG
            if (udp_msg.msg_type != xbs_node_message_type.PING && udp_msg.msg_type != xbs_node_message_type.PONG)
            {
                String str_send_node = (sending_node == null) ? udp_msg.src_ip + ":" + udp_msg.src_port : sending_node.ToString() + " " + sending_node.nickname;
                //xbs_messages.addDebugMessage(" * IN " + udp_msg.msg_type + " " + str_send_node, xbs_message_sender.UDP_LISTENER);
            }
# endif
            switch (udp_msg.msg_type)
            {
                case xbs_node_message_type.DATA:
                    dispatch_DATA_message(ref udp_msg, ref sending_node);
                    break;

                case xbs_node_message_type.ANNOUNCE:
                    xbs_node_message_announce msg_announce = new xbs_node_message_announce(udp_msg.data);
                    tmp_node = new xbs_node(udp_msg.src_ip, udp_msg.src_port);
#if DEBUG
                    StringBuilder options_string = new StringBuilder();
                    foreach (KeyValuePair<string, string> item in msg_announce.getAllOptions())
                        options_string.Append(item.Key + "=" + item.Value + " ; ");
                    xbs_messages.addDebugMessage(" * IN ANNOUCE: " + tmp_node + " | options: " + options_string.ToString(), xbs_message_sender.UDP_LISTENER);
#endif
                    bool send_packet = true;
                    if (msg_announce.hasOption(xbs_node_message_announce.OPTION_CLOUDNAME))
                        if (!msg_announce.getOption(xbs_node_message_announce.OPTION_CLOUDNAME).Equals(xbs_cloudlist.getInstance().current_cloudname))
                            send_packet = false;
                    if (send_packet)
                        tmp_node.sendAddNodeMessage(node_list.local_node);
                    break;

                case xbs_node_message_type.KNOWNNODE:
                    xbs_node_message_knownnode msg_knownnode = new xbs_node_message_knownnode(udp_msg.data);
                    
                    // only accept KNOWNNODE messages when not part of a cloud
                    if (!xbs_cloudlist.getInstance().part_of_cloud)
                    {
                        tmp_node = node_list.findNode(msg_knownnode.ip, msg_knownnode.port);
                        if (tmp_node == null)
                        {
                            tmp_node = new xbs_node(msg_knownnode.ip, msg_knownnode.port);
#if DEBUG
                        xbs_messages.addDebugMessage(" * trying to add known node: " + tmp_node, xbs_message_sender.UDP_LISTENER);
#endif
                            node_list.tryAddingNode(tmp_node, xbs_cloudlist.getInstance().current_cloudname);
                        }
#if DEBUG
                        else
                            xbs_messages.addDebugMessage(" * already in contact with node: " + tmp_node, xbs_message_sender.UDP_LISTENER);
#endif
                    }

                    break;

                case xbs_node_message_type.ADDNODE:
                    xbs_node_message_addnode msg_addnode = new xbs_node_message_addnode(udp_msg.data);
# if DEBUG
                    xbs_messages.addDebugMessage(" * received ADDNODE from " + udp_msg.src_ip + ":" + udp_msg.src_port + " for " + msg_addnode.ip + ":" + msg_addnode.port, xbs_message_sender.UDP_LISTENER);
# endif
                    if (sending_node == null)
                    {   // node not known, add to nodelist
                        tmp_node = node_list.addNode(msg_addnode.ip, msg_addnode.port, udp_msg.src_ip, udp_msg.src_port);
                        tmp_node.sendAddNodeMessage(node_list.local_node);
                        if (!xbs_cloudlist.getInstance().part_of_cloud)
                            node_list.sendNodeListToNode(tmp_node);
                    }
                    break;

                case xbs_node_message_type.DELNODE:
                    xbs_node_message_delnode msg_delnode = new xbs_node_message_delnode(udp_msg.data);
# if DEBUG  
                    xbs_messages.addDebugMessage(" * received DELNODE from " + udp_msg.src_ip + ":" + udp_msg.src_port + " for " + msg_delnode.ip + ":" + msg_delnode.port, xbs_message_sender.UDP_LISTENER);
# endif
                    try
                    {
                        tmp_node = node_list.delNode(udp_msg.src_ip, (UInt16)udp_msg.src_port);
                    }
                    catch (Exception ex)
                    {
                        xbs_messages.addInfoMessage("!! error on deleting node: " + ex.Message, xbs_message_sender.UDP_LISTENER, xbs_message_type.ERROR);
                    }
                    if (tmp_node != null && xbs_chat.message_when_nodes_join_or_leave)
                        xbs_chat.addSystemMessage(tmp_node.nickname + " left.");
                    break;

                case xbs_node_message_type.PING:
                    tmp_node = (sending_node != null) ? sending_node : new xbs_node(udp_msg.src_ip, udp_msg.src_port);
                    xbs_node_message_pong msg_pong = new xbs_node_message_pong(tmp_node, udp_msg.data);
                    tmp_node.sendNodeMessage(msg_pong);
                    break;

                case xbs_node_message_type.PONG:
                    if (sending_node != null)
                    {
                        sending_node.pong(xbs_node_message_pong.getDelay(udp_msg.data).Milliseconds);
                        node_list.listHasJustChanged();
                    }
                    break;

                case xbs_node_message_type.GETNODELIST:
                    tmp_node = (sending_node != null) ? sending_node : new xbs_node(udp_msg.src_ip, udp_msg.src_port);
                    node_list.sendNodeListToNode(tmp_node);
                    break;
                
                case xbs_node_message_type.GETCLIENTVERSION:
                    tmp_node = (sending_node != null) ? sending_node : new xbs_node(udp_msg.src_ip, udp_msg.src_port);
                    xbs_node_message_clientversion msg_gcv = new xbs_node_message_clientversion(tmp_node, xbs_settings.xbslink_version);
                    tmp_node.sendNodeMessage(msg_gcv);
                    break;

                case xbs_node_message_type.CLIENTVERSION:
                    if (sending_node != null)
                    {
                        xbs_node_message_clientversion msg_cv = new xbs_node_message_clientversion(udp_msg.data);
                        sending_node.client_version = msg_cv.version_string;
                        node_list.listHasJustChanged();
                    }
                    break;
                case xbs_node_message_type.CHATMSG:
                    if (sending_node != null)
                    {
                        xbs_node_message_chatmsg msg_chat = new xbs_node_message_chatmsg(udp_msg.data);
                        xbs_chat.addChatMessage(sending_node.nickname, msg_chat.getChatMessage());
                    }
                    break;
                case xbs_node_message_type.NICKNAME:
                    if (sending_node != null)
                    {
                        xbs_node_message_nickname msg_nick = new xbs_node_message_nickname(udp_msg.data);
                        sending_node.nickname = msg_nick.getNickname();
                        sending_node.nickname_received = true;
                        node_list.listHasJustChanged();
                        if ( xbs_chat.message_when_nodes_join_or_leave )
                            xbs_chat.addSystemMessage(sending_node.nickname + " joined.");
                    }
                    break;
                case xbs_node_message_type.GETNICKNAME:
                    tmp_node = (sending_node!=null) ? sending_node : new xbs_node(udp_msg.src_ip, udp_msg.src_port);
                    xbs_node_message_nickname msg_snick = new xbs_node_message_nickname(tmp_node, node_list.local_node.nickname);
                    tmp_node.sendNodeMessage(msg_snick);
                    break;
                case xbs_node_message_type.SERVERHELLO:
                    lock (_locker_HELLO)
                    {
                        xbs_upnp.isPortReachable = true;
                        Monitor.PulseAll(_locker_HELLO);
                    }
                    break;
                case xbs_node_message_type.TO_CLOUDHELPER_HELPWITHNODE:
                    xbs_node_message_toCloudHelper_HelpWithNode msg_toCloudHelpWith = new xbs_node_message_toCloudHelper_HelpWithNode(udp_msg.data);
                    node_list.cloudhelper_helpWithNode(udp_msg.src_ip, udp_msg.src_port, msg_toCloudHelpWith.ip, msg_toCloudHelpWith.port);
                    break;
                case xbs_node_message_type.FROM_CLOUDHELPER_CONTACTNODE:
                    xbs_node_message_fromCloudHelper_ContactNode msg_fromCloudContactNode = new xbs_node_message_fromCloudHelper_ContactNode(udp_msg.data);
                    tmp_node = new xbs_node(msg_fromCloudContactNode.ip, msg_fromCloudContactNode.port);
                    node_list.tryAddingNode(tmp_node, xbs_cloudlist.getInstance().current_cloudname);
                    break;
            }

            if (sending_node != null)
                sending_node.statistics.receivedPacket((uint)udp_msg.data_len + xbs_udp_message.HEADER_LENGTH);
        }
Пример #57
0
 public xbs_node_message_chatmsg(xbs_node node, String chat_message)
     : base(node, chat_message)
 {
     type = ttype;
 }
Пример #58
0
 private void askCloudHelperToSendAddNodeMessage(xbs_node node)
 {
     xbs_node cloud_helper;
     lock (node_list)
     {
         cloud_helper = node_list.Count == 0 ? null : node_list[my_random.Next(0, node_list.Count - 1)];
     }
     if (cloud_helper == null)
         return;
     xbs_messages.addInfoMessage("+ asking ("+node.ask_cloudhelper_count+") cloud_helper (" + cloud_helper + ") for help to add node " + node, xbs_message_sender.NODELIST);
     cloud_helper.sendToCloudHelper_HelpWithNode(node);
 }
Пример #59
0
 public xbs_node_message_getnickname(xbs_node node)
 {
     type     = ttype;
     data_len = 0;
     receiver = node;
 }
Пример #60
0
 protected xbs_node_message_options(xbs_node node, String options)
     : base(node, options)
 {
     receiver = node;
 }