Ejemplo n.º 1
0
        //htonl(0x7F000001); // 127.0.0.1
        public void Append(IPEndPoint source, IPEndPoint destination, ProtocolType protocol, byte[] payload, DateTime?timestamp = null)
        {
            PcapItemHeader packetHeader;
            Ethernet       packetEthernet;
            IPv4           packetIP;

            byte[] sourceBytes, destinationBytes;

            byte[] payloadItemHeader, payloadEthernet, payloadIP, payloadTransport, payloadData;
            int    index;

            switch (protocol)
            {
            case ProtocolType.Udp:
                UDP packetUDP;
                packetUDP        = new UDP((UInt16)source.Port, (UInt16)destination.Port, (UInt16)payload.Length);
                payloadTransport = packetUDP.GetBytes();
                break;

            case ProtocolType.Tcp:
                TCP    packetTCP;
                UInt16 connection1, connection2;

                UInt64 seqAck;
                UInt32 seq, ack;

                connection1 = tcpConnectionId(source, destination);
                connection2 = tcpConnectionId(destination, source);
                if (tcpWindows.ContainsKey(connection1))
                {
                    seqAck = tcpWindows[connection1];
                    seq    = (UInt32)(seqAck >> 32);
                    ack    = (UInt32)seqAck;
                }
                else
                {
                    seq    = 1;
                    ack    = 1;
                    seqAck = ((UInt64)seq << 32) | ack;
                    tcpWindows.Add(connection1, seqAck);
                }

                packetTCP = new TCP((UInt16)source.Port, (UInt16)destination.Port, seq, ack);

                seq   += (UInt32)payload.Length;
                seqAck = ((UInt64)seq << 32) | ack;
                tcpWindows[connection1] = seqAck;

                if (tcpWindows.ContainsKey(connection2))
                {
                    seqAck = tcpWindows[connection2];
                    seq    = (UInt32)(seqAck >> 32);
                    ack    = (UInt32)payload.Length;

                    seqAck = ((UInt64)seq << 32) | ack;
                    tcpWindows[connection2] = seqAck;
                }
                else
                {
                    seq = 1;
                    ack = (UInt32)payload.Length;

                    seqAck = ((UInt64)seq << 32) | ack;
                    tcpWindows.Add(connection2, seqAck);
                }

                payloadTransport = packetTCP.GetBytes();
                break;

            case ProtocolType.IP:
                payloadTransport = new byte[] { };
                break;

            default:
                throw new System.ArgumentException("This protocol is not supported", "protocol");
            }


            /* ipv4 */
            packetIP  = new IPv4(source.Address, destination.Address, protocol, (UInt16)(payloadTransport.Length + payload.Length));
            payloadIP = packetIP.GetBytes();

            /* ethernet */
            sourceBytes      = source.Address.GetAddressBytes();
            destinationBytes = destination.Address.GetAddressBytes();
            packetEthernet   = new Ethernet(new byte[3] {
                sourceBytes[1], sourceBytes[2], sourceBytes[3]
            }, new byte[3] {
                destinationBytes[1], destinationBytes[2], destinationBytes[3]
            });
            payloadEthernet = packetEthernet.GetBytes();

            /* pcap packet header */
            if (timestamp == null)
            {
                timestamp = DateTime.UtcNow;
            }
            packetHeader      = new PcapItemHeader((DateTime)timestamp, (UInt32)(payloadEthernet.Length + payloadIP.Length + payloadTransport.Length + payload.Length));
            payloadItemHeader = packetHeader.GetBytes();

            payloadData = new byte[payloadItemHeader.Length + payloadEthernet.Length + payloadIP.Length + payloadTransport.Length + payload.Length];

            index = 0;
            payloadItemHeader.CopyTo(payloadData, index);
            index += payloadItemHeader.Length;

            payloadEthernet.CopyTo(payloadData, index);
            index += payloadEthernet.Length;

            payloadIP.CopyTo(payloadData, index);
            index += payloadIP.Length;

            payloadTransport.CopyTo(payloadData, index);
            index += payloadTransport.Length;

            payload.CopyTo(payloadData, index);
            index += payload.Length;

            if (payloadData.Length != packetHeader.length + 16)
            {
                throw new Exception("Error of PCap. Possible bug");
            }

            content.Write(payloadData, 0, payloadData.Length);
        }