mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 09:02:43 +00:00 
			
		
		
		
	Kernel: Add update option to remove an entry from the ARP table
Allows for specifying whether to set/delete an entry from the table.
This commit is contained in:
		
							parent
							
								
									99b32073be
								
							
						
					
					
						commit
						f8c104aaaf
					
				
					 3 changed files with 13 additions and 5 deletions
				
			
		|  | @ -151,7 +151,7 @@ void handle_arp(const EthernetFrameHeader& eth, size_t frame_size) | |||
|         // Someone has this IPv4 address. I guess we can try to remember that.
 | ||||
|         // FIXME: Protect against ARP spamming.
 | ||||
|         // FIXME: Support static ARP table entries.
 | ||||
|         update_arp_table(packet.sender_protocol_address(), packet.sender_hardware_address()); | ||||
|         update_arp_table(packet.sender_protocol_address(), packet.sender_hardware_address(), UpdateArp::Set); | ||||
|     } | ||||
| 
 | ||||
|     if (packet.operation() == ARPOperation::Request) { | ||||
|  | @ -199,7 +199,7 @@ void handle_ipv4(const EthernetFrameHeader& eth, size_t frame_size, const Time& | |||
|             auto my_net = adapter.ipv4_address().to_u32() & adapter.ipv4_netmask().to_u32(); | ||||
|             auto their_net = packet.source().to_u32() & adapter.ipv4_netmask().to_u32(); | ||||
|             if (my_net == their_net) | ||||
|                 update_arp_table(packet.source(), eth.source()); | ||||
|                 update_arp_table(packet.source(), eth.source(), UpdateArp::Set); | ||||
|         } | ||||
|     }); | ||||
| 
 | ||||
|  |  | |||
|  | @ -104,10 +104,13 @@ Lockable<HashMap<IPv4Address, MACAddress>>& arp_table() | |||
|     return *s_arp_table; | ||||
| } | ||||
| 
 | ||||
| void update_arp_table(const IPv4Address& ip_addr, const MACAddress& addr) | ||||
| void update_arp_table(const IPv4Address& ip_addr, const MACAddress& addr, UpdateArp update) | ||||
| { | ||||
|     MutexLocker locker(arp_table().lock()); | ||||
|     arp_table().resource().set(ip_addr, addr); | ||||
|     if (update == UpdateArp::Set) | ||||
|         arp_table().resource().set(ip_addr, addr); | ||||
|     if (update == UpdateArp::Delete) | ||||
|         arp_table().resource().remove(ip_addr); | ||||
|     s_arp_table_block_condition->unblock(ip_addr, addr); | ||||
| 
 | ||||
|     if constexpr (ROUTING_DEBUG) { | ||||
|  |  | |||
|  | @ -18,7 +18,12 @@ struct RoutingDecision { | |||
|     bool is_zero() const; | ||||
| }; | ||||
| 
 | ||||
| void update_arp_table(const IPv4Address&, const MACAddress&); | ||||
| enum class UpdateArp { | ||||
|     Set, | ||||
|     Delete, | ||||
| }; | ||||
| 
 | ||||
| void update_arp_table(const IPv4Address&, const MACAddress&, UpdateArp update); | ||||
| RoutingDecision route_to(const IPv4Address& target, const IPv4Address& source, const RefPtr<NetworkAdapter> through = nullptr); | ||||
| 
 | ||||
| Lockable<HashMap<IPv4Address, MACAddress>>& arp_table(); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 brapru
						brapru