@@ -1499,10 +1499,15 @@ static __always_inline void auxmap__store_fdlist_param(struct auxiliary_map *aux
1499
1499
sizeof (uint16_t ) + (num_pairs * (sizeof (int64_t ) + sizeof (int16_t ))));
1500
1500
}
1501
1501
1502
+ typedef struct {
1503
+ bool only_port_range ;
1504
+ ppm_event_code evt_type ;
1505
+ long mmsg_index ;
1506
+ } dynamic_snaplen_args ;
1507
+
1502
1508
static __always_inline void apply_dynamic_snaplen (struct pt_regs * regs ,
1503
1509
uint16_t * snaplen ,
1504
- bool only_port_range ,
1505
- ppm_event_code evt_type ) {
1510
+ const dynamic_snaplen_args * input_args ) {
1506
1511
if (!maps__get_do_dynamic_snaplen ()) {
1507
1512
return ;
1508
1513
}
@@ -1519,7 +1524,9 @@ static __always_inline void apply_dynamic_snaplen(struct pt_regs *regs,
1519
1524
* - writev
1520
1525
* - pwritev
1521
1526
* - recvmsg
1527
+ * - recvmmsg
1522
1528
* - sendmsg
1529
+ * - sendmmsg
1523
1530
* - send
1524
1531
* - recv
1525
1532
* - recvfrom
@@ -1539,12 +1546,14 @@ static __always_inline void apply_dynamic_snaplen(struct pt_regs *regs,
1539
1546
* - writev
1540
1547
* - pwritev
1541
1548
* - recvmsg
1549
+ * - recvmmsg
1542
1550
* - sendmsg
1551
+ * - sendmmsg
1543
1552
*/
1544
1553
unsigned long args [5 ] = {0 };
1545
1554
struct sockaddr * sockaddr = NULL ;
1546
1555
1547
- switch (evt_type ) {
1556
+ switch (input_args -> evt_type ) {
1548
1557
case PPME_SOCKET_SENDTO_X :
1549
1558
case PPME_SOCKET_RECVFROM_X :
1550
1559
extract__network_args (args , 5 , regs );
@@ -1571,6 +1580,30 @@ static __always_inline void apply_dynamic_snaplen(struct pt_regs *regs,
1571
1580
}
1572
1581
} break ;
1573
1582
1583
+ case PPME_SOCKET_RECVMMSG_X :
1584
+ case PPME_SOCKET_SENDMMSG_X : {
1585
+ extract__network_args (args , 3 , regs );
1586
+ if (bpf_in_ia32_syscall ()) {
1587
+ struct compat_mmsghdr compat_mmh = {};
1588
+ struct compat_mmsghdr * mmh_ptr = (struct compat_mmsghdr * )args [1 ];
1589
+ if (likely (bpf_probe_read_user (& compat_mmh ,
1590
+ bpf_core_type_size (struct compat_mmsghdr ),
1591
+ (void * )(mmh_ptr + input_args -> mmsg_index )) == 0 )) {
1592
+ sockaddr = (struct sockaddr * )(unsigned long )(compat_mmh .msg_hdr .msg_name );
1593
+ }
1594
+ // in any case we break the switch.
1595
+ break ;
1596
+ }
1597
+
1598
+ struct mmsghdr mmh = {};
1599
+ struct mmsghdr * mmh_ptr = (struct mmsghdr * )args [1 ];
1600
+ if (bpf_probe_read_user (& mmh ,
1601
+ bpf_core_type_size (struct mmsghdr ),
1602
+ (void * )(mmh_ptr + input_args -> mmsg_index )) == 0 ) {
1603
+ sockaddr = (struct sockaddr * )mmh .msg_hdr .msg_name ;
1604
+ }
1605
+ } break ;
1606
+
1574
1607
default :
1575
1608
extract__network_args (args , 3 , regs );
1576
1609
break ;
@@ -1639,7 +1672,7 @@ static __always_inline void apply_dynamic_snaplen(struct pt_regs *regs,
1639
1672
}
1640
1673
1641
1674
/* If we check only port range without reading syscall data we can stop here */
1642
- if (only_port_range ) {
1675
+ if (input_args -> only_port_range ) {
1643
1676
return ;
1644
1677
}
1645
1678
0 commit comments