/// <summary> /// Parses a packet and gets a response packet from the handler /// </summary> internal void ParseAndProcess(byte[] packetBytes, IPEndPoint remoteEndpoint) { IPEndPoint proxyEndpoint = null; if (IsProxyProtocol(packetBytes, out var sourceEndpoint, out var requestWithoutProxyHeader)) { packetBytes = requestWithoutProxyHeader; proxyEndpoint = remoteEndpoint; remoteEndpoint = sourceEndpoint; } ClientConfiguration clientConfiguration = null; if (RadiusPacketNasIdentifierParser.TryParse(packetBytes, out var nasIdentifier)) { clientConfiguration = _serviceConfiguration.GetClient(nasIdentifier); } if (clientConfiguration == null) { clientConfiguration = _serviceConfiguration.GetClient(remoteEndpoint.Address); } if (clientConfiguration == null) { _logger.Warning("Received packet from unknown client {host:l}:{port}, ignoring", remoteEndpoint.Address, remoteEndpoint.Port); return; } var requestPacket = _radiusPacketParser.Parse(packetBytes, Encoding.UTF8.GetBytes(clientConfiguration.RadiusSharedSecret)); var isRetransmission = _cacheService.IsRetransmission(requestPacket, remoteEndpoint); if (isRetransmission) { _logger.Debug("Retransmissed request from {host:l}:{port} id={id} client '{client:l}', ignoring", remoteEndpoint.Address, remoteEndpoint.Port, requestPacket.Identifier, clientConfiguration.Name); return; } if (proxyEndpoint != null) { if (requestPacket.Code == PacketCode.StatusServer) { _logger.Information("Received {code:l} from {host:l}:{port} proxied by {proxyhost:l}:{proxyport} id={id} client '{client:l}'", requestPacket.Code.ToString(), remoteEndpoint.Address, remoteEndpoint.Port, proxyEndpoint.Address, proxyEndpoint.Port, requestPacket.Identifier, clientConfiguration.Name); } else { _logger.Information("Received {code:l} from {host:l}:{port} proxied by {proxyhost:l}:{proxyport} id={id} user='******' client '{client:l}'", requestPacket.Code.ToString(), remoteEndpoint.Address, remoteEndpoint.Port, proxyEndpoint.Address, proxyEndpoint.Port, requestPacket.Identifier, requestPacket.UserName, clientConfiguration.Name); } } else { if (requestPacket.Code == PacketCode.StatusServer) { _logger.Debug("Received {code:l} from {host:l}:{port} id={id} client '{client:l}'", requestPacket.Code.ToString(), remoteEndpoint.Address, remoteEndpoint.Port, requestPacket.Identifier, clientConfiguration.Name); } else { _logger.Information("Received {code:l} from {host:l}:{port} id={id} user='******' client '{client:l}'", requestPacket.Code.ToString(), remoteEndpoint.Address, remoteEndpoint.Port, requestPacket.Identifier, requestPacket.UserName, clientConfiguration.Name); } } var request = new PendingRequest { RemoteEndpoint = remoteEndpoint, ProxyEndpoint = proxyEndpoint, RequestPacket = requestPacket }; Task.Run(async() => await _router.HandleRequest(request, clientConfiguration)); }