mirror of https://github.com/torvalds/linux.git
Quite smaller than usual. Notably it includes the fix for the unix
regression you have been notified of in the past weeks. The TCP window fix will require some follow-up, already queued. Current release - regressions: - af_unix: fix garbage collection of embryos Previous releases - regressions: - af_unix: fix race between GC and receive path - ipv6: sr: fix missing sk_buff release in seg6_input_core - tcp: remove 64 KByte limit for initial tp->rcv_wnd value - eth: r8169: fix rx hangup - eth: lan966x: remove ptp traps in case the ptp is not enabled. - eth: ixgbe: fix link breakage vs cisco switches. - eth: ice: prevent ethtool from corrupting the channels. Previous releases - always broken: - openvswitch: set the skbuff pkt_type for proper pmtud support. - tcp: Fix shift-out-of-bounds in dctcp_update_alpha(). Misc: - a bunch of selftests stabilization patches. Signed-off-by: Paolo Abeni <pabeni@redhat.com> -----BEGIN PGP SIGNATURE----- iQJGBAABCAAwFiEEg1AjqC77wbdLX2LbKSR5jcyPE6QFAmZPXmUSHHBhYmVuaUBy ZWRoYXQuY29tAAoJECkkeY3MjxOk/o4QAJTA/LcQmHkObgQWyJ7vSykhRFmxSsfR Qc/DstWuNkM+xDbasdjlxaM+BPgf0RduyB/bsPOr8UvGw0S0NUwQBC9V9bgQ0p67 D9qrZH6gEDRbzG+mkbF49SXksJMSdNSygWc4YnYaCW+eufpCaZwN15q+4pAgAWfW UmSra9wCkgl9nRc7N4+UEJbhhi0Lso/yaRlHUUUooHOP0ENDe3JSKidUyS3UuhYc Ah75gKIMm9BygUhg/+mrsRyeb1kfXMfJ54ku/uEIimErG4rTntCJCAc+dBoRXtob pImg4xfgr1OBL1wQKTHM+nvhE+DThLAJOSguX2RYvTvklx/l00tL1PQkA/kn6XNM HdQGnDoN1JpUs3xw90hxWp0gzOwJ1XCjbXT/Dx2kp+ltFj0A1EZViTNNTgh6y2E0 B5oo8NFD0y02ilMdaGW/KOpceglO82p2P4DEc0kBAYvCICQ8MKMdtThuubQeB0FK EO7Xs7lKbDXLJUDtmN4EiE1sofvLVD+1htGt5FG2jtizyQ5Ho/b2aTk2uq0kRN3F mZgaXcNR3sOJGBdaTvzquALZ2Dt69w0D3EHGv/30tD5zwQO8j71W5OoWTnjknWUp Nh7ytL/YlqvwJI47UuuTeDBh95jb/KpTWFv8EYsQLI0JOTfa1VXsoDxidg6rnHuX mvLdIOtzTZqU =zd2T -----END PGP SIGNATURE----- Merge tag 'net-6.10-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net Pull networking fixes from Paolo Abeni: "Quite smaller than usual. Notably it includes the fix for the unix regression from the past weeks. The TCP window fix will require some follow-up, already queued. Current release - regressions: - af_unix: fix garbage collection of embryos Previous releases - regressions: - af_unix: fix race between GC and receive path - ipv6: sr: fix missing sk_buff release in seg6_input_core - tcp: remove 64 KByte limit for initial tp->rcv_wnd value - eth: r8169: fix rx hangup - eth: lan966x: remove ptp traps in case the ptp is not enabled - eth: ixgbe: fix link breakage vs cisco switches - eth: ice: prevent ethtool from corrupting the channels Previous releases - always broken: - openvswitch: set the skbuff pkt_type for proper pmtud support - tcp: Fix shift-out-of-bounds in dctcp_update_alpha() Misc: - a bunch of selftests stabilization patches" * tag 'net-6.10-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net: (25 commits) r8169: Fix possible ring buffer corruption on fragmented Tx packets. idpf: Interpret .set_channels() input differently ice: Interpret .set_channels() input differently nfc: nci: Fix handling of zero-length payload packets in nci_rx_work() net: relax socket state check at accept time. tcp: remove 64 KByte limit for initial tp->rcv_wnd value net: ti: icssg_prueth: Fix NULL pointer dereference in prueth_probe() tls: fix missing memory barrier in tls_init net: fec: avoid lock evasion when reading pps_enable Revert "ixgbe: Manual AN-37 for troublesome link partners for X550 SFI" testing: net-drv: use stats64 for testing net: mana: Fix the extra HZ in mana_hwc_send_request net: lan966x: Remove ptp traps in case the ptp is not enabled. openvswitch: Set the skbuff pkt_type for proper pmtud support. selftest: af_unix: Make SCM_RIGHTS into OOB data. af_unix: Fix garbage collection of embryos carrying OOB with SCM_RIGHTS tcp: Fix shift-out-of-bounds in dctcp_update_alpha(). selftests/net: use tc rule to filter the na packet ipv6: sr: fix memleak in seg6_hmac_init_algo af_unix: Update unix_sk(sk)->oob_skb under sk_receive_queue lock. ...
This commit is contained in:
commit
66ad4829dd
|
|
@ -49,7 +49,9 @@ obj-$(CONFIG_MHI_NET) += mhi_net.o
|
|||
obj-$(CONFIG_ARCNET) += arcnet/
|
||||
obj-$(CONFIG_CAIF) += caif/
|
||||
obj-$(CONFIG_CAN) += can/
|
||||
obj-$(CONFIG_NET_DSA) += dsa/
|
||||
ifdef CONFIG_NET_DSA
|
||||
obj-y += dsa/
|
||||
endif
|
||||
obj-$(CONFIG_ETHERNET) += ethernet/
|
||||
obj-$(CONFIG_FDDI) += fddi/
|
||||
obj-$(CONFIG_HIPPI) += hippi/
|
||||
|
|
|
|||
|
|
@ -104,14 +104,13 @@ static int fec_ptp_enable_pps(struct fec_enet_private *fep, uint enable)
|
|||
struct timespec64 ts;
|
||||
u64 ns;
|
||||
|
||||
if (fep->pps_enable == enable)
|
||||
return 0;
|
||||
|
||||
fep->pps_channel = DEFAULT_PPS_CHANNEL;
|
||||
fep->reload_period = PPS_OUPUT_RELOAD_PERIOD;
|
||||
|
||||
spin_lock_irqsave(&fep->tmreg_lock, flags);
|
||||
|
||||
if (fep->pps_enable == enable) {
|
||||
spin_unlock_irqrestore(&fep->tmreg_lock, flags);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (enable) {
|
||||
/* clear capture or output compare interrupt status if have.
|
||||
*/
|
||||
|
|
@ -532,6 +531,9 @@ static int fec_ptp_enable(struct ptp_clock_info *ptp,
|
|||
int ret = 0;
|
||||
|
||||
if (rq->type == PTP_CLK_REQ_PPS) {
|
||||
fep->pps_channel = DEFAULT_PPS_CHANNEL;
|
||||
fep->reload_period = PPS_OUPUT_RELOAD_PERIOD;
|
||||
|
||||
ret = fec_ptp_enable_pps(fep, on);
|
||||
|
||||
return ret;
|
||||
|
|
|
|||
|
|
@ -3593,7 +3593,6 @@ static int ice_set_channels(struct net_device *dev, struct ethtool_channels *ch)
|
|||
struct ice_pf *pf = vsi->back;
|
||||
int new_rx = 0, new_tx = 0;
|
||||
bool locked = false;
|
||||
u32 curr_combined;
|
||||
int ret = 0;
|
||||
|
||||
/* do not support changing channels in Safe Mode */
|
||||
|
|
@ -3615,22 +3614,8 @@ static int ice_set_channels(struct net_device *dev, struct ethtool_channels *ch)
|
|||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
curr_combined = ice_get_combined_cnt(vsi);
|
||||
|
||||
/* these checks are for cases where user didn't specify a particular
|
||||
* value on cmd line but we get non-zero value anyway via
|
||||
* get_channels(); look at ethtool.c in ethtool repository (the user
|
||||
* space part), particularly, do_schannels() routine
|
||||
*/
|
||||
if (ch->rx_count == vsi->num_rxq - curr_combined)
|
||||
ch->rx_count = 0;
|
||||
if (ch->tx_count == vsi->num_txq - curr_combined)
|
||||
ch->tx_count = 0;
|
||||
if (ch->combined_count == curr_combined)
|
||||
ch->combined_count = 0;
|
||||
|
||||
if (!(ch->combined_count || (ch->rx_count && ch->tx_count))) {
|
||||
netdev_err(dev, "Please specify at least 1 Rx and 1 Tx channel\n");
|
||||
if (ch->rx_count && ch->tx_count) {
|
||||
netdev_err(dev, "Dedicated RX or TX channels cannot be used simultaneously\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -222,14 +222,19 @@ static int idpf_set_channels(struct net_device *netdev,
|
|||
struct ethtool_channels *ch)
|
||||
{
|
||||
struct idpf_vport_config *vport_config;
|
||||
u16 combined, num_txq, num_rxq;
|
||||
unsigned int num_req_tx_q;
|
||||
unsigned int num_req_rx_q;
|
||||
struct idpf_vport *vport;
|
||||
u16 num_txq, num_rxq;
|
||||
struct device *dev;
|
||||
int err = 0;
|
||||
u16 idx;
|
||||
|
||||
if (ch->rx_count && ch->tx_count) {
|
||||
netdev_err(netdev, "Dedicated RX or TX channels cannot be used simultaneously\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
idpf_vport_ctrl_lock(netdev);
|
||||
vport = idpf_netdev_to_vport(netdev);
|
||||
|
||||
|
|
@ -239,20 +244,6 @@ static int idpf_set_channels(struct net_device *netdev,
|
|||
num_txq = vport_config->user_config.num_req_tx_qs;
|
||||
num_rxq = vport_config->user_config.num_req_rx_qs;
|
||||
|
||||
combined = min(num_txq, num_rxq);
|
||||
|
||||
/* these checks are for cases where user didn't specify a particular
|
||||
* value on cmd line but we get non-zero value anyway via
|
||||
* get_channels(); look at ethtool.c in ethtool repository (the user
|
||||
* space part), particularly, do_schannels() routine
|
||||
*/
|
||||
if (ch->combined_count == combined)
|
||||
ch->combined_count = 0;
|
||||
if (ch->combined_count && ch->rx_count == num_rxq - combined)
|
||||
ch->rx_count = 0;
|
||||
if (ch->combined_count && ch->tx_count == num_txq - combined)
|
||||
ch->tx_count = 0;
|
||||
|
||||
num_req_tx_q = ch->combined_count + ch->tx_count;
|
||||
num_req_rx_q = ch->combined_count + ch->rx_count;
|
||||
|
||||
|
|
|
|||
|
|
@ -3675,9 +3675,7 @@ struct ixgbe_info {
|
|||
#define IXGBE_KRM_LINK_S1(P) ((P) ? 0x8200 : 0x4200)
|
||||
#define IXGBE_KRM_LINK_CTRL_1(P) ((P) ? 0x820C : 0x420C)
|
||||
#define IXGBE_KRM_AN_CNTL_1(P) ((P) ? 0x822C : 0x422C)
|
||||
#define IXGBE_KRM_AN_CNTL_4(P) ((P) ? 0x8238 : 0x4238)
|
||||
#define IXGBE_KRM_AN_CNTL_8(P) ((P) ? 0x8248 : 0x4248)
|
||||
#define IXGBE_KRM_PCS_KX_AN(P) ((P) ? 0x9918 : 0x5918)
|
||||
#define IXGBE_KRM_SGMII_CTRL(P) ((P) ? 0x82A0 : 0x42A0)
|
||||
#define IXGBE_KRM_LP_BASE_PAGE_HIGH(P) ((P) ? 0x836C : 0x436C)
|
||||
#define IXGBE_KRM_DSP_TXFFE_STATE_4(P) ((P) ? 0x8634 : 0x4634)
|
||||
|
|
@ -3687,7 +3685,6 @@ struct ixgbe_info {
|
|||
#define IXGBE_KRM_PMD_FLX_MASK_ST20(P) ((P) ? 0x9054 : 0x5054)
|
||||
#define IXGBE_KRM_TX_COEFF_CTRL_1(P) ((P) ? 0x9520 : 0x5520)
|
||||
#define IXGBE_KRM_RX_ANA_CTL(P) ((P) ? 0x9A00 : 0x5A00)
|
||||
#define IXGBE_KRM_FLX_TMRS_CTRL_ST31(P) ((P) ? 0x9180 : 0x5180)
|
||||
|
||||
#define IXGBE_KRM_PMD_FLX_MASK_ST20_SFI_10G_DA ~(0x3 << 20)
|
||||
#define IXGBE_KRM_PMD_FLX_MASK_ST20_SFI_10G_SR BIT(20)
|
||||
|
|
|
|||
|
|
@ -1722,59 +1722,9 @@ static int ixgbe_setup_sfi_x550a(struct ixgbe_hw *hw, ixgbe_link_speed *speed)
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
(void)mac->ops.write_iosf_sb_reg(hw,
|
||||
IXGBE_KRM_PMD_FLX_MASK_ST20(hw->bus.lan_id),
|
||||
IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
|
||||
|
||||
/* change mode enforcement rules to hybrid */
|
||||
(void)mac->ops.read_iosf_sb_reg(hw,
|
||||
IXGBE_KRM_FLX_TMRS_CTRL_ST31(hw->bus.lan_id),
|
||||
IXGBE_SB_IOSF_TARGET_KR_PHY, ®_val);
|
||||
reg_val |= 0x0400;
|
||||
|
||||
(void)mac->ops.write_iosf_sb_reg(hw,
|
||||
IXGBE_KRM_FLX_TMRS_CTRL_ST31(hw->bus.lan_id),
|
||||
IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
|
||||
|
||||
/* manually control the config */
|
||||
(void)mac->ops.read_iosf_sb_reg(hw,
|
||||
IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
|
||||
IXGBE_SB_IOSF_TARGET_KR_PHY, ®_val);
|
||||
reg_val |= 0x20002240;
|
||||
|
||||
(void)mac->ops.write_iosf_sb_reg(hw,
|
||||
IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
|
||||
IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
|
||||
|
||||
/* move the AN base page values */
|
||||
(void)mac->ops.read_iosf_sb_reg(hw,
|
||||
IXGBE_KRM_PCS_KX_AN(hw->bus.lan_id),
|
||||
IXGBE_SB_IOSF_TARGET_KR_PHY, ®_val);
|
||||
reg_val |= 0x1;
|
||||
|
||||
(void)mac->ops.write_iosf_sb_reg(hw,
|
||||
IXGBE_KRM_PCS_KX_AN(hw->bus.lan_id),
|
||||
IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
|
||||
|
||||
/* set the AN37 over CB mode */
|
||||
(void)mac->ops.read_iosf_sb_reg(hw,
|
||||
IXGBE_KRM_AN_CNTL_4(hw->bus.lan_id),
|
||||
IXGBE_SB_IOSF_TARGET_KR_PHY, ®_val);
|
||||
reg_val |= 0x20000000;
|
||||
|
||||
(void)mac->ops.write_iosf_sb_reg(hw,
|
||||
IXGBE_KRM_AN_CNTL_4(hw->bus.lan_id),
|
||||
IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
|
||||
|
||||
/* restart AN manually */
|
||||
(void)mac->ops.read_iosf_sb_reg(hw,
|
||||
IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
|
||||
IXGBE_SB_IOSF_TARGET_KR_PHY, ®_val);
|
||||
reg_val |= IXGBE_KRM_LINK_CTRL_1_TETH_AN_RESTART;
|
||||
|
||||
(void)mac->ops.write_iosf_sb_reg(hw,
|
||||
IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
|
||||
IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
|
||||
status = mac->ops.write_iosf_sb_reg(hw,
|
||||
IXGBE_KRM_PMD_FLX_MASK_ST20(hw->bus.lan_id),
|
||||
IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
|
||||
|
||||
/* Toggle port SW reset by AN reset. */
|
||||
status = ixgbe_restart_an_internal_phy_x550em(hw);
|
||||
|
|
|
|||
|
|
@ -474,14 +474,14 @@ static int lan966x_port_hwtstamp_set(struct net_device *dev,
|
|||
cfg->source != HWTSTAMP_SOURCE_PHYLIB)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (cfg->source == HWTSTAMP_SOURCE_NETDEV && !port->lan966x->ptp)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
err = lan966x_ptp_setup_traps(port, cfg);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
if (cfg->source == HWTSTAMP_SOURCE_NETDEV) {
|
||||
if (!port->lan966x->ptp)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
err = lan966x_ptp_hwtstamp_set(port, cfg, extack);
|
||||
if (err) {
|
||||
lan966x_ptp_del_traps(port);
|
||||
|
|
|
|||
|
|
@ -849,7 +849,7 @@ int mana_hwc_send_request(struct hw_channel_context *hwc, u32 req_len,
|
|||
}
|
||||
|
||||
if (!wait_for_completion_timeout(&ctx->comp_event,
|
||||
(msecs_to_jiffies(hwc->hwc_timeout) * HZ))) {
|
||||
(msecs_to_jiffies(hwc->hwc_timeout)))) {
|
||||
dev_err(hwc->dev, "HWC: Request timed out!\n");
|
||||
err = -ETIMEDOUT;
|
||||
goto out;
|
||||
|
|
|
|||
|
|
@ -4337,11 +4337,11 @@ static void rtl8169_doorbell(struct rtl8169_private *tp)
|
|||
static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb,
|
||||
struct net_device *dev)
|
||||
{
|
||||
unsigned int frags = skb_shinfo(skb)->nr_frags;
|
||||
struct rtl8169_private *tp = netdev_priv(dev);
|
||||
unsigned int entry = tp->cur_tx % NUM_TX_DESC;
|
||||
struct TxDesc *txd_first, *txd_last;
|
||||
bool stop_queue, door_bell;
|
||||
unsigned int frags;
|
||||
u32 opts[2];
|
||||
|
||||
if (unlikely(!rtl_tx_slots_avail(tp))) {
|
||||
|
|
@ -4364,6 +4364,7 @@ static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb,
|
|||
|
||||
txd_first = tp->TxDescArray + entry;
|
||||
|
||||
frags = skb_shinfo(skb)->nr_frags;
|
||||
if (frags) {
|
||||
if (rtl8169_xmit_frags(tp, skb, opts, entry))
|
||||
goto err_dma_1;
|
||||
|
|
@ -4657,10 +4658,8 @@ static irqreturn_t rtl8169_interrupt(int irq, void *dev_instance)
|
|||
rtl_schedule_task(tp, RTL_FLAG_TASK_RESET_PENDING);
|
||||
}
|
||||
|
||||
if (napi_schedule_prep(&tp->napi)) {
|
||||
rtl_irq_disable(tp);
|
||||
__napi_schedule(&tp->napi);
|
||||
}
|
||||
rtl_irq_disable(tp);
|
||||
napi_schedule(&tp->napi);
|
||||
out:
|
||||
rtl_ack_events(tp, status);
|
||||
|
||||
|
|
|
|||
|
|
@ -1039,7 +1039,12 @@ static int prueth_probe(struct platform_device *pdev)
|
|||
|
||||
prueth->registered_netdevs[PRUETH_MAC0] = prueth->emac[PRUETH_MAC0]->ndev;
|
||||
|
||||
emac_phy_connect(prueth->emac[PRUETH_MAC0]);
|
||||
ret = emac_phy_connect(prueth->emac[PRUETH_MAC0]);
|
||||
if (ret) {
|
||||
dev_err(dev,
|
||||
"can't connect to MII0 PHY, error -%d", ret);
|
||||
goto netdev_unregister;
|
||||
}
|
||||
phy_attached_info(prueth->emac[PRUETH_MAC0]->ndev->phydev);
|
||||
}
|
||||
|
||||
|
|
@ -1051,7 +1056,12 @@ static int prueth_probe(struct platform_device *pdev)
|
|||
}
|
||||
|
||||
prueth->registered_netdevs[PRUETH_MAC1] = prueth->emac[PRUETH_MAC1]->ndev;
|
||||
emac_phy_connect(prueth->emac[PRUETH_MAC1]);
|
||||
ret = emac_phy_connect(prueth->emac[PRUETH_MAC1]);
|
||||
if (ret) {
|
||||
dev_err(dev,
|
||||
"can't connect to MII1 PHY, error %d", ret);
|
||||
goto netdev_unregister;
|
||||
}
|
||||
phy_attached_info(prueth->emac[PRUETH_MAC1]->ndev->phydev);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -758,7 +758,9 @@ void __inet_accept(struct socket *sock, struct socket *newsock, struct sock *new
|
|||
sock_rps_record_flow(newsk);
|
||||
WARN_ON(!((1 << newsk->sk_state) &
|
||||
(TCPF_ESTABLISHED | TCPF_SYN_RECV |
|
||||
TCPF_CLOSE_WAIT | TCPF_CLOSE)));
|
||||
TCPF_FIN_WAIT1 | TCPF_FIN_WAIT2 |
|
||||
TCPF_CLOSING | TCPF_CLOSE_WAIT |
|
||||
TCPF_CLOSE)));
|
||||
|
||||
if (test_bit(SOCK_SUPPORT_ZC, &sock->flags))
|
||||
set_bit(SOCK_SUPPORT_ZC, &newsock->flags);
|
||||
|
|
|
|||
|
|
@ -58,7 +58,18 @@ struct dctcp {
|
|||
};
|
||||
|
||||
static unsigned int dctcp_shift_g __read_mostly = 4; /* g = 1/2^4 */
|
||||
module_param(dctcp_shift_g, uint, 0644);
|
||||
|
||||
static int dctcp_shift_g_set(const char *val, const struct kernel_param *kp)
|
||||
{
|
||||
return param_set_uint_minmax(val, kp, 0, 10);
|
||||
}
|
||||
|
||||
static const struct kernel_param_ops dctcp_shift_g_ops = {
|
||||
.set = dctcp_shift_g_set,
|
||||
.get = param_get_uint,
|
||||
};
|
||||
|
||||
module_param_cb(dctcp_shift_g, &dctcp_shift_g_ops, &dctcp_shift_g, 0644);
|
||||
MODULE_PARM_DESC(dctcp_shift_g, "parameter g for updating dctcp_alpha");
|
||||
|
||||
static unsigned int dctcp_alpha_on_init __read_mostly = DCTCP_MAX_ALPHA;
|
||||
|
|
|
|||
|
|
@ -232,7 +232,7 @@ void tcp_select_initial_window(const struct sock *sk, int __space, __u32 mss,
|
|||
if (READ_ONCE(sock_net(sk)->ipv4.sysctl_tcp_workaround_signed_windows))
|
||||
(*rcv_wnd) = min(space, MAX_TCP_WINDOW);
|
||||
else
|
||||
(*rcv_wnd) = min_t(u32, space, U16_MAX);
|
||||
(*rcv_wnd) = space;
|
||||
|
||||
if (init_rcv_wnd)
|
||||
*rcv_wnd = min(*rcv_wnd, init_rcv_wnd * mss);
|
||||
|
|
|
|||
|
|
@ -356,6 +356,7 @@ static int seg6_hmac_init_algo(void)
|
|||
struct crypto_shash *tfm;
|
||||
struct shash_desc *shash;
|
||||
int i, alg_count, cpu;
|
||||
int ret = -ENOMEM;
|
||||
|
||||
alg_count = ARRAY_SIZE(hmac_algos);
|
||||
|
||||
|
|
@ -366,12 +367,14 @@ static int seg6_hmac_init_algo(void)
|
|||
algo = &hmac_algos[i];
|
||||
algo->tfms = alloc_percpu(struct crypto_shash *);
|
||||
if (!algo->tfms)
|
||||
return -ENOMEM;
|
||||
goto error_out;
|
||||
|
||||
for_each_possible_cpu(cpu) {
|
||||
tfm = crypto_alloc_shash(algo->name, 0, 0);
|
||||
if (IS_ERR(tfm))
|
||||
return PTR_ERR(tfm);
|
||||
if (IS_ERR(tfm)) {
|
||||
ret = PTR_ERR(tfm);
|
||||
goto error_out;
|
||||
}
|
||||
p_tfm = per_cpu_ptr(algo->tfms, cpu);
|
||||
*p_tfm = tfm;
|
||||
}
|
||||
|
|
@ -383,18 +386,22 @@ static int seg6_hmac_init_algo(void)
|
|||
|
||||
algo->shashs = alloc_percpu(struct shash_desc *);
|
||||
if (!algo->shashs)
|
||||
return -ENOMEM;
|
||||
goto error_out;
|
||||
|
||||
for_each_possible_cpu(cpu) {
|
||||
shash = kzalloc_node(shsize, GFP_KERNEL,
|
||||
cpu_to_node(cpu));
|
||||
if (!shash)
|
||||
return -ENOMEM;
|
||||
goto error_out;
|
||||
*per_cpu_ptr(algo->shashs, cpu) = shash;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
error_out:
|
||||
seg6_hmac_exit();
|
||||
return ret;
|
||||
}
|
||||
|
||||
int __init seg6_hmac_init(void)
|
||||
|
|
@ -412,22 +419,29 @@ int __net_init seg6_hmac_net_init(struct net *net)
|
|||
void seg6_hmac_exit(void)
|
||||
{
|
||||
struct seg6_hmac_algo *algo = NULL;
|
||||
struct crypto_shash *tfm;
|
||||
struct shash_desc *shash;
|
||||
int i, alg_count, cpu;
|
||||
|
||||
alg_count = ARRAY_SIZE(hmac_algos);
|
||||
for (i = 0; i < alg_count; i++) {
|
||||
algo = &hmac_algos[i];
|
||||
for_each_possible_cpu(cpu) {
|
||||
struct crypto_shash *tfm;
|
||||
struct shash_desc *shash;
|
||||
|
||||
shash = *per_cpu_ptr(algo->shashs, cpu);
|
||||
kfree(shash);
|
||||
tfm = *per_cpu_ptr(algo->tfms, cpu);
|
||||
crypto_free_shash(tfm);
|
||||
if (algo->shashs) {
|
||||
for_each_possible_cpu(cpu) {
|
||||
shash = *per_cpu_ptr(algo->shashs, cpu);
|
||||
kfree(shash);
|
||||
}
|
||||
free_percpu(algo->shashs);
|
||||
}
|
||||
|
||||
if (algo->tfms) {
|
||||
for_each_possible_cpu(cpu) {
|
||||
tfm = *per_cpu_ptr(algo->tfms, cpu);
|
||||
crypto_free_shash(tfm);
|
||||
}
|
||||
free_percpu(algo->tfms);
|
||||
}
|
||||
free_percpu(algo->tfms);
|
||||
free_percpu(algo->shashs);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(seg6_hmac_exit);
|
||||
|
|
|
|||
|
|
@ -459,10 +459,8 @@ static int seg6_input_core(struct net *net, struct sock *sk,
|
|||
int err;
|
||||
|
||||
err = seg6_do_srh(skb);
|
||||
if (unlikely(err)) {
|
||||
kfree_skb(skb);
|
||||
return err;
|
||||
}
|
||||
if (unlikely(err))
|
||||
goto drop;
|
||||
|
||||
slwt = seg6_lwt_lwtunnel(orig_dst->lwtstate);
|
||||
|
||||
|
|
@ -486,7 +484,7 @@ static int seg6_input_core(struct net *net, struct sock *sk,
|
|||
|
||||
err = skb_cow_head(skb, LL_RESERVED_SPACE(dst->dev));
|
||||
if (unlikely(err))
|
||||
return err;
|
||||
goto drop;
|
||||
|
||||
if (static_branch_unlikely(&nf_hooks_lwtunnel_enabled))
|
||||
return NF_HOOK(NFPROTO_IPV6, NF_INET_LOCAL_OUT,
|
||||
|
|
@ -494,6 +492,9 @@ static int seg6_input_core(struct net *net, struct sock *sk,
|
|||
skb_dst(skb)->dev, seg6_input_finish);
|
||||
|
||||
return seg6_input_finish(dev_net(skb->dev), NULL, skb);
|
||||
drop:
|
||||
kfree_skb(skb);
|
||||
return err;
|
||||
}
|
||||
|
||||
static int seg6_input_nf(struct sk_buff *skb)
|
||||
|
|
|
|||
|
|
@ -1463,6 +1463,19 @@ int nci_core_ntf_packet(struct nci_dev *ndev, __u16 opcode,
|
|||
ndev->ops->n_core_ops);
|
||||
}
|
||||
|
||||
static bool nci_valid_size(struct sk_buff *skb)
|
||||
{
|
||||
BUILD_BUG_ON(NCI_CTRL_HDR_SIZE != NCI_DATA_HDR_SIZE);
|
||||
unsigned int hdr_size = NCI_CTRL_HDR_SIZE;
|
||||
|
||||
if (skb->len < hdr_size ||
|
||||
!nci_plen(skb->data) ||
|
||||
skb->len < hdr_size + nci_plen(skb->data)) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/* ---- NCI TX Data worker thread ---- */
|
||||
|
||||
static void nci_tx_work(struct work_struct *work)
|
||||
|
|
@ -1516,10 +1529,9 @@ static void nci_rx_work(struct work_struct *work)
|
|||
nfc_send_to_raw_sock(ndev->nfc_dev, skb,
|
||||
RAW_PAYLOAD_NCI, NFC_DIRECTION_RX);
|
||||
|
||||
if (!nci_plen(skb->data)) {
|
||||
if (!nci_valid_size(skb)) {
|
||||
kfree_skb(skb);
|
||||
kcov_remote_stop();
|
||||
break;
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Process frame */
|
||||
|
|
|
|||
|
|
@ -936,6 +936,12 @@ static void do_output(struct datapath *dp, struct sk_buff *skb, int out_port,
|
|||
pskb_trim(skb, ovs_mac_header_len(key));
|
||||
}
|
||||
|
||||
/* Need to set the pkt_type to involve the routing layer. The
|
||||
* packet movement through the OVS datapath doesn't generally
|
||||
* use routing, but this is needed for tunnel cases.
|
||||
*/
|
||||
skb->pkt_type = PACKET_OUTGOING;
|
||||
|
||||
if (likely(!mru ||
|
||||
(skb->len <= mru + vport->dev->hard_header_len))) {
|
||||
ovs_vport_send(vport, skb, ovs_key_mac_proto(key));
|
||||
|
|
|
|||
|
|
@ -816,9 +816,17 @@ struct tls_context *tls_ctx_create(struct sock *sk)
|
|||
return NULL;
|
||||
|
||||
mutex_init(&ctx->tx_lock);
|
||||
rcu_assign_pointer(icsk->icsk_ulp_data, ctx);
|
||||
ctx->sk_proto = READ_ONCE(sk->sk_prot);
|
||||
ctx->sk = sk;
|
||||
/* Release semantic of rcu_assign_pointer() ensures that
|
||||
* ctx->sk_proto is visible before changing sk->sk_prot in
|
||||
* update_sk_prot(), and prevents reading uninitialized value in
|
||||
* tls_{getsockopt, setsockopt}. Note that we do not need a
|
||||
* read barrier in tls_{getsockopt,setsockopt} as there is an
|
||||
* address dependency between sk->sk_proto->{getsockopt,setsockopt}
|
||||
* and ctx->sk_proto.
|
||||
*/
|
||||
rcu_assign_pointer(icsk->icsk_ulp_data, ctx);
|
||||
return ctx;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2170,13 +2170,15 @@ static int queue_oob(struct socket *sock, struct msghdr *msg, struct sock *other
|
|||
maybe_add_creds(skb, sock, other);
|
||||
skb_get(skb);
|
||||
|
||||
scm_stat_add(other, skb);
|
||||
|
||||
spin_lock(&other->sk_receive_queue.lock);
|
||||
if (ousk->oob_skb)
|
||||
consume_skb(ousk->oob_skb);
|
||||
|
||||
WRITE_ONCE(ousk->oob_skb, skb);
|
||||
__skb_queue_tail(&other->sk_receive_queue, skb);
|
||||
spin_unlock(&other->sk_receive_queue.lock);
|
||||
|
||||
scm_stat_add(other, skb);
|
||||
skb_queue_tail(&other->sk_receive_queue, skb);
|
||||
sk_send_sigurg(other);
|
||||
unix_state_unlock(other);
|
||||
other->sk_data_ready(other);
|
||||
|
|
@ -2567,8 +2569,10 @@ static int unix_stream_recv_urg(struct unix_stream_read_state *state)
|
|||
|
||||
mutex_lock(&u->iolock);
|
||||
unix_state_lock(sk);
|
||||
spin_lock(&sk->sk_receive_queue.lock);
|
||||
|
||||
if (sock_flag(sk, SOCK_URGINLINE) || !u->oob_skb) {
|
||||
spin_unlock(&sk->sk_receive_queue.lock);
|
||||
unix_state_unlock(sk);
|
||||
mutex_unlock(&u->iolock);
|
||||
return -EINVAL;
|
||||
|
|
@ -2580,6 +2584,8 @@ static int unix_stream_recv_urg(struct unix_stream_read_state *state)
|
|||
WRITE_ONCE(u->oob_skb, NULL);
|
||||
else
|
||||
skb_get(oob_skb);
|
||||
|
||||
spin_unlock(&sk->sk_receive_queue.lock);
|
||||
unix_state_unlock(sk);
|
||||
|
||||
chunk = state->recv_actor(oob_skb, 0, chunk, state);
|
||||
|
|
@ -2608,6 +2614,10 @@ static struct sk_buff *manage_oob(struct sk_buff *skb, struct sock *sk,
|
|||
consume_skb(skb);
|
||||
skb = NULL;
|
||||
} else {
|
||||
struct sk_buff *unlinked_skb = NULL;
|
||||
|
||||
spin_lock(&sk->sk_receive_queue.lock);
|
||||
|
||||
if (skb == u->oob_skb) {
|
||||
if (copied) {
|
||||
skb = NULL;
|
||||
|
|
@ -2619,13 +2629,19 @@ static struct sk_buff *manage_oob(struct sk_buff *skb, struct sock *sk,
|
|||
} else if (flags & MSG_PEEK) {
|
||||
skb = NULL;
|
||||
} else {
|
||||
skb_unlink(skb, &sk->sk_receive_queue);
|
||||
__skb_unlink(skb, &sk->sk_receive_queue);
|
||||
WRITE_ONCE(u->oob_skb, NULL);
|
||||
if (!WARN_ON_ONCE(skb_unref(skb)))
|
||||
kfree_skb(skb);
|
||||
unlinked_skb = skb;
|
||||
skb = skb_peek(&sk->sk_receive_queue);
|
||||
}
|
||||
}
|
||||
|
||||
spin_unlock(&sk->sk_receive_queue.lock);
|
||||
|
||||
if (unlinked_skb) {
|
||||
WARN_ON_ONCE(skb_unref(unlinked_skb));
|
||||
kfree_skb(unlinked_skb);
|
||||
}
|
||||
}
|
||||
return skb;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -342,6 +342,18 @@ enum unix_recv_queue_lock_class {
|
|||
U_RECVQ_LOCK_EMBRYO,
|
||||
};
|
||||
|
||||
static void unix_collect_queue(struct unix_sock *u, struct sk_buff_head *hitlist)
|
||||
{
|
||||
skb_queue_splice_init(&u->sk.sk_receive_queue, hitlist);
|
||||
|
||||
#if IS_ENABLED(CONFIG_AF_UNIX_OOB)
|
||||
if (u->oob_skb) {
|
||||
WARN_ON_ONCE(skb_unref(u->oob_skb));
|
||||
u->oob_skb = NULL;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
static void unix_collect_skb(struct list_head *scc, struct sk_buff_head *hitlist)
|
||||
{
|
||||
struct unix_vertex *vertex;
|
||||
|
|
@ -365,18 +377,11 @@ static void unix_collect_skb(struct list_head *scc, struct sk_buff_head *hitlist
|
|||
|
||||
/* listener -> embryo order, the inversion never happens. */
|
||||
spin_lock_nested(&embryo_queue->lock, U_RECVQ_LOCK_EMBRYO);
|
||||
skb_queue_splice_init(embryo_queue, hitlist);
|
||||
unix_collect_queue(unix_sk(skb->sk), hitlist);
|
||||
spin_unlock(&embryo_queue->lock);
|
||||
}
|
||||
} else {
|
||||
skb_queue_splice_init(queue, hitlist);
|
||||
|
||||
#if IS_ENABLED(CONFIG_AF_UNIX_OOB)
|
||||
if (u->oob_skb) {
|
||||
kfree_skb(u->oob_skb);
|
||||
u->oob_skb = NULL;
|
||||
}
|
||||
#endif
|
||||
unix_collect_queue(u, hitlist);
|
||||
}
|
||||
|
||||
spin_unlock(&queue->lock);
|
||||
|
|
|
|||
|
|
@ -69,7 +69,7 @@ def pkt_byte_sum(cfg) -> None:
|
|||
return 0
|
||||
|
||||
for _ in range(10):
|
||||
rtstat = rtnl.getlink({"ifi-index": cfg.ifindex})['stats']
|
||||
rtstat = rtnl.getlink({"ifi-index": cfg.ifindex})['stats64']
|
||||
if stat_cmp(rtstat, qstat) < 0:
|
||||
raise Exception("RTNL stats are lower, fetched later")
|
||||
qstat = get_qstat(cfg)
|
||||
|
|
|
|||
|
|
@ -197,8 +197,8 @@ void __send_fd(struct __test_metadata *_metadata,
|
|||
const FIXTURE_VARIANT(scm_rights) *variant,
|
||||
int inflight, int receiver)
|
||||
{
|
||||
#define MSG "nop"
|
||||
#define MSGLEN 3
|
||||
#define MSG "x"
|
||||
#define MSGLEN 1
|
||||
struct {
|
||||
struct cmsghdr cmsghdr;
|
||||
int fd[2];
|
||||
|
|
|
|||
|
|
@ -77,6 +77,7 @@ readonly LISTENER=$(mktemp -u listener-XXXXXXXX)
|
|||
readonly GATEWAY=$(mktemp -u gateway-XXXXXXXX)
|
||||
readonly RELAY=$(mktemp -u relay-XXXXXXXX)
|
||||
readonly SOURCE=$(mktemp -u source-XXXXXXXX)
|
||||
readonly SMCROUTEDIR="$(mktemp -d)"
|
||||
ERR=4
|
||||
err=0
|
||||
|
||||
|
|
@ -85,6 +86,11 @@ exit_cleanup()
|
|||
for ns in "$@"; do
|
||||
ip netns delete "${ns}" 2>/dev/null || true
|
||||
done
|
||||
if [ -f "$SMCROUTEDIR/amt.pid" ]; then
|
||||
smcpid=$(< $SMCROUTEDIR/amt.pid)
|
||||
kill $smcpid
|
||||
fi
|
||||
rm -rf $SMCROUTEDIR
|
||||
|
||||
exit $ERR
|
||||
}
|
||||
|
|
@ -167,7 +173,7 @@ setup_iptables()
|
|||
|
||||
setup_mcast_routing()
|
||||
{
|
||||
ip netns exec "${RELAY}" smcrouted
|
||||
ip netns exec "${RELAY}" smcrouted -P $SMCROUTEDIR/amt.pid
|
||||
ip netns exec "${RELAY}" smcroutectl a relay_src \
|
||||
172.17.0.2 239.0.0.1 amtr
|
||||
ip netns exec "${RELAY}" smcroutectl a relay_src \
|
||||
|
|
|
|||
|
|
@ -73,25 +73,19 @@ setup_v6() {
|
|||
# namespaces. veth0 is veth-router, veth1 is veth-host.
|
||||
# first, set up the inteface's link to the namespace
|
||||
# then, set the interface "up"
|
||||
ip -6 -netns ${ROUTER_NS_V6} link add name ${ROUTER_INTF} \
|
||||
type veth peer name ${HOST_INTF}
|
||||
ip -n ${ROUTER_NS_V6} link add name ${ROUTER_INTF} \
|
||||
type veth peer name ${HOST_INTF} netns ${HOST_NS_V6}
|
||||
|
||||
ip -6 -netns ${ROUTER_NS_V6} link set dev ${ROUTER_INTF} up
|
||||
ip -6 -netns ${ROUTER_NS_V6} link set dev ${HOST_INTF} netns \
|
||||
${HOST_NS_V6}
|
||||
|
||||
ip -6 -netns ${HOST_NS_V6} link set dev ${HOST_INTF} up
|
||||
ip -6 -netns ${ROUTER_NS_V6} addr add \
|
||||
${ROUTER_ADDR_V6}/${PREFIX_WIDTH_V6} dev ${ROUTER_INTF} nodad
|
||||
# Add tc rule to filter out host na message
|
||||
tc -n ${ROUTER_NS_V6} qdisc add dev ${ROUTER_INTF} clsact
|
||||
tc -n ${ROUTER_NS_V6} filter add dev ${ROUTER_INTF} \
|
||||
ingress protocol ipv6 pref 1 handle 101 \
|
||||
flower src_ip ${HOST_ADDR_V6} ip_proto icmpv6 type 136 skip_hw action pass
|
||||
|
||||
HOST_CONF=net.ipv6.conf.${HOST_INTF}
|
||||
ip netns exec ${HOST_NS_V6} sysctl -qw ${HOST_CONF}.ndisc_notify=1
|
||||
ip netns exec ${HOST_NS_V6} sysctl -qw ${HOST_CONF}.disable_ipv6=0
|
||||
ip -6 -netns ${HOST_NS_V6} addr add ${HOST_ADDR_V6}/${PREFIX_WIDTH_V6} \
|
||||
dev ${HOST_INTF}
|
||||
|
||||
ROUTER_CONF=net.ipv6.conf.${ROUTER_INTF}
|
||||
|
||||
ip netns exec ${ROUTER_NS_V6} sysctl -w \
|
||||
${ROUTER_CONF}.forwarding=1 >/dev/null 2>&1
|
||||
ip netns exec ${ROUTER_NS_V6} sysctl -w \
|
||||
|
|
@ -99,6 +93,13 @@ setup_v6() {
|
|||
ip netns exec ${ROUTER_NS_V6} sysctl -w \
|
||||
${ROUTER_CONF}.accept_untracked_na=${accept_untracked_na} \
|
||||
>/dev/null 2>&1
|
||||
|
||||
ip -n ${ROUTER_NS_V6} link set dev ${ROUTER_INTF} up
|
||||
ip -n ${HOST_NS_V6} link set dev ${HOST_INTF} up
|
||||
ip -n ${ROUTER_NS_V6} addr add ${ROUTER_ADDR_V6}/${PREFIX_WIDTH_V6} \
|
||||
dev ${ROUTER_INTF} nodad
|
||||
ip -n ${HOST_NS_V6} addr add ${HOST_ADDR_V6}/${PREFIX_WIDTH_V6} \
|
||||
dev ${HOST_INTF}
|
||||
set +e
|
||||
}
|
||||
|
||||
|
|
@ -162,26 +163,6 @@ arp_test_gratuitous_combinations() {
|
|||
arp_test_gratuitous 2 1
|
||||
}
|
||||
|
||||
cleanup_tcpdump() {
|
||||
set -e
|
||||
[[ ! -z ${tcpdump_stdout} ]] && rm -f ${tcpdump_stdout}
|
||||
[[ ! -z ${tcpdump_stderr} ]] && rm -f ${tcpdump_stderr}
|
||||
tcpdump_stdout=
|
||||
tcpdump_stderr=
|
||||
set +e
|
||||
}
|
||||
|
||||
start_tcpdump() {
|
||||
set -e
|
||||
tcpdump_stdout=`mktemp`
|
||||
tcpdump_stderr=`mktemp`
|
||||
ip netns exec ${ROUTER_NS_V6} timeout 15s \
|
||||
tcpdump --immediate-mode -tpni ${ROUTER_INTF} -c 1 \
|
||||
"icmp6 && icmp6[0] == 136 && src ${HOST_ADDR_V6}" \
|
||||
> ${tcpdump_stdout} 2> /dev/null
|
||||
set +e
|
||||
}
|
||||
|
||||
verify_ndisc() {
|
||||
local accept_untracked_na=$1
|
||||
local same_subnet=$2
|
||||
|
|
@ -222,8 +203,9 @@ ndisc_test_untracked_advertisements() {
|
|||
HOST_ADDR_V6=2001:db8:abcd:0012::3
|
||||
fi
|
||||
fi
|
||||
setup_v6 $1 $2
|
||||
start_tcpdump
|
||||
setup_v6 $1
|
||||
slowwait_for_counter 15 1 \
|
||||
tc_rule_handle_stats_get "dev ${ROUTER_INTF} ingress" 101 ".packets" "-n ${ROUTER_NS_V6}"
|
||||
|
||||
if verify_ndisc $1 $2; then
|
||||
printf " TEST: %-60s [ OK ]\n" "${test_msg[*]}"
|
||||
|
|
@ -231,7 +213,6 @@ ndisc_test_untracked_advertisements() {
|
|||
printf " TEST: %-60s [FAIL]\n" "${test_msg[*]}"
|
||||
fi
|
||||
|
||||
cleanup_tcpdump
|
||||
cleanup_v6
|
||||
set +e
|
||||
}
|
||||
|
|
|
|||
|
|
@ -129,14 +129,6 @@ fi
|
|||
|
||||
source "$net_forwarding_dir/../lib.sh"
|
||||
|
||||
# timeout in seconds
|
||||
slowwait()
|
||||
{
|
||||
local timeout_sec=$1; shift
|
||||
|
||||
loopy_wait "sleep 0.1" "$((timeout_sec * 1000))" "$@"
|
||||
}
|
||||
|
||||
##############################################################################
|
||||
# Sanity checks
|
||||
|
||||
|
|
@ -678,33 +670,6 @@ wait_for_trap()
|
|||
"$@" | grep -q trap
|
||||
}
|
||||
|
||||
until_counter_is()
|
||||
{
|
||||
local expr=$1; shift
|
||||
local current=$("$@")
|
||||
|
||||
echo $((current))
|
||||
((current $expr))
|
||||
}
|
||||
|
||||
busywait_for_counter()
|
||||
{
|
||||
local timeout=$1; shift
|
||||
local delta=$1; shift
|
||||
|
||||
local base=$("$@")
|
||||
busywait "$timeout" until_counter_is ">= $((base + delta))" "$@"
|
||||
}
|
||||
|
||||
slowwait_for_counter()
|
||||
{
|
||||
local timeout=$1; shift
|
||||
local delta=$1; shift
|
||||
|
||||
local base=$("$@")
|
||||
slowwait "$timeout" until_counter_is ">= $((base + delta))" "$@"
|
||||
}
|
||||
|
||||
setup_wait_dev()
|
||||
{
|
||||
local dev=$1; shift
|
||||
|
|
@ -1023,29 +988,6 @@ link_stats_rx_errors_get()
|
|||
link_stats_get $1 rx errors
|
||||
}
|
||||
|
||||
tc_rule_stats_get()
|
||||
{
|
||||
local dev=$1; shift
|
||||
local pref=$1; shift
|
||||
local dir=$1; shift
|
||||
local selector=${1:-.packets}; shift
|
||||
|
||||
tc -j -s filter show dev $dev ${dir:-ingress} pref $pref \
|
||||
| jq ".[1].options.actions[].stats$selector"
|
||||
}
|
||||
|
||||
tc_rule_handle_stats_get()
|
||||
{
|
||||
local id=$1; shift
|
||||
local handle=$1; shift
|
||||
local selector=${1:-.packets}; shift
|
||||
local netns=${1:-""}; shift
|
||||
|
||||
tc $netns -j -s filter show $id \
|
||||
| jq ".[] | select(.options.handle == $handle) | \
|
||||
.options.actions[0].stats$selector"
|
||||
}
|
||||
|
||||
ethtool_stats_get()
|
||||
{
|
||||
local dev=$1; shift
|
||||
|
|
|
|||
|
|
@ -91,6 +91,41 @@ busywait()
|
|||
loopy_wait : "$timeout_ms" "$@"
|
||||
}
|
||||
|
||||
# timeout in seconds
|
||||
slowwait()
|
||||
{
|
||||
local timeout_sec=$1; shift
|
||||
|
||||
loopy_wait "sleep 0.1" "$((timeout_sec * 1000))" "$@"
|
||||
}
|
||||
|
||||
until_counter_is()
|
||||
{
|
||||
local expr=$1; shift
|
||||
local current=$("$@")
|
||||
|
||||
echo $((current))
|
||||
((current $expr))
|
||||
}
|
||||
|
||||
busywait_for_counter()
|
||||
{
|
||||
local timeout=$1; shift
|
||||
local delta=$1; shift
|
||||
|
||||
local base=$("$@")
|
||||
busywait "$timeout" until_counter_is ">= $((base + delta))" "$@"
|
||||
}
|
||||
|
||||
slowwait_for_counter()
|
||||
{
|
||||
local timeout=$1; shift
|
||||
local delta=$1; shift
|
||||
|
||||
local base=$("$@")
|
||||
slowwait "$timeout" until_counter_is ">= $((base + delta))" "$@"
|
||||
}
|
||||
|
||||
cleanup_ns()
|
||||
{
|
||||
local ns=""
|
||||
|
|
@ -150,3 +185,26 @@ setup_ns()
|
|||
done
|
||||
NS_LIST="$NS_LIST $ns_list"
|
||||
}
|
||||
|
||||
tc_rule_stats_get()
|
||||
{
|
||||
local dev=$1; shift
|
||||
local pref=$1; shift
|
||||
local dir=$1; shift
|
||||
local selector=${1:-.packets}; shift
|
||||
|
||||
tc -j -s filter show dev $dev ${dir:-ingress} pref $pref \
|
||||
| jq ".[1].options.actions[].stats$selector"
|
||||
}
|
||||
|
||||
tc_rule_handle_stats_get()
|
||||
{
|
||||
local id=$1; shift
|
||||
local handle=$1; shift
|
||||
local selector=${1:-.packets}; shift
|
||||
local netns=${1:-""}; shift
|
||||
|
||||
tc $netns -j -s filter show $id \
|
||||
| jq ".[] | select(.options.handle == $handle) | \
|
||||
.options.actions[0].stats$selector"
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue