void pppEnd() { switch (pppStage) { case PPPStage.PPPS_None: break; case PPPStage.PPPS_Start: pppStage = PPPStage.PPPS_None; break; case PPPStage.PPPS_LCP: case PPPStage.PPPS_PAP: case PPPStage.PPPS_IPCP: case PPPStage.PPPS_IP: pppStage = PPPStage.PPPS_Disconnect; break; case PPPStage.PPPS_Disconnect: break; default: pppReset(); break; } }
void pppReset() { pppStage = PPPStage.PPPS_None; pppLCP = new pppPocket(); pppLCP.Protocol = 0xc021; pppLCP.ID = 1; pppLCP.Code = 0x01; pppLCP.AddCommand(0x02, 0x00, 0x00, 0x00, 0x00); Random x = new Random(); Union_UInt32 x32 = new Union_UInt32(); x32.ofs_32 = (uint)x.Next(); pppLCP.AddCommand(0x05, x32.ofs_h.ofs_h, x32.ofs_h.ofs_l, x32.ofs_l.ofs_h, x32.ofs_l.ofs_l); //pppLCP.AddCommand(0x07); //pppLCP.AddCommand(0x08); pppPAP = new pppPocket(); pppPAP.Protocol = 0xc023; pppPAP.Code = 0x01; pppPAP.ID = 1; byte[] Login = new byte[10] { 0x04, 0x6E, 0x6F, 0x6E, 0x65, 0x04, 0x6E, 0x6F, 0x6E, 0x65 }; pppPAP.Datas.AddRange(Login); pppIPCP = new pppPocket(); pppIPCP.Protocol = 0x8021; pppIPCP.Code = 0x01; pppIPCP.ID = 1; pppIPCP.AddCommand(0x03, 0x00, 0x00, 0x00, 0x00); //dIP = new byte[4]; ourPort = (ushort)x.Next(4097, 4106); TCPSeqNum = (uint)x.Next(1000, 5000); IPID = 0;//(ushort)x.Next(100, 500); pppIPCP.AddCommand(0x81, 0x00, 0x00, 0x00, 0x00); pppIPCP.AddCommand(0x83, 0x00, 0x00, 0x00, 0x00); DNS1 = new byte[4]; DNS2 = new byte[4]; theirIP = new byte[4]; pppAcceptedTheirLCPOptions = false; pppAcceptedOurLCPOptions = false; pppAcceptedIPOptions = false; pppAcceptedIPOptions1 = false; pppLogin = false; bLCP = false; bDataTransfer = false; bPPP = false; }
public bool pppProc(PPPStage ps) { int n = 0; int r = 5; while (true) { pppPocket pppUp = pppReader(); if (pppUp == null) { n++; if (n > r) { pppClose(); pppReset(); return(false); } } else { switch (pppUp.Protocol) { case 0xc021: LCP(pppUp); break; case 0xc023: PAP(pppUp); break; case 0x8021: IPCP(pppUp); break; } } switch (pppStage) { case PPPStage.PPPS_LCP: if (pppAcceptedOurLCPOptions && pppAcceptedTheirLCPOptions) { pppStage = PPPStage.PPPS_PAP; pppPAP.ID = pppLCP.ID; n = 0; r = 30; } else { pppSender(pppLCP); } break; case PPPStage.PPPS_PAP: if (!pppLogin) { pppSender(pppPAP); } else { pppStage = PPPStage.PPPS_IPCP; pppIPCP.ID = pppPAP.ID; n = 0; r = 100; Com.ReadTimeout = 5000; } break; case PPPStage.PPPS_IPCP: if (pppAcceptedIPOptions && pppAcceptedIPOptions1) { pppStage = PPPStage.PPPS_IP; } else if (!pppAcceptedIPOptions) { pppSender(pppIPCP); } break; case PPPStage.PPPS_IP: break; } if (pppStage == ps) { break; } } return(true); }
bool LCP(pppPocket pppUp) { pppStage = PPPStage.PPPS_LCP; if (pppUp == null) { return(false); } pppPocket pppDown; switch (pppUp.Code) { case 5: //Terminate-Request pppUp.Code = 0x06; pppSender(pppUp); pppReset(); return(true); case 6: //Terminate-Ack pppReset(); return(true); case 8: //Protocol-Reject pppEnd(); pppReset(); return(true); case 7: //Code-Reject pppEnd(); pppReset(); return(true); case 9: //Echo-Request { Union_UInt32 x32 = new Union_UInt32(); x32.ofs_h.ofs_h = pppUp.Datas[0]; x32.ofs_h.ofs_l = pppUp.Datas[1]; x32.ofs_l.ofs_h = pppUp.Datas[2]; x32.ofs_l.ofs_l = pppUp.Datas[3]; if (x32.ofs_32 != 0) { byte[] mn = (byte[])(pppLCP.Commands[(byte)0x05]); if (pppUp.Datas[0] != mn[0] || pppUp.Datas[1] != mn[1] || pppUp.Datas[2] != mn[2] || pppUp.Datas[3] != mn[3]) { if (pppAcceptedOurLCPOptions) { pppUp.Datas[0] = mn[0]; pppUp.Datas[1] = mn[1]; pppUp.Datas[2] = mn[2]; pppUp.Datas[3] = mn[3]; } else { pppUp.Datas[0] = 0; pppUp.Datas[1] = 0; pppUp.Datas[2] = 0; pppUp.Datas[3] = 0; } pppUp.Code = 0x10; pppSender(pppUp); return(true); } else { pppReset(); return(true); } } else { return(true); } } case 10: //Echo-Reply { Union_UInt32 x32 = new Union_UInt32(); x32.ofs_h.ofs_h = pppUp.Datas[0]; x32.ofs_h.ofs_l = pppUp.Datas[1]; x32.ofs_l.ofs_h = pppUp.Datas[2]; x32.ofs_l.ofs_l = pppUp.Datas[3]; if (x32.ofs_32 != 0) { byte[] mn = (byte[])(pppLCP.Commands[(byte)0x05]); if (pppUp.Datas[0] != mn[0] || pppUp.Datas[1] != mn[1] || pppUp.Datas[2] != mn[2] || pppUp.Datas[3] != mn[3]) { //是否应该有一些操作? return(true); } else { pppReset(); return(true); } } else { return(true); } } } if (pppStage == PPPStage.PPPS_None || pppStage == PPPStage.PPPS_Start || pppStage == PPPStage.PPPS_Disconnect) { return(true); } switch (pppUp.Code) { case 0x01: // Configure-Request(匹配请求) //首先找到我们不同意的请求,并给出建议值 bool bSend = false; pppDown = new pppPocket(); pppDown.Protocol = pppUp.Protocol; pppDown.Code = 0x03; pppDown.ID = pppUp.ID; foreach (DictionaryEntry comm in pppUp.Commands) { switch ((byte)comm.Key) { case 5: //Magic-Number { Union_UInt32 x32 = new Union_UInt32(); byte[] mn = (byte[])(pppUp.Commands[(byte)0x05]); x32.ofs_h.ofs_h = mn[0]; x32.ofs_h.ofs_l = mn[1]; x32.ofs_l.ofs_h = mn[2]; x32.ofs_l.ofs_l = mn[3]; if (x32.ofs_32 != 0) { byte[] mn1 = (byte[])(pppLCP.Commands[(byte)0x05]); if (mn[0] != mn1[0] || mn[1] != mn1[1] || mn[2] != mn1[2] || mn[3] != mn1[3]) { break; } else { Random x = new Random(); Union_UInt32 x321 = new Union_UInt32(); x32.ofs_32 = (uint)x.Next(); while (x321.ofs_32 == x32.ofs_32) { x32.ofs_32 = (uint)x.Next(); } pppDown.AddCommand(0x05, x321.ofs_h.ofs_h, x321.ofs_h.ofs_l, x321.ofs_l.ofs_h, x321.ofs_l.ofs_l); bSend = true; break; } } else { break; } } case 1: //Maximum-Receive-Unit(最大-接收-单元) byte[] mru = (byte[])(pppUp.Commands[(byte)0x01]); ushort w = BytesOP.MakeShort(mru[0], mru[1]); if (w < 128) { w = 128; } else if (w > 1500) { w = 1500; } else { break; } pppDown.AddCommand(0x01, BytesOP.GetHighByte(w), BytesOP.GetLowByte(w)); bSend = true; break; case 3: //Authentication-Protocol(鉴定-协议) byte[] ap = (byte[])(pppUp.Commands[(byte)0x03]); ushort AP = BytesOP.MakeShort(ap[0], ap[1]); if (AP == 0xc023) { break; } pppDown.AddCommand(0x03, 0xc0, 0x23); bSend = true; break; } } if (bSend) { pppSender(pppDown); return(true); } //去掉我们所不能接受的配置 pppDown.Code = 0x04; foreach (DictionaryEntry comm in pppUp.Commands) { switch ((byte)comm.Key) { case 5: //Magic-Number break; case 1: //Maximum-Receive-Unit(最大-接收-单元) break; case 2: //Async-Control-Character-Map(异步-控制-字符-映射) break; case 3: //Authentication-Protocol(鉴定-协议) break; default: bSend = true; byte[] bs = (byte[])(pppUp.Commands[(byte)comm.Key]); pppDown.AddCommand((byte)comm.Key, bs); break; } } if (bSend) { pppSender(pppDown); pppLCP.ID++; return(true); } //到此接受所有的服务器配置 pppAcceptedTheirLCPOptions = true; pppUp.Code = 0x02; pppSender(pppUp); return(true); case 2: // Configure-Ack pppAcceptedOurLCPOptions = true; return(true); case 3: //Configure-Nak foreach (DictionaryEntry comm in pppUp.Commands) { switch ((byte)comm.Key) { case 1: //Maximum-Receive-Unit(最大-接收-单元) pppLCP.RemoveCommand(0x01); byte[] mru = (byte[])(pppUp.Commands[(byte)0x01]); pppLCP.AddCommand(0x01, mru[0], mru[1]); break; case 5: //Magic-Number pppLCP.RemoveCommand(0x05); byte[] mn = (byte[])(pppUp.Commands[(byte)0x05]); pppLCP.AddCommand(0x01, mn[0], mn[1], mn[2], mn[3]); break; case 2: //Async-Control-Character-Map(异步-控制-字符-映射) pppLCP.RemoveCommand(0x02); byte[] accm = (byte[])(pppUp.Commands[(byte)0x02]); pppLCP.AddCommand(0x01, accm[0], accm[1], accm[2], accm[3]); break; } } pppAcceptedOurLCPOptions = false; return(true); case 4: //Configure-Reject foreach (DictionaryEntry comm in pppUp.Commands) { switch ((byte)comm.Key) { case 1: //Maximum-Receive-Unit(最大-接收-单元) pppLCP.RemoveCommand(0x01); break; case 5: //Magic-Number pppLCP.RemoveCommand(0x05); break; case 2: //Async-Control-Character-Map(异步-控制-字符-映射) pppLCP.RemoveCommand(0x02); break; } } pppAcceptedOurLCPOptions = false; return(true); default: pppCodeReject(pppUp); return(true); } }