DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
dunedaq::dpdklibs::udp Namespace Reference

Classes

struct  ipaddr
struct  ipv4_udp_packet_hdr

Enumerations

enum  { MIN_TOS = 0 , DEFAULT_TOS = MIN_TOS , DEFAULT_TTL = 8 }

Functions

rte_le16_t packet_fill (struct ipv4_udp_packet_hdr *packet_hdr)
void pktgen_udp_hdr_ctor (struct ipv4_udp_packet_hdr *packet_hdr, rte_le16_t packet_len, int sport=55677, int dport=55678)
void pktgen_ipv4_ctor (struct ipv4_udp_packet_hdr *packet_hdr, rte_le16_t packet_len, const std::string &src_ip_addr="0.0.0.0", const std::string &dst_ip_addr="0.0.0.0")
void pktgen_ether_hdr_ctor (struct ipv4_udp_packet_hdr *packet_hdr, const std::string &dst_mac_address="0a:00:10:c2:15:c1", const int port_id=0)
bool get_ether_addr6 (const char *s0, struct rte_ether_addr *ea)
void construct_packets_for_burst (const int port_id, const std::string &dst_mac_addr, const int payload_bytes, const int burst_size, rte_mbuf **bufs)
static int8_t get_xdigit (char ch)
std::uint16_t get_payload_size_udp_hdr (struct rte_udp_hdr *udp_hdr)
std::uint16_t get_payload_size (struct ipv4_udp_packet_hdr *ipv4_udp_hdr)
rte_be32_t ip_address_dotdecimal_to_binary (std::uint8_t byte1, std::uint8_t byte2, std::uint8_t byte3, std::uint8_t byte4)
struct ipaddr ip_address_binary_to_dotdecimal (rte_le32_t binary_ipv4_address)
std::string get_ipv4_decimal_addr_str (struct ipaddr ipv4_address)
char * get_udp_payload (const rte_mbuf *mbuf)
void hex_digits_to_stream (std::ostringstream &ostrs, int value, char separator=':', char fill='0', int digits=2)
std::string get_udp_header_str (struct rte_mbuf *mbuf)
std::string get_udp_packet_str (struct rte_mbuf *mbuf)
void add_file_contents_to_vector (const std::string &filename, std::vector< char > &buffervec)
std::vector< std::pair< const void *, int > > get_ethernet_packets (const std::vector< char > &buffervec)
void set_daqethheader_test_values (detdataformats::DAQEthHeader &daqethheader_obj) noexcept
std::string get_rte_mbuf_str (const rte_mbuf *mbuf) noexcept
std::string get_opmon_string (const StreamUID &sid)

Variables

struct dunedaq::dpdklibs::udp::ipv4_udp_packet_hdr __rte_packed

Enumeration Type Documentation

◆ anonymous enum

anonymous enum
Enumerator
MIN_TOS 
DEFAULT_TOS 
DEFAULT_TTL 

Definition at line 19 of file PacketCtor.cpp.

Function Documentation

◆ add_file_contents_to_vector()

void dunedaq::dpdklibs::udp::add_file_contents_to_vector ( const std::string & filename,
std::vector< char > & buffervec )

Definition at line 171 of file Utils.cpp.

172{
173
174 char byte = 0x0;
175
176 std::ifstream packetfile;
177 packetfile.open(filename, std::ios::binary);
178
179 if (!packetfile) {
180 throw ::dunedaq::datahandlinglibs::CannotOpenFile(ERS_HERE, filename);
181 }
182
183 while (packetfile.get(byte)) {
184 buffervec.push_back(byte);
185 }
186
187 packetfile.close();
188}
#define ERS_HERE

◆ construct_packets_for_burst()

void dunedaq::dpdklibs::udp::construct_packets_for_burst ( const int port_id,
const std::string & dst_mac_addr,
const int payload_bytes,
const int burst_size,
rte_mbuf ** bufs )

Definition at line 225 of file PacketCtor.cpp.

