Browse Source

optimize code

Nick Peng 6 years ago
parent
commit
9a23bf6113
1 changed files with 11 additions and 8 deletions
  1. 11 8
      src/dns_server.c

+ 11 - 8
src/dns_server.c

@@ -81,9 +81,6 @@ struct dns_server_conn_udp {
 	struct dns_server_conn_head head;
 	socklen_t addr_len;
 	struct sockaddr_storage addr;
-
-	socklen_t localaddr_len;
-	struct sockaddr_storage localaddr;
 };
 
 struct dns_server_conn_tcp_server {
@@ -148,6 +145,7 @@ struct dns_request {
 		struct sockaddr_in6 in6;
 		struct sockaddr addr;
 	};
+	struct sockaddr_storage localaddr;
 
 	dns_result_callback result_callback;
 	void *user_ptr;
@@ -2018,7 +2016,8 @@ static void _dns_server_check_set_passthrough(struct dns_request *request, struc
 	}
 }
 
-static int _dns_server_recv(struct dns_server_conn_head *conn, unsigned char *inpacket, int inpacket_len, struct sockaddr_storage *from, socklen_t from_len)
+static int _dns_server_recv(struct dns_server_conn_head *conn, unsigned char *inpacket, int inpacket_len, struct sockaddr_storage *local, socklen_t local_len,
+							struct sockaddr_storage *from, socklen_t from_len)
 {
 	int decode_len;
 	int ret = -1;
@@ -2073,6 +2072,7 @@ static int _dns_server_recv(struct dns_server_conn_head *conn, unsigned char *in
 		goto errout;
 	}
 
+	memcpy(&request->localaddr, local, local_len);
 	_dns_server_request_set_client(request, conn);
 	_dns_server_check_set_passthrough(request, conn);
 	_dns_server_request_set_client_addr(request, from, from_len);
@@ -2155,6 +2155,8 @@ static int _dns_server_process_udp(struct dns_server_conn_udp *udpconn, struct e
 	unsigned char inpacket[DNS_IN_PACKSIZE];
 	struct sockaddr_storage from;
 	socklen_t from_len = sizeof(from);
+	struct sockaddr_storage local;
+	socklen_t local_len = sizeof(local);
 	struct msghdr msg;
 	struct iovec iov;
 	char ans_data[4096];
@@ -2181,15 +2183,15 @@ static int _dns_server_process_udp(struct dns_server_conn_udp *udpconn, struct e
 		if (cmsg->cmsg_level == IPPROTO_IP && cmsg->cmsg_type == IP_PKTINFO) {
 			const struct in_pktinfo *pktinfo = (struct in_pktinfo *)CMSG_DATA(cmsg);
 			unsigned char *addr = (unsigned char *)&pktinfo->ipi_addr.s_addr;
-			fill_sockaddr_by_ip(addr, sizeof(in_addr_t), 0, (struct sockaddr *)&udpconn->localaddr, &udpconn->localaddr_len);
+			fill_sockaddr_by_ip(addr, sizeof(in_addr_t), 0, (struct sockaddr *)&local, &local_len);
 		} else if (cmsg->cmsg_level == IPPROTO_IPV6 && cmsg->cmsg_type == IPV6_PKTINFO) {
 			const struct in6_pktinfo *pktinfo = (struct in6_pktinfo *)CMSG_DATA(cmsg);
 			unsigned char *addr = (unsigned char *)pktinfo->ipi6_addr.s6_addr;
-			fill_sockaddr_by_ip(addr, sizeof(struct in6_addr), 0, (struct sockaddr *)&udpconn->localaddr, &udpconn->localaddr_len);
+			fill_sockaddr_by_ip(addr, sizeof(struct in6_addr), 0, (struct sockaddr *)&local, &local_len);
 		}
 	}
 
-	return _dns_server_recv(&udpconn->head, inpacket, len, &from, from_len);
+	return _dns_server_recv(&udpconn->head, inpacket, len, &local, local_len, &from, from_len);
 }
 
 static void _dns_server_client_touch(struct dns_server_conn_head *conn)
@@ -2326,7 +2328,8 @@ static int _dns_server_tcp_process_one_request(struct dns_server_conn_tcp_client
 		request_data = (unsigned char *)(tcpclient->recvbuff.buf + proceed_len + sizeof(unsigned short));
 
 		/* process one record */
-		if (_dns_server_recv(&tcpclient->head, request_data, request_len, &tcpclient->addr, tcpclient->addr_len) != 0) {
+		if (_dns_server_recv(&tcpclient->head, request_data, request_len, &tcpclient->localaddr, tcpclient->localaddr_len, &tcpclient->addr,
+							 tcpclient->addr_len) != 0) {
 			tlog(TLOG_ERROR, "process tcp request failed.");
 			return RECV_ERROR_FAIL;
 		}