wireguard: eliminate some calls to main thread 81/37081/2
authorMatthew Smith <mgsmith@netgate.com>
Fri, 2 Sep 2022 14:34:38 +0000 (14:34 +0000)
committerBeno�t Ganne <bganne@cisco.com>
Thu, 8 Sep 2022 13:41:54 +0000 (13:41 +0000)
Type: improvement

Roaming functionality allows the peer address to change. The main thread
was being called to update a peer's address if necessary after
processing a received packet. Check in the worker whether this is
necessary before incurring the overhead of the RPC to the main thread.

Signed-off-by: Matthew Smith <mgsmith@netgate.com>
Change-Id: I02184b92dc658e0f57dd39993a3b2f9944187b45

src/plugins/wireguard/wireguard_input.c

index 22850b8..f4d9132 100644 (file)
@@ -837,8 +837,11 @@ wg_input_inline (vlib_main_t *vm, vlib_node_runtime_t *node,
 
       if (PREDICT_FALSE (peer_idx && (last_peer_time_idx != peer_idx)))
        {
-         wg_peer_update_endpoint_from_mt (*peer_idx, &out_src_ip,
-                                          out_udp_src_port);
+         if (PREDICT_FALSE (
+               !ip46_address_is_equal (&peer->dst.addr, &out_src_ip) ||
+               peer->dst.port != out_udp_src_port))
+           wg_peer_update_endpoint_from_mt (*peer_idx, &out_src_ip,
+                                            out_udp_src_port);
          wg_timers_any_authenticated_packet_received_opt (peer, time);
          wg_timers_any_authenticated_packet_traversal (peer);
          last_peer_time_idx = peer_idx;
@@ -970,8 +973,11 @@ wg_input_post (vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *frame,
 
       if (PREDICT_FALSE (peer_idx && (last_peer_time_idx != peer_idx)))
        {
-         wg_peer_update_endpoint_from_mt (*peer_idx, &out_src_ip,
-                                          out_udp_src_port);
+         if (PREDICT_FALSE (
+               !ip46_address_is_equal (&peer->dst.addr, &out_src_ip) ||
+               peer->dst.port != out_udp_src_port))
+           wg_peer_update_endpoint_from_mt (*peer_idx, &out_src_ip,
+                                            out_udp_src_port);
          wg_timers_any_authenticated_packet_received_opt (peer, time);
          wg_timers_any_authenticated_packet_traversal (peer);
          last_peer_time_idx = peer_idx;