//���X�|���X�p�P�b�g�̑��M void Send(SockUdp sockUdp, PacketDhcp sp) { //���M sockUdp.Send(sp.GetBuffer()); //this.Logger.Set(LogKind.Detail,sockUdp,4,string.Format("{0} {1} {2}",sp.Mac,(sp.RequestIp == null) ? "0.0.0.0" : sp.RequestIp.ToString(),sp.Type.ToString())); Log(sockUdp, 4, sp.Mac, sp.RequestIp, sp.Type); }
public void RequestTest(string requestIpStr, string macStr, DhcpType ans) { const ushort id = 100; var requestIp = new Ip(requestIpStr); var serverIp = new Ip("127.0.0.1"); var mac = new Mac(macStr); var maskIp = new Ip("255.255.255.0"); var gwIp = new Ip("0.0.0.0"); var dnsIp0 = new Ip("0.0.0.0"); var dnsIp1 = new Ip("0.0.0.0"); var sp = new PacketDhcp(id, requestIp, serverIp, mac, DhcpType.Discover, 3600, maskIp, gwIp, dnsIp0, dnsIp1, ""); var bytes = sp.GetBuffer(); bytes[0] = 1;//Opecode = 2->1 var rp = Access(bytes); Assert.AreEqual(rp.Type, ans); }
public void ConnectTest() { const ushort id = 100; var requestIp = new Ip("127.0.0.1"); var serverIp = new Ip("127.0.0.1"); var mac = new Mac("11-22-33-44-55-66"); var maskIp = new Ip("255.255.255.0"); var gwIp = new Ip("255.255.255.0"); var dnsIp0 = new Ip("255.255.255.0"); var dnsIp1 = new Ip("255.255.255.0"); var sp = new PacketDhcp(id, requestIp, serverIp, mac, DhcpType.Discover, 3600, maskIp, gwIp, dnsIp0, dnsIp1, ""); var bytes = sp.GetBuffer(); bytes[0] = 1;//Opecode = 2->1 var rp = Access(bytes); Assert.AreEqual(rp.Type,DhcpType.Offer); }
//���X�|���X�p�P�b�g�̑��M void Send(SockUdp sockUdp,PacketDhcp sp) { //���M sockUdp.Send(sp.GetBuffer()); //this.Logger.Set(LogKind.Detail,sockUdp,4,string.Format("{0} {1} {2}",sp.Mac,(sp.RequestIp == null) ? "0.0.0.0" : sp.RequestIp.ToString(),sp.Type.ToString())); Log(sockUdp, 4, sp.Mac,sp.RequestIp,sp.Type); }
//�ڑ��P�ʂ̏��� protected override void OnSubThread(SockObj sockObj) { var sockUdp = (SockUdp)sockObj; if (sockUdp.RemoteAddress.Port != 68) {// �ڑ����|�[�g�ԍ���68�ȊO�́ADHCP�p�P�b�g�ł͂Ȃ��̂Ŕj������ return; } //�p�P�b�g�̓Ǎ�(��M�p�P�b�grp) var rp = new PacketDhcp(); if (!rp.Read(sockUdp.RecvBuf)) return; //�f�[�^��߂Ɏ��s�����ꍇ�́A�����Ȃ� if (rp.Opcode != 1) return;//OpCode���u�v���v�Ŗ����ꍇ�́A�������� //���M���u���[�h�L���X�g�ɐݒ肷�� var ep = new IPEndPoint(IPAddress.Broadcast, 68); sockUdp.RemoteAddress = ep; //******************************************************** // MAC���� //******************************************************** if ((bool)Conf.Get("useMacAcl")) {// MAC���䂪�L���ȏꍇ if (!_lease.SearchMac(rp.Mac)) { Logger.Set(LogKind.Secure,sockUdp,1,rp.Mac.ToString()); return; } } // �r������ (�f�[�^�x�[�X�����̂���) lock (_lockObj) { //�T�[�o�A�h���X Ip serverIp = rp.ServerIp; if (serverIp.AddrV4 == 0) { serverIp = new Ip(_serverAddress); } //���N�G�X�g�A�h���X Ip requestIp = rp.RequestIp; //this.Logger.Set(LogKind.Detail,sockUdp,3,string.Format("{0} {1} {2}",rp.Mac,requestIp.ToString(),rp.Type.ToString())); Log(sockUdp, 3, rp.Mac, requestIp, rp.Type); if (rp.Type == DhcpType.Discover) {// ���o requestIp = _lease.Discover(requestIp, rp.Id, rp.Mac); if(requestIp!=null){ // OFFER���M var sp = new PacketDhcp(rp.Id,requestIp,serverIp,rp.Mac,DhcpType.Offer,_leaseTime,_maskIp,_gwIp,_dnsIp0,_dnsIp1,_wpadUrl); Send(sockUdp,sp); } } else if (rp.Type == DhcpType.Request) {// �v�� requestIp = _lease.Request(requestIp, rp.Id, rp.Mac); if (requestIp != null) { if (serverIp.ToString() == _serverAddress) {// ���T�[�o���� // ACK���M var sp = new PacketDhcp(rp.Id,requestIp,serverIp,rp.Mac,DhcpType.Ack,_leaseTime,_maskIp,_gwIp,_dnsIp0,_dnsIp1,_wpadUrl); Send(sockUdp,sp); //this.Logger.Set(LogKind.Normal,sockUdp,5,string.Format("{0} {1} {2}",rp.Mac,requestIp.ToString(),rp.Type.ToString())); Log(sockUdp, 5, rp.Mac, requestIp, rp.Type); } else { _lease.Release(rp.Mac);//���������� } } else { // NACK���M var sp = new PacketDhcp(rp.Id,requestIp,serverIp,rp.Mac,DhcpType.Nak,_leaseTime,_maskIp,_gwIp,_dnsIp0,_dnsIp1,_wpadUrl); Send(sockUdp,sp); } } else if (rp.Type == DhcpType.Release) {// �J�� requestIp = _lease.Release(rp.Mac);//�J�� if(requestIp!=null) //this.Logger.Set(LogKind.Normal,sockUdp,6,string.Format("{0} {1} {2}",rp.Mac,requestIp.ToString(),rp.Type.ToString())); Log(sockUdp, 6, rp.Mac, requestIp, rp.Type); } else if (rp.Type == DhcpType.Infrm) {// ��� // ACK���M //Send(sockUdp,sp); } }// �r������ }
//�ڑ��P�ʂ̏��� override protected void OnSubThread(SockObj sockObj) { var sockUdp = (SockUdp)sockObj; if (sockUdp.RemoteAddress.Port != 68) // �ڑ����|�[�g�ԍ���68�ȊO�́ADHCP�p�P�b�g�ł͂Ȃ��̂Ŕj������ { return; } //�p�P�b�g�̓Ǎ�(��M�p�P�b�grp) var rp = new PacketDhcp(); if (!rp.Read(sockUdp.RecvBuf)) { return; //�f�[�^��߂Ɏ��s�����ꍇ�́A�����Ȃ� } if (rp.Opcode != 1) { return;//OpCode���u�v���v�Ŗ����ꍇ�́A�������� } //���M���u���[�h�L���X�g�ɐݒ肷�� var ep = new IPEndPoint(IPAddress.Broadcast, 68); sockUdp.RemoteAddress = ep; //******************************************************** // MAC���� //******************************************************** if ((bool)Conf.Get("useMacAcl")) // MAC���䂪�L���ȏꍇ { if (!_lease.SearchMac(rp.Mac)) { Logger.Set(LogKind.Secure, sockUdp, 1, rp.Mac.ToString()); return; } } // �r������ (�f�[�^�x�[�X�����̂���) lock (_lockObj) { //�T�[�o�A�h���X Ip serverIp = rp.ServerIp; if (serverIp.AddrV4 == 0) { serverIp = new Ip(_serverAddress); } //���N�G�X�g�A�h���X Ip requestIp = rp.RequestIp; //this.Logger.Set(LogKind.Detail,sockUdp,3,string.Format("{0} {1} {2}",rp.Mac,requestIp.ToString(),rp.Type.ToString())); Log(sockUdp, 3, rp.Mac, requestIp, rp.Type); if (rp.Type == DhcpType.Discover) // ���o { requestIp = _lease.Discover(requestIp, rp.Id, rp.Mac); if (requestIp != null) { // OFFER���M var sp = new PacketDhcp(rp.Id, requestIp, serverIp, rp.Mac, DhcpType.Offer, _leaseTime, _maskIp, _gwIp, _dnsIp0, _dnsIp1, _wpadUrl); Send(sockUdp, sp); } } else if (rp.Type == DhcpType.Request) // �v�� { requestIp = _lease.Request(requestIp, rp.Id, rp.Mac); if (requestIp != null) { if (serverIp.ToString() == _serverAddress) // ���T�[�o���� // ACK���M { var sp = new PacketDhcp(rp.Id, requestIp, serverIp, rp.Mac, DhcpType.Ack, _leaseTime, _maskIp, _gwIp, _dnsIp0, _dnsIp1, _wpadUrl); Send(sockUdp, sp); //this.Logger.Set(LogKind.Normal,sockUdp,5,string.Format("{0} {1} {2}",rp.Mac,requestIp.ToString(),rp.Type.ToString())); Log(sockUdp, 5, rp.Mac, requestIp, rp.Type); } else { _lease.Release(rp.Mac);//���������� } } else { // NACK���M var sp = new PacketDhcp(rp.Id, requestIp, serverIp, rp.Mac, DhcpType.Nak, _leaseTime, _maskIp, _gwIp, _dnsIp0, _dnsIp1, _wpadUrl); Send(sockUdp, sp); } } else if (rp.Type == DhcpType.Release) // �J�� { requestIp = _lease.Release(rp.Mac); //�J�� if (requestIp != null) { //this.Logger.Set(LogKind.Normal,sockUdp,6,string.Format("{0} {1} {2}",rp.Mac,requestIp.ToString(),rp.Type.ToString())); Log(sockUdp, 6, rp.Mac, requestIp, rp.Type); } } else if (rp.Type == DhcpType.Infrm) // ��� // ACK���M //Send(sockUdp,sp); { } }// �r������ }
PacketDhcp Access(byte [] buf) { //クライアントソケット生成、及び送信 var cl = new UdpClient(68); cl.Connect((new Ip(IpKind.V4Localhost)).IPAddress, 67); //クライアントのポートが67でないとサーバが応答しない cl.Send(buf,buf.Length); //受信 var ep = new IPEndPoint(0, 0); var recvBuf = cl.Receive(ref ep); if (recvBuf.Length == 0) { Assert.Fail();//受信データが無い場合 } var rp = new PacketDhcp(); rp.Read(recvBuf); cl.Close(); return rp; }