fix tap mode arp table poisoning

This commit is contained in:
Robert Dash 2023-07-19 18:35:06 -04:00 committed by Sukchan Lee
parent 3d62100071
commit 04d402dee6
3 changed files with 14 additions and 1 deletions

View File

@ -52,6 +52,16 @@ bool is_arp_req(uint8_t *data, uint len)
return _parse_arp(pdu);
}
uint32_t arp_parse_target_addr(uint8_t *data, uint len)
{
EthernetII pdu(data, len);
if (pdu.payload_type() == ETHERTYPE_ARP) {
const ARP& arp = pdu.rfind_pdu<ARP>();
return arp.target_ip_addr();
}
return 0x0;
}
uint8_t arp_reply(uint8_t *reply_data, uint8_t *request_data, uint len,
const uint8_t *mac)
{

View File

@ -39,6 +39,7 @@ extern "C" {
void set_source_mac(uint8_t *data);
bool is_arp_req(uint8_t *data, uint len);
uint32_t arp_parse_target_addr(uint8_t *data, uint len);
uint8_t arp_reply(uint8_t *reply_data, uint8_t *request_data, uint len,
const uint8_t *mac);
bool is_nd_req(uint8_t *data, uint len);

View File

@ -123,7 +123,9 @@ static void _gtpv1_tun_recv_common_cb(
uint8_t size;
if (eth_type == ETHERTYPE_ARP) {
if (is_arp_req(recvbuf->data, recvbuf->len)) {
if (is_arp_req(recvbuf->data, recvbuf->len) &&
upf_sess_find_by_ipv4(
arp_parse_target_addr(recvbuf->data, recvbuf->len))) {
replybuf = ogs_pkbuf_alloc(packet_pool, OGS_MAX_PKT_LEN);
ogs_assert(replybuf);
ogs_pkbuf_reserve(replybuf, OGS_TUN_MAX_HEADROOM);