public List <byte> MakeHeartbeat(byte[] sip, byte[] challenge_seed, bool first = false) { List <byte> data = new List <byte>(); // DrcomDialExtProtoHeader - 5 bytes data.Add(0x07); // code data.Add(count); // id data.AddRange(new byte[] { 0x60, 0x00 }); // length data.Add(0x03); // type data.Add(0x00); // uid length data.AddRange(new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }); // mac data.AddRange(sip); // AuthHostIP if (first) { data.AddRange(new byte[] { 0x00, 0x62, 0x00 }); data.Add(pppoe_flag); } else { data.AddRange(new byte[] { 0x00, 0x63, 0x00 }); data.Add(pppoe_flag); } data.AddRange(challenge_seed); // Challenge Seed int encrypt_mode = BitConverter.ToInt32(challenge_seed, 0) & 3; Tuple <List <byte>, bool> res = KA2.GenerateCRC(challenge_seed, encrypt_mode); List <byte> crc = res.Item1; bool foo = res.Item2; data.AddRange(crc); if (foo == false) { int crc2 = (DrcomCRC32(data.ToArray()) * 19680126) /*& 0xFFFFFFFF*/; data.RemoveRange(data.Count - 8, 8); data.AddRange(BitConverter.GetBytes(crc2)); data.AddRange(new byte[] { 0x00, 0x00, 0x00, 0x00 }); } for (int i = 0; i < 4; i++) { for (int j = 0; j < 16; j++) { data.Add(0x00); } } return(data); }
public static List <byte> KeepAlivePackageBuilder(byte number, int random, byte[] tail, byte type = 1, bool first = false) { List <byte> data = new List <byte>(); data.Add(0x07); data.Add(number); data.AddRange(new byte[] { 0x28, 0x00, 0x0b }); data.Add(type); if (first) { data.AddRange(new byte[] { 0x0f, 0x27 }); } else { data.AddRange(new byte[] { keep_alive2_flag, 0x02 }); } data.AddRange(new byte[] { 0x2f, 0x12 }); for (int i = 0; i < 6; i++) { data.Add(0x00); } data.AddRange(tail); if (type == 3) { byte[] foo = new byte[] { 0x00, 0x00, 0x00, 0x00 }; int encrypt_mode = BitConverter.ToInt32(tail, 0) & 3; Tuple <List <byte>, bool> res = KA2.GenerateCRC(data.ToArray(), encrypt_mode); List <byte> crc = res.Item1; bool val = res.Item2; data.AddRange(crc); data.AddRange(foo); for (int i = 0; i < 8; i++) { data.Add(0x00); } } else //packet type = 1 { for (int i = 0; i < 20; i++) { data.Add(0x00); } } return(data); }
public static void BeginHeartbeat(Func <Exception, bool> OnException) { onException = OnException; unchecked { if (!BitConverter.IsLittleEndian) { exit = onException(new SystemException("Unsupported system")); if (exit) { return; } } Socketx s = new Socketx(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Unspecified); while (!exit) { PPPOEHeartbeat pppoe = new PPPOEHeartbeat(); pppoe.Send(s); KA2.KeepAlive2(s, pppoe); } } }