230{
231 struct ipv4_udp_packet_hdr packet_hdr;
232
233 constexpr int eth_header_bytes = 14;
234 constexpr int udp_header_bytes = 8;
235 constexpr int ipv4_header_bytes = 20;
236
237 int eth_packet_bytes =
238 eth_header_bytes + ipv4_header_bytes + udp_header_bytes + sizeof(detdataformats::DAQEthHeader) + payload_bytes;
239 int ipv4_packet_bytes = eth_packet_bytes - eth_header_bytes;
240 int udp_datagram_bytes = ipv4_packet_bytes - ipv4_header_bytes;
241
242 // Get info for the ethernet header (protocol stack level 2)
243 pktgen_ether_hdr_ctor(&packet_hdr, dst_mac_addr, port_id);
244
245 // Get info for the internet header (protocol stack level 3)
246 pktgen_ipv4_ctor(&packet_hdr, ipv4_packet_bytes);
247
248 // Get info for the UDP header (protocol stack level 4)
249 pktgen_udp_hdr_ctor(&packet_hdr, udp_datagram_bytes);
250
251 detdataformats::DAQEthHeader daqethheader_obj;
252 set_daqethheader_test_values(daqethheader_obj);
253
254 void* dataloc = nullptr;
255 for (int i_pkt = 0; i_pkt < burst_size; ++i_pkt) {
256
257 dataloc = rte_pktmbuf_mtod(bufs[i_pkt], char*);
258 rte_memcpy(dataloc, &packet_hdr, sizeof(packet_hdr));
259
260 dataloc = rte_pktmbuf_mtod_offset(bufs[i_pkt], char*, sizeof(packet_hdr));
261 rte_memcpy(dataloc, &daqethheader_obj, sizeof(daqethheader_obj));
262
263 bufs[i_pkt]->pkt_len = eth_packet_bytes;
264 bufs[i_pkt]->data_len = eth_packet_bytes;
265 }
266}
void pktgen_ether_hdr_ctor(struct ipv4_udp_packet_hdr *packet_hdr, const std::string &dst_mac_address="0a:00:10:c2:15:c1", const int port_id=0)
void pktgen_ipv4_ctor(struct ipv4_udp_packet_hdr *packet_hdr, rte_le16_t packet_len, const std::string &src_ip_addr="0.0.0.0", const std::string &dst_ip_addr="0.0.0.0")
void set_daqethheader_test_values(detdataformats::DAQEthHeader &daqethheader_obj) noexcept
Definition Utils.cpp:237
void pktgen_udp_hdr_ctor(struct ipv4_udp_packet_hdr *packet_hdr, rte_le16_t packet_len, int sport=55677, int dport=55678)
DAQEthHeader is a versioned and unified structure for every FE electronics.

◆ get_ether_addr6()

bool dunedaq::dpdklibs::udp::get_ether_addr6 ( const char * s0,
struct rte_ether_addr * ea )

Definition at line 39 of file PacketCtor.cpp.

40{
41 const char* s = s0;
42 int i;
43
44 for (i = 0; i < RTE_ETHER_ADDR_LEN; i++) {
45 int8_t x;
46
47 x = get_xdigit(*s++);
48 if (x < 0)
49 return false;
50
51 ea->addr_bytes[i] = x << 4;
52 x = get_xdigit(*s++);
53 if (x < 0)
54 return false;
55 ea->addr_bytes[i] |= x;
56
57 if (i < RTE_ETHER_ADDR_LEN - 1 && *s++ != ':')
58 return false;
59 }
60
61 /* return true if at end of string */
62 return *s == '\0';
63}
static int8_t get_xdigit(char ch)

◆ get_ethernet_packets()

std::vector< std::pair< const void *, int > > dunedaq::dpdklibs::udp::get_ethernet_packets ( const std::vector< char > & buffervec)

Definition at line 191 of file Utils.cpp.

