|
6 | 6 | //! |
7 | 7 | //! This module corresponds to the `/proc/net` directory and contains various information about the |
8 | 8 | //! networking layer. |
9 | | -use crate::ProcResult; |
10 | 9 | use crate::{build_internal_error, expect, from_iter, from_str}; |
11 | | -use std::collections::HashMap; |
12 | | - |
| 10 | +use crate::{KernelVersion, ProcResult}; |
13 | 11 | use bitflags::bitflags; |
| 12 | +use std::collections::HashMap; |
14 | 13 | use std::io::BufRead; |
15 | 14 | use std::net::{Ipv4Addr, Ipv6Addr, SocketAddr, SocketAddrV4, SocketAddrV6}; |
16 | 15 | use std::{path::PathBuf, str::FromStr}; |
@@ -296,9 +295,15 @@ impl super::FromBufReadSI for UdpNetEntries { |
296 | 295 | let uid = from_str!(u32, expect!(s.next(), "udp::uid")); |
297 | 296 | s.next(); // skip timeout |
298 | 297 | let inode = expect!(s.next(), "udp::inode"); |
299 | | - s.next(); // skip ref |
300 | | - s.next(); // skip pointer |
301 | | - let drops = expect!(s.next(), "udp::drops"); |
| 298 | + |
| 299 | + let drops = match system_info.kernel_version() { |
| 300 | + Ok(version) if version >= KernelVersion::new(2, 6, 27) => { |
| 301 | + s.next(); // skip ref |
| 302 | + s.next(); // skip pointer |
| 303 | + expect!(s.next(), "udp::drops") |
| 304 | + } |
| 305 | + _ => "0", // Fallback if the kernel version does not support the drops column or the kernel version could not be read |
| 306 | + }; |
302 | 307 |
|
303 | 308 | vec.push(UdpNetEntry { |
304 | 309 | local_address: parse_addressport_str(local_address, system_info.is_little_endian())?, |
@@ -1735,24 +1740,51 @@ UdpLite: 0 0 0 0 0 0 0 0 0 |
1735 | 1740 | } |
1736 | 1741 |
|
1737 | 1742 | #[test] |
1738 | | - fn test_udp_drops_debian_12() { |
1739 | | - let data = r#" sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode ref pointer drops |
1740 | | - 624: 00000000:D77C 00000000:0000 07 00000000:00000000 00:00000000 00000000 104 0 3719666 2 000000008fba5196 0 |
1741 | | - 824: 00000000:0044 00000000:0000 07 00000000:00000000 00:00000000 00000000 0 0 14796 2 0000000051381d39 0 |
1742 | | - 918: 00000000:00A2 00000000:0000 07 00000000:00000000 00:00000000 00000000 104 0 3719670 2 0000000048ae40a7 0 |
1743 | | - 1270: 00000000:0202 00000000:0000 07 00000000:00000000 00:00000000 00000000 104 0 3719665 2 00000000357eb7c3 0 |
1744 | | - 1357: 00000000:AA59 00000000:0000 07 00000000:00000000 00:00000000 00000000 104 0 3719668 2 000000000ed7b854 0"#; |
| 1743 | + fn test_udp_drops_debian_kernel_version_greater_2_6_27() { |
| 1744 | + let expected_drops = 42; |
| 1745 | + let data = format!( |
| 1746 | + r#" sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode ref pointer drops |
| 1747 | + 1270: 00000000:0202 00000000:0000 07 00000000:00000000 00:00000000 00000000 104 0 3719665 2 00000000357eb7c3 {expected_drops}"# |
| 1748 | + ); |
1745 | 1749 | let r = std::io::Cursor::new(data.as_bytes()); |
1746 | 1750 | use crate::FromBufReadSI; |
1747 | | - let res = UdpNetEntries::from_buf_read( |
| 1751 | + let entries = UdpNetEntries::from_buf_read( |
1748 | 1752 | r, |
1749 | 1753 | &crate::ExplicitSystemInfo { |
1750 | 1754 | boot_time_secs: 0, |
1751 | 1755 | ticks_per_second: 0, |
1752 | 1756 | page_size: 0, |
1753 | 1757 | is_little_endian: true, |
| 1758 | + kernel_version: "2.6.27".parse().unwrap(), |
1754 | 1759 | }, |
| 1760 | + ) |
| 1761 | + .unwrap(); |
| 1762 | + let entry = entries.0.first().unwrap(); |
| 1763 | + |
| 1764 | + assert_eq!(entry.drops, expected_drops) |
| 1765 | + } |
| 1766 | + |
| 1767 | + #[test] |
| 1768 | + fn test_udp_drops_debian_kernel_version_smaller_2_6_27() { |
| 1769 | + let data = format!( |
| 1770 | + r#" sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode |
| 1771 | + 1270: 00000000:0202 00000000:0000 07 00000000:00000000 00:00000000 00000000 104 0 3719665"# |
1755 | 1772 | ); |
1756 | | - assert!(res.is_ok()) |
| 1773 | + let r = std::io::Cursor::new(data.as_bytes()); |
| 1774 | + use crate::FromBufReadSI; |
| 1775 | + let entries = UdpNetEntries::from_buf_read( |
| 1776 | + r, |
| 1777 | + &crate::ExplicitSystemInfo { |
| 1778 | + boot_time_secs: 0, |
| 1779 | + ticks_per_second: 0, |
| 1780 | + page_size: 0, |
| 1781 | + is_little_endian: true, |
| 1782 | + kernel_version: "2.6.26".parse().unwrap(), |
| 1783 | + }, |
| 1784 | + ) |
| 1785 | + .unwrap(); |
| 1786 | + let entry = entries.0.first().unwrap(); |
| 1787 | + |
| 1788 | + assert_eq!(entry.drops, 0) |
1757 | 1789 | } |
1758 | 1790 | } |
0 commit comments