@@ -886,7 +886,7 @@ def _control_plane_arp_handler(self, now, pkt_meta):
886
886
self .notify_learn (pkt_meta )
887
887
return ofmsgs
888
888
889
- def _control_plane_icmp_handler (self , pkt_meta , ipv4_pkt ):
889
+ def _control_plane_icmp_handler (self , now , pkt_meta , ipv4_pkt ):
890
890
"""Handle ICMP packets destined for the router"""
891
891
ofmsgs = []
892
892
if ipv4_pkt .proto != valve_of .inet .IPPROTO_ICMP :
@@ -903,6 +903,11 @@ def _control_plane_icmp_handler(self, pkt_meta, ipv4_pkt):
903
903
pkt_meta .vlan .faucet_mac , pkt_meta .eth_src ,
904
904
pkt_meta .l3_dst , pkt_meta .l3_src ,
905
905
icmp_pkt .data ))
906
+ # ping but no previous ARP request for FAUCET VIP
907
+ # from this host. Missed ARP request or host has
908
+ # static ARP entry for us?
909
+ if self ._cached_nexthop_eth_dst (pkt_meta .vlan , pkt_meta .l3_src ) is None :
910
+ ofmsgs .extend (self .add_host_fib_route_from_pkt (now , pkt_meta ))
906
911
return ofmsgs
907
912
908
913
def control_plane_handler (self , now , pkt_meta ):
@@ -915,7 +920,7 @@ def control_plane_handler(self, now, pkt_meta):
915
920
if ipv4_pkt is None :
916
921
return []
917
922
icmp_replies = self ._control_plane_icmp_handler (
918
- pkt_meta , ipv4_pkt )
923
+ now , pkt_meta , ipv4_pkt )
919
924
if icmp_replies :
920
925
return icmp_replies
921
926
return super (ValveIPv4RouteManager , self ).control_plane_handler (now , pkt_meta )
@@ -1039,7 +1044,7 @@ def _router_solicit_handler(self, _now, pkt_meta, _ipv6_pkt, _icmpv6_pkt):
1039
1044
break
1040
1045
return ofmsgs
1041
1046
1042
- def _echo_request_handler (self , _now , pkt_meta , ipv6_pkt , icmpv6_pkt ):
1047
+ def _echo_request_handler (self , now , pkt_meta , ipv6_pkt , icmpv6_pkt ):
1043
1048
ofmsgs = []
1044
1049
if self ._unicast_to_vip (pkt_meta ):
1045
1050
ofmsgs .append (
@@ -1049,6 +1054,11 @@ def _echo_request_handler(self, _now, pkt_meta, ipv6_pkt, icmpv6_pkt):
1049
1054
pkt_meta .l3_dst , pkt_meta .l3_src , ipv6_pkt .hop_limit ,
1050
1055
icmpv6_pkt .data .id , icmpv6_pkt .data .seq ,
1051
1056
icmpv6_pkt .data .data ))
1057
+ # ping but no previous ND request for FAUCET VIP
1058
+ # from this host. Missed ND request or host has
1059
+ # static ND entry for us?
1060
+ if self ._cached_nexthop_eth_dst (pkt_meta .vlan , pkt_meta .l3_src ) is None :
1061
+ ofmsgs .extend (self .add_host_fib_route_from_pkt (now , pkt_meta ))
1052
1062
return ofmsgs
1053
1063
1054
1064
_icmpv6_handlers = {
0 commit comments