192{
193
194 std::vector<std::pair<const void*, int>> ethernet_packets;
195 const std::vector<uint16_t> allowed_ethertypes{ 0x0800, 0x0806 };
196
197 for (int byte_index = 0; byte_index < buffervec.size();) {
198 const auto buf_ptr = &buffervec.at(byte_index);
199 auto hdr = reinterpret_cast<const ipv4_udp_packet_hdr*>(buf_ptr);
200
201 // A sanity check
202 bool match = false;
203 for (auto allowed_ethertype : allowed_ethertypes) {
204 if (hdr->eth_hdr.ether_type == rte_be_to_cpu_16(allowed_ethertype)) {
205 match = true;
206 break;
207 }
208 }
209
210 if (!match) {
211 std::stringstream msgstr;
212 msgstr << "Ether type in ethernet header (value " << std::hex << rte_be_to_cpu_16(hdr->eth_hdr.ether_type)
213 << std::dec << ") either unknown or unsupported";
214 throw dunedaq::dpdklibs::BadPacketHeaderIssue(ERS_HERE, msgstr.str());
215 }
216
217 int ipv4_packet_size = rte_be_to_cpu_16(hdr->ipv4_hdr.total_length);
218 constexpr int min_packet_size = sizeof(rte_ipv4_hdr) + sizeof(rte_udp_hdr);
219 constexpr int max_packet_size = 10000;
220
221 if (ipv4_packet_size < min_packet_size || ipv4_packet_size > max_packet_size) {
222 std::stringstream msgstr;
223 msgstr << "Calculated IPv4 packet size of " << ipv4_packet_size << " bytes is out of the required range of ("
224 << min_packet_size << ", " << max_packet_size << ") bytes";
225 throw dunedaq::dpdklibs::BadPacketHeaderIssue(ERS_HERE, msgstr.str());
226 }
227
228 int ethernet_packet_size = sizeof(rte_ether_hdr) + ipv4_packet_size;
229 ethernet_packets.emplace_back(std::pair<const void*, int>{ buf_ptr, ethernet_packet_size });
230 byte_index += ethernet_packet_size;
231 }
232
233 return ethernet_packets;
234}

◆ get_ipv4_decimal_addr_str()

std::string dunedaq::dpdklibs::udp::get_ipv4_decimal_addr_str ( struct ipaddr ipv4_address)

Definition at line 56 of file Utils.cpp.

57{
58 std::ostringstream ostrs;
59 ostrs << (unsigned)ipv4_address.addr_bytes[3] << '.' << (unsigned)ipv4_address.addr_bytes[2] << '.'
60 << (unsigned)ipv4_address.addr_bytes[1] << '.' << (unsigned)ipv4_address.addr_bytes[0];
61 return ostrs.str();
62 /*printf("%i.%i.%i.%i",
63 ipv4_address.addr_bytes[3],
64 ipv4_address.addr_bytes[2],
65 ipv4_address.addr_bytes[1],
66 ipv4_address.addr_bytes[0]);
67 */
68}

◆ get_opmon_string()

std::string dunedaq::dpdklibs::udp::get_opmon_string ( const StreamUID & sid)

Definition at line 282 of file Utils.cpp.

283{
284 std::stringstream opmonstr;
285 opmonstr << "det" << sid.det_id << "_crt" << sid.crate_id << "_slt" << sid.slot_id << "_str" << sid.stream_id;
286 return opmonstr.str();
287}

◆ get_payload_size()

std::uint16_t dunedaq::dpdklibs::udp::get_payload_size ( struct ipv4_udp_packet_hdr * ipv4_udp_hdr)

Definition at line 35 of file Utils.cpp.

36{
37 return rte_be_to_cpu_16(ipv4_udp_hdr->udp_hdr.dgram_len) - sizeof(struct rte_udp_hdr);
38}

◆ get_payload_size_udp_hdr()

std::uint16_t dunedaq::dpdklibs::udp::get_payload_size_udp_hdr ( struct rte_udp_hdr * udp_hdr)

Definition at line 29 of file Utils.cpp.

30{
31 return rte_be_to_cpu_16(udp_hdr->dgram_len) - sizeof(struct rte_udp_hdr);
32}

◆ get_rte_mbuf_str()

std::string dunedaq::dpdklibs::udp::get_rte_mbuf_str ( const rte_mbuf * mbuf)
noexcept

Definition at line 251 of file Utils.cpp.

