DUNE-DAQ
DUNE Trigger and Data Acquisition software
Toggle main menu visibility
Loading...
Searching...
No Matches
dunedaq
sourcecode
dpdklibs
src
arp
ARP.cpp
Go to the documentation of this file.
1
8
#include <arpa/inet.h>
9
#include <rte_arp.h>
10
#include <rte_ethdev.h>
11
12
#include <iomanip>
13
#include <iostream>
14
#include <sstream>
15
16
#include "
dpdklibs/arp/ARP.hpp
"
17
18
namespace
dunedaq
{
19
namespace
dpdklibs
{
20
namespace
arp
{
21
22
void
23
pktgen_send_garp
(
struct
rte_mbuf* m, uint32_t port_id, rte_be32_t ip_add_bin)
24
{
25
struct
rte_ether_hdr* eth = rte_pktmbuf_mtod(m,
struct
rte_ether_hdr*);
26
struct
rte_arp_hdr*
arp
= (
struct
rte_arp_hdr*)ð[1];
27
28
/* src and dest addr */
29
memset(ð->dst_addr, 0xFF, 6);
30
// MAC addr of port
31
struct
rte_ether_addr mac_addr;
32
rte_eth_macaddr_get(port_id, &mac_addr);
33
rte_ether_addr_copy(&mac_addr, ð->src_addr);
34
// Set ETH type
35
eth->ether_type = htons(RTE_ETHER_TYPE_ARP);
36
37
memset(
arp
, 0,
sizeof
(
struct
rte_arp_hdr));
38
rte_memcpy(&
arp
->arp_data.arp_sha, &mac_addr, 6);
39
40
inetAddrCopy
(&
arp
->arp_data.arp_sip, &ip_add_bin);
41
42
rte_memcpy(&
arp
->arp_data.arp_tha, &mac_addr, 6);
43
inetAddrCopy
(&
arp
->arp_data.arp_tip, &ip_add_bin);
44
45
/* Fill in the rest of the ARP packet header */
46
arp
->arp_hardware = htons(RTE_ARP_HRD_ETHER);
47
arp
->arp_protocol = htons(RTE_ETHER_TYPE_IPV4);
48
arp
->arp_hlen = 6;
49
arp
->arp_plen = 4;
50
arp
->arp_opcode = htons(RTE_ARP_OP_REQUEST);
51
52
m->pkt_len = 60;
53
m->data_len = 60;
54
55
struct
rte_mbuf* arp_tx_mbuf[1];
56
arp_tx_mbuf[0] = m;
57
58
std::string srcaddr =
dunedaq::dpdklibs::udp::get_ipv4_decimal_addr_str
(
59
dunedaq::dpdklibs::udp::ip_address_binary_to_dotdecimal
(rte_be_to_cpu_32(
arp
->arp_data.arp_sip)));
60
std::string dstaddr =
dunedaq::dpdklibs::udp::get_ipv4_decimal_addr_str
(
61
dunedaq::dpdklibs::udp::ip_address_binary_to_dotdecimal
(rte_be_to_cpu_32(
arp
->arp_data.arp_tip)));
62
std::string localaddr =
dunedaq::dpdklibs::udp::get_ipv4_decimal_addr_str
(
63
dunedaq::dpdklibs::udp::ip_address_binary_to_dotdecimal
(rte_be_to_cpu_32(ip_add_bin)));
64
TLOG_DEBUG
(10) <<
"GARP SRC IP: "
<< srcaddr;
65
TLOG_DEBUG
(10) <<
"GARP DEST IP: "
<< dstaddr;
66
TLOG_DEBUG
(10) <<
"LOCAL IP: "
<< localaddr;
67
68
rte_eth_tx_burst(port_id, 0, arp_tx_mbuf, 1);
69
}
70
71
inline
void
72
hex_digits_to_stream
(std::ostringstream& ostrs,
int
value,
char
separator =
':'
,
char
fill =
'0'
,
int
digits = 2)
73
{
74
ostrs << std::setfill(fill) << std::setw(digits) << std::hex << value << std::dec << separator;
75
}
76
77
void
78
pktgen_process_arp
(
struct
rte_mbuf* m, uint32_t port_id, rte_be32_t ip_add_bin)
79
{
80
struct
rte_ether_hdr* eth = rte_pktmbuf_mtod(m,
struct
rte_ether_hdr*);
81
struct
rte_arp_hdr*
arp
= (
struct
rte_arp_hdr*)ð[1];
82
83
if
(
arp
->arp_opcode == rte_cpu_to_be_16(RTE_ARP_OP_REQUEST)) {
84
arp
->arp_opcode = rte_cpu_to_be_16(RTE_ARP_OP_REPLY);
85
86
/* Grab the source MAC addresses */
87
struct
rte_ether_addr mac_addr;
88
rte_eth_macaddr_get(port_id, &mac_addr);
89
90
std::string srcaddr =
dunedaq::dpdklibs::udp::get_ipv4_decimal_addr_str
(
91
dunedaq::dpdklibs::udp::ip_address_binary_to_dotdecimal
(rte_be_to_cpu_32(
arp
->arp_data.arp_sip)));
92
std::string dstaddr =
dunedaq::dpdklibs::udp::get_ipv4_decimal_addr_str
(
93
dunedaq::dpdklibs::udp::ip_address_binary_to_dotdecimal
(rte_be_to_cpu_32(
arp
->arp_data.arp_tip)));
94
std::string localaddr =
dunedaq::dpdklibs::udp::get_ipv4_decimal_addr_str
(
95
dunedaq::dpdklibs::udp::ip_address_binary_to_dotdecimal
(rte_be_to_cpu_32(ip_add_bin)));
96
97
TLOG_DEBUG
(10) <<
"ARP SRC IP: "
<< srcaddr;
98
TLOG_DEBUG
(10) <<
"ARP DEST IP: "
<< dstaddr;
99
TLOG_DEBUG
(10) <<
"ARP LOCAL IP: "
<< localaddr;
100
101
// Bail out if not our ipaddress
102
if
(
arp
->arp_data.arp_tip != ip_add_bin)
103
return
;
104
105
TLOG_DEBUG
(10) <<
"ARP Received "
<< dstaddr <<
" I'm the target "
<< localaddr <<
" (port id = "
<< port_id <<
")"
;
106
107
/* Swap the two MAC addresses */
108
ethAddrSwap
(&
arp
->arp_data.arp_sha, &
arp
->arp_data.arp_tha);
109
110
/* Swap the two IP addresses */
111
inetAddrSwap
(&
arp
->arp_data.arp_tip, &
arp
->arp_data.arp_sip);
112
113
/* Set the packet to ARP reply */
114
arp
->arp_opcode = htons(RTE_ARP_OP_REPLY);
115
116
/* Swap the MAC addresses */
117
ethAddrSwap
(ð->dst_addr, ð->src_addr);
118
119
/* Copy in the MAC address for the reply. */
120
rte_memcpy(&
arp
->arp_data.arp_sha, &mac_addr, 6);
121
rte_memcpy(ð->src_addr, &mac_addr, 6);
122
123
struct
rte_mbuf* arp_tx_mbuf[1];
124
arp_tx_mbuf[0] = m;
125
126
rte_eth_tx_burst(port_id, 0, arp_tx_mbuf, 1);
127
TLOG_DEBUG
(10) <<
"Sending ARP reply"
;
128
129
/* No need to free mbuf as it was reused */
130
return
;
131
}
132
}
133
134
}
// namespace arp
135
}
// namespace dpdklibs
136
}
// namespace dunedaq
ARP.hpp
TLOG_DEBUG
#define TLOG_DEBUG(lvl,...)
Definition
Logging.hpp:116
dunedaq::dpdklibs::arp
Definition
ARP.hpp:17
dunedaq::dpdklibs::arp::inetAddrCopy
void inetAddrCopy(void *t, void *f)
Definition
ARP.hpp:73
dunedaq::dpdklibs::arp::ethAddrSwap
void ethAddrSwap(void *t, void *f)
Definition
ARP.hpp:50
dunedaq::dpdklibs::arp::pktgen_send_garp
void pktgen_send_garp(struct rte_mbuf *m, uint32_t port_id, rte_be32_t binary_ip_address)
Definition
ARP.cpp:23
dunedaq::dpdklibs::arp::hex_digits_to_stream
void hex_digits_to_stream(std::ostringstream &ostrs, int value, char separator=':', char fill='0', int digits=2)
Definition
ARP.cpp:72
dunedaq::dpdklibs::arp::pktgen_process_arp
void pktgen_process_arp(struct rte_mbuf *m, uint32_t pid, rte_be32_t binary_ip_address)
Definition
ARP.cpp:78
dunedaq::dpdklibs::arp::inetAddrSwap
void inetAddrSwap(void *t, void *f)
Definition
ARP.hpp:61
dunedaq::dpdklibs::udp::get_ipv4_decimal_addr_str
std::string get_ipv4_decimal_addr_str(struct ipaddr ipv4_address)
Definition
Utils.cpp:56
dunedaq::dpdklibs::udp::ip_address_binary_to_dotdecimal
struct ipaddr ip_address_binary_to_dotdecimal(rte_le32_t binary_ipv4_address)
Definition
Utils.cpp:48
dunedaq::dpdklibs
Definition
ARP.hpp:16
dunedaq
The DUNE-DAQ namespace.
Definition
cib_utilities.cpp:5
Generated on
for DUNE-DAQ by
1.18.0