252{
253 std::stringstream ss;
254
255 ss << "\nrte_mbuf info:";
256 ss << "\npkt_len: " << mbuf->pkt_len;
257 ss << "\ndata_len: " << mbuf->data_len;
258 ss << "\nBuffer address: " << std::hex << mbuf->buf_addr;
259 ss << "\nRef count: " << std::dec << rte_mbuf_refcnt_read(mbuf);
260 ss << "\nport: " << mbuf->port;
261 ss << "\nol_flags: " << std::hex << mbuf->ol_flags;
262 ss << "\npacket_type: " << std::dec << mbuf->packet_type;
263 ss << "\nl2 type: " << static_cast<int>(mbuf->l2_type);
264 ss << "\nl3 type: " << static_cast<int>(mbuf->l3_type);
265 ss << "\nl4 type: " << static_cast<int>(mbuf->l4_type);
266 ss << "\ntunnel type: " << static_cast<int>(mbuf->tun_type);
267 ss << "\nInner l2 type: " << static_cast<int>(mbuf->inner_l2_type);
268 ss << "\nInner l3 type: " << static_cast<int>(mbuf->inner_l3_type);
269 ss << "\nInner l4 type: " << static_cast<int>(mbuf->inner_l4_type);
270 ss << "\nbuf_len: " << mbuf->buf_len;
271 ss << "\nl2_len: " << mbuf->l2_len;
272 ss << "\nl3_len: " << mbuf->l3_len;
273 ss << "\nl4_len: " << mbuf->l4_len;
274 ss << "\nouter_l2_len: " << mbuf->outer_l2_len;
275 ss << "\nouter_l3_len: " << mbuf->outer_l3_len;
276 ss << std::dec;
277
278 return ss.str();
279}

◆ get_udp_header_str()

std::string dunedaq::dpdklibs::udp::get_udp_header_str ( struct rte_mbuf * mbuf)

Definition at line 109 of file Utils.cpp.

110{
111 struct ipv4_udp_packet_hdr* pkt = rte_pktmbuf_mtod(mbuf, struct ipv4_udp_packet_hdr*);
112 std::ostringstream ostrs;
113 ostrs << "\n------ start of packet ----- \n";
114 ostrs << "dst mac addr: ";
115 hex_digits_to_stream(ostrs, (int)pkt->eth_hdr.dst_addr.addr_bytes[0]);
116 hex_digits_to_stream(ostrs, (int)pkt->eth_hdr.dst_addr.addr_bytes[1]);
117 hex_digits_to_stream(ostrs, (int)pkt->eth_hdr.dst_addr.addr_bytes[2]);
118 hex_digits_to_stream(ostrs, (int)pkt->eth_hdr.dst_addr.addr_bytes[3]);
119 hex_digits_to_stream(ostrs, (int)pkt->eth_hdr.dst_addr.addr_bytes[4]);
120 hex_digits_to_stream(ostrs, (int)pkt->eth_hdr.dst_addr.addr_bytes[5], '\n');
121 ostrs << "src mac addr: ";
122 hex_digits_to_stream(ostrs, (int)pkt->eth_hdr.src_addr.addr_bytes[0]);
123 hex_digits_to_stream(ostrs, (int)pkt->eth_hdr.src_addr.addr_bytes[1]);
124 hex_digits_to_stream(ostrs, (int)pkt->eth_hdr.src_addr.addr_bytes[2]);
125 hex_digits_to_stream(ostrs, (int)pkt->eth_hdr.src_addr.addr_bytes[3]);
126 hex_digits_to_stream(ostrs, (int)pkt->eth_hdr.src_addr.addr_bytes[4]);
127 hex_digits_to_stream(ostrs, (int)pkt->eth_hdr.src_addr.addr_bytes[5], '\n');
128 ostrs << "ethtype: " << (unsigned)pkt->eth_hdr.ether_type << '\n';
129
130 ostrs << "------ IP header ----- \n";
131 ostrs << "ipv4 version: " << (unsigned)pkt->ipv4_hdr.version_ihl << '\n';
132 ostrs << "ipv4 type_of_service: " << (unsigned)pkt->ipv4_hdr.type_of_service << '\n';
133 ostrs << "ipv4 total lenght: " << (unsigned)rte_be_to_cpu_16(pkt->ipv4_hdr.total_length) << '\n';
134 ostrs << "ipv4 packet_id: " << (unsigned)pkt->ipv4_hdr.packet_id << '\n';
135 ostrs << "ipv4 fragment_offset: " << (unsigned)pkt->ipv4_hdr.fragment_offset << '\n';
136 ostrs << "ipv4 time_to_live: " << (unsigned)pkt->ipv4_hdr.time_to_live << '\n';
137 ostrs << "ipv4 next_proto_id: " << (unsigned)pkt->ipv4_hdr.next_proto_id << '\n';
138 ostrs << "ipv4 checksum: " << (unsigned)rte_be_to_cpu_16(pkt->ipv4_hdr.hdr_checksum) << '\n';
139 std::string srcaddr =
141 std::string dstaddr =
143 ostrs << "src_addr: " << srcaddr << '\n';
144 ostrs << "dst_addr: " << dstaddr << '\n';
145
146 ostrs << "------ UDP header ----- \n";
147 ostrs << "UDP src_port: " << (unsigned)rte_be_to_cpu_16(pkt->udp_hdr.src_port) << '\n';
148 ostrs << "UDP dst_port: " << (unsigned)rte_be_to_cpu_16(pkt->udp_hdr.dst_port) << '\n';
149 ostrs << "UDP len: " << (unsigned)rte_be_to_cpu_16(pkt->udp_hdr.dgram_len) << '\n';
150 ostrs << "UDP checksum: " << (unsigned)rte_be_to_cpu_16(pkt->udp_hdr.dgram_cksum) << '\n';
151
152 return ostrs.str();
153}
void hex_digits_to_stream(std::ostringstream &ostrs, int value, char separator=':', char fill='0', int digits=2)
Definition Utils.cpp:102
std::string get_ipv4_decimal_addr_str(struct ipaddr ipv4_address)
Definition Utils.cpp:56
struct ipaddr ip_address_binary_to_dotdecimal(rte_le32_t binary_ipv4_address)
Definition Utils.cpp:48

◆ get_udp_packet_str()

std::string dunedaq::dpdklibs::udp::get_udp_packet_str ( struct rte_mbuf * mbuf)

Definition at line 156 of file Utils.cpp.

157{
158 struct ipv4_udp_packet_hdr* pkt = rte_pktmbuf_mtod(mbuf, struct ipv4_udp_packet_hdr*);
159 char* payload = (char*)(pkt);
160 std::ostringstream ostrs;
161 std::uint8_t byte;
162 for (byte = 0; byte < rte_be_to_cpu_16(pkt->udp_hdr.dgram_len); byte++) {
163 hex_digits_to_stream(ostrs, (unsigned)(*(payload + byte)), ' ');
164 // printf("%02x ", *(payload + byte) & 0xFF);
165 // printf("%s", (payload + byte));
166 }
167 return ostrs.str();
168}

◆ get_udp_payload()

char * dunedaq::dpdklibs::udp::get_udp_payload ( const rte_mbuf * mbuf)

Definition at line 71 of file Utils.cpp.

72{
73 struct ipv4_udp_packet_hdr* udp_packet = rte_pktmbuf_mtod(mbuf, struct ipv4_udp_packet_hdr*);
74 // dump_udp_header(udp_packet);
75 // uint16_t payload_size = get_payload_size(udp_packet);
76 char* payload = (char*)(udp_packet + 1);
77 return payload;
78
79 /*
80 if (dump_mode == 10) {
81 return payload;
82 }
83
84 if (dump_mode == 0 || dump_mode == 3) {
85 printf("UDP Payload size: %i\n", payload_size);
86 uint byte;
87 for (byte = 0; byte < payload_size; byte++) {
88 printf("%02x ", *(payload + byte) & 0xFF);
89 //printf("%s", (payload + byte));
90 }
91 printf("\n");
92 }
93
94 if (dump_mode == 1 || dump_mode == 3) {
95 printf("%s\n", payload);
96 }
97 return payload;
98 */
99}

◆ get_xdigit()

int8_t dunedaq::dpdklibs::udp::get_xdigit ( char ch)
static

Definition at line 27 of file PacketCtor.cpp.

28{
29 if (ch >= '0' && ch <= '9')
30 return ch - '0';
31 if (ch >= 'a' && ch <= 'f')
32 return ch - 'a' + 10;
33 if (ch >= 'A' && ch <= 'F')
34 return ch - 'A' + 10;
35 return -1;
36}

◆ hex_digits_to_stream()

void dunedaq::dpdklibs::udp::hex_digits_to_stream ( std::ostringstream & ostrs,
int value,
char separator = ':',
char fill = '0',
int digits = 2 )
inline

Definition at line 102 of file Utils.cpp.

102 :', char fill = '0', int digits = 2)
103{
104 ostrs << std::setfill(fill) << std::setw(digits) << std::hex << value << std::dec << separator;
105}

◆ ip_address_binary_to_dotdecimal()

struct ipaddr dunedaq::dpdklibs::udp::ip_address_binary_to_dotdecimal ( rte_le32_t binary_ipv4_address)

Definition at line 48 of file Utils.cpp.

49{
50 struct ipaddr addr;
51 memcpy(&addr, &binary_ipv4_address, sizeof(rte_le32_t));
52 return addr;
53}

◆ ip_address_dotdecimal_to_binary()

rte_be32_t dunedaq::dpdklibs::udp::ip_address_dotdecimal_to_binary ( std::uint8_t byte1,
std::uint8_t byte2,
std::uint8_t byte3,
std::uint8_t byte4 )

Definition at line 41 of file Utils.cpp.

42{
43 rte_le32_t ip_address = (byte1 << 24) | (byte2 << 16) | (byte3 << 8) | byte4;
44 return rte_cpu_to_be_32(ip_address);
45}

◆ packet_fill()

rte_le16_t dunedaq::dpdklibs::udp::packet_fill ( struct ipv4_udp_packet_hdr * packet_hdr)

Definition at line 66 of file PacketCtor.cpp.

67{
68 // rte_le16_t total_length = 64;
69 // char message[] = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
70
71 rte_le16_t total_length = 2000;
72 char message[] =
73 "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"
74 "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"
75 "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"
76 "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"
77 "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"
78 "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"
79 "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"
80 "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"
81 "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"
82 "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"
83 "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"
84 "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"
85 "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"
86 "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"
87 "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"
88 "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"
89 "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"
90 "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE";
91
92 char* payload = (char*)(packet_hdr + 1);
93 memcpy(payload, message, total_length);
94 return total_length;
95}

◆ pktgen_ether_hdr_ctor()

void dunedaq::dpdklibs::udp::pktgen_ether_hdr_ctor ( struct ipv4_udp_packet_hdr * packet_hdr,
const std::string & router_mac_address,
const int port_id )

pktgen_ether_hdr_ctor - Ethernet header constructor routine.

DESCRIPTION Construct the ethernet header for a given packet buffer.

RETURNS: Pointer to memory after the ethernet header.

SEE ALSO:

Definition at line 206 of file PacketCtor.cpp.

207{
208 // pg_ether_addr_copy(&pkt->eth_src_addr, &eth->src_addr);
209 // pg_ether_addr_copy(&pkt->eth_dst_addr, &eth->dst_addr);
210
211 /* src and dest addr */
212 // See definition dpdk-20.08/lib/librte_net/rte_ether.c is defined as static -> not exposed to the lib... redefining
213 // here
214
215 get_ether_addr6(router_mac_address.c_str(), &packet_hdr->eth_hdr.dst_addr);
216
217 rte_eth_macaddr_get(port_id, &packet_hdr->eth_hdr.src_addr);
218
219 /* normal ethernet header */
220 packet_hdr->eth_hdr.ether_type = rte_cpu_to_be_16(RTE_ETHER_TYPE_IPV4);
221 return;
222}
bool get_ether_addr6(const char *s0, struct rte_ether_addr *ea)

◆ pktgen_ipv4_ctor()

void dunedaq::dpdklibs::udp::pktgen_ipv4_ctor ( struct ipv4_udp_packet_hdr * packet_hdr,
rte_le16_t packet_len,
const std::string & src_ip_addr,
const std::string & dst_ip_addr )

pktgen_ipv4_ctor - Construct the IPv4 header for a packet

DESCRIPTION Constructor for the IPv4 header for a given packet.

RETURNS: N/A

SEE ALSO:

Definition at line 137 of file PacketCtor.cpp.

141{
142 /* IPv4 Header constructor */
143
144 /* Zero out the header space */
145 memset((char*)&packet_hdr->ipv4_hdr, 0, sizeof(struct rte_ipv4_hdr));
146
147 IpAddr src(src_ip_addr);
148 IpAddr dst(dst_ip_addr);
149
150 struct ipaddr src_reversed_order;
151 src_reversed_order.addr_bytes[3] = src.addr_bytes[0];
152 src_reversed_order.addr_bytes[2] = src.addr_bytes[1];
153 src_reversed_order.addr_bytes[1] = src.addr_bytes[2];
154 src_reversed_order.addr_bytes[0] = src.addr_bytes[3];
155
156 struct ipaddr dst_reversed_order;
157 dst_reversed_order.addr_bytes[3] = dst.addr_bytes[0];
158 dst_reversed_order.addr_bytes[2] = dst.addr_bytes[1];
159 dst_reversed_order.addr_bytes[1] = dst.addr_bytes[2];
160 dst_reversed_order.addr_bytes[0] = dst.addr_bytes[3];
161
162 rte_le32_t src_addr_ser = *((rte_le32_t*)&src_reversed_order);
163 rte_le32_t dst_addr_ser = *((rte_le32_t*)&dst_reversed_order);
164
165 packet_hdr->ipv4_hdr.src_addr = rte_cpu_to_be_32(src_addr_ser);
166 packet_hdr->ipv4_hdr.dst_addr = rte_cpu_to_be_32(dst_addr_ser);
167
168 packet_hdr->ipv4_hdr.version_ihl = (IPV4_VERSION << 4) | (sizeof(struct rte_ipv4_hdr) / 4);
169
170 packet_hdr->ipv4_hdr.total_length = rte_cpu_to_be_16(packet_len); // Payload + udp_hdr + iphdr
171 packet_hdr->ipv4_hdr.time_to_live = DEFAULT_TTL;
172 packet_hdr->ipv4_hdr.type_of_service = DEFAULT_TOS;
173
174 // https://perso.telecom-paristech.fr/drossi/paper/rossi17ipid.pdf
175 packet_hdr->ipv4_hdr.packet_id = rte_cpu_to_be_16(0); // I put a constant here..
176 packet_hdr->ipv4_hdr.fragment_offset = 0;
177 packet_hdr->ipv4_hdr.next_proto_id = IPPROTO_UDP;
178
179 packet_hdr->ipv4_hdr.hdr_checksum = 0;
180 // packet_hdr->ipv4_hdr.hdr_checksum = rte_ipv4_cksum(&packet_hdr->ipv4_hdr);
181
182 // UDP checksum
183 packet_hdr->udp_hdr.dgram_cksum = 0;
184 // packet_hdr->udp_hdr.dgram_cksum = rte_ipv4_udptcp_cksum(&packet_hdr->ipv4_hdr, (void *) &packet_hdr->udp_hdr);
185 // if (packet_hdr->udp_hdr.dgram_cksum == 0) {
186 // packet_hdr->udp_hdr.dgram_cksum = 0xFFFF;
187 // }
188 return;
189}
#define IPV4_VERSION
Definition PacketCtor.cpp:9

◆ pktgen_udp_hdr_ctor()

void dunedaq::dpdklibs::udp::pktgen_udp_hdr_ctor ( struct ipv4_udp_packet_hdr * packet_hdr,
rte_le16_t packet_len,
int sport,
int dport )

pktgen_udp_hdr_ctor - UDP header constructor routine.

DESCRIPTION Construct the UDP header in a packer buffer.

RETURNS: next header location

SEE ALSO:

Definition at line 111 of file PacketCtor.cpp.

112{
113 packet_hdr->udp_hdr.dgram_len = rte_cpu_to_be_16(packet_len);
114
115 packet_hdr->udp_hdr.src_port = rte_cpu_to_be_16(sport);
116 packet_hdr->udp_hdr.dst_port = rte_cpu_to_be_16(dport);
117
118 packet_hdr->udp_hdr.dgram_cksum = 0; // checksum must be set to 0 in the L4 header by the caller.
119 // TODO I think that the payload must be already there and continuous in memory..
120 return;
121}

◆ set_daqethheader_test_values()

void dunedaq::dpdklibs::udp::set_daqethheader_test_values ( detdataformats::DAQEthHeader & daqethheader_obj)
noexcept

Definition at line 237 of file Utils.cpp.

238{
239 daqethheader_obj.version = 0;
240 daqethheader_obj.det_id = 1;
241 daqethheader_obj.crate_id = 2;
242 daqethheader_obj.slot_id = 3;
243 daqethheader_obj.stream_id = 4;
244 daqethheader_obj.reserved = 5;
245 daqethheader_obj.seq_id = 6;
246 daqethheader_obj.block_length = 7;
247 daqethheader_obj.timestamp = 8;
248}

Variable Documentation

◆ __rte_packed

struct dunedaq::dpdklibs::udp::ipv4_udp_packet_hdr dunedaq::dpdklibs::udp::__rte_packed