* [PATCH 0/3] net:bonding:Add support for IPV6 RLB to balance-alb mode
@ 2022-03-11 2:49 Sun Shouxin
2022-03-11 2:49 ` [PATCH 1/3] net:ipv6:Add ndisc_bond_send_na to support sending na by slave directly Sun Shouxin
` (2 more replies)
0 siblings, 3 replies; 9+ messages in thread
From: Sun Shouxin @ 2022-03-11 2:49 UTC (permalink / raw)
To: j.vosburgh, vfalico, andy, davem, kuba, yoshfuji, dsahern
Cc: netdev, linux-kernel, huyd12, sunshouxin
This patchset is implementing IPV6 RLB for balance-alb mode.
Sun Shouxin (3):
net:ipv6:Add ndisc_bond_send_na to support sending na by slave
directly
net:ipv6:Export inet6_ifa_finish_destroy and ipv6_get_ifaddr
net:bonding:Add support for IPV6 RLB to balance-alb mode
drivers/net/bonding/bond_3ad.c | 2 +-
drivers/net/bonding/bond_alb.c | 588 ++++++++++++++++++++++++++++-
drivers/net/bonding/bond_debugfs.c | 14 +
drivers/net/bonding/bond_main.c | 6 +-
include/net/bond_3ad.h | 2 +-
include/net/bond_alb.h | 7 +
include/net/bonding.h | 6 +-
include/net/ndisc.h | 6 +
net/ipv6/addrconf.c | 2 +
net/ipv6/ndisc.c | 61 +++
10 files changed, 680 insertions(+), 14 deletions(-)
base-commit: 2a9eef868a997ec575c2e6ae885e91313f635d59
--
2.27.0
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH 1/3] net:ipv6:Add ndisc_bond_send_na to support sending na by slave directly
2022-03-11 2:49 [PATCH 0/3] net:bonding:Add support for IPV6 RLB to balance-alb mode Sun Shouxin
@ 2022-03-11 2:49 ` Sun Shouxin
2022-03-11 14:44 ` kernel test robot
2022-03-11 16:58 ` David Ahern
2022-03-11 2:49 ` [PATCH 2/3] net:ipv6:Export inet6_ifa_finish_destroy and ipv6_get_ifaddr Sun Shouxin
2022-03-11 2:49 ` [PATCH 3/3] net:bonding:Add support for IPV6 RLB to balance-alb mode Sun Shouxin
2 siblings, 2 replies; 9+ messages in thread
From: Sun Shouxin @ 2022-03-11 2:49 UTC (permalink / raw)
To: j.vosburgh, vfalico, andy, davem, kuba, yoshfuji, dsahern
Cc: netdev, linux-kernel, huyd12, sunshouxin
Add ndisc_bond_send_na to support sending na by slave directly and
export it for bonding usage.
Suggested-by: Hu Yadi <huyd12@chinatelecom.cn>
Signed-off-by: Sun Shouxin <sunshouxin@chinatelecom.cn>
---
include/net/ndisc.h | 6 +++++
net/ipv6/ndisc.c | 61 +++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 67 insertions(+)
diff --git a/include/net/ndisc.h b/include/net/ndisc.h
index da7eec8669ec..317bcb29c795 100644
--- a/include/net/ndisc.h
+++ b/include/net/ndisc.h
@@ -471,6 +471,12 @@ void ndisc_update(const struct net_device *dev, struct neighbour *neigh,
const u8 *lladdr, u8 new, u32 flags, u8 icmp6_type,
struct ndisc_options *ndopts);
+void ndisc_bond_send_na(struct net_device *dev, const struct in6_addr *daddr,
+ const struct in6_addr *solicited_addr, bool router,
+ bool solicited, bool override, bool inc_opt,
+ unsigned short vlan_id, const void *mac_dst,
+ const void *mac_src);
+
/*
* IGMP
*/
diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c
index fcb288b0ae13..c59a110e9b10 100644
--- a/net/ipv6/ndisc.c
+++ b/net/ipv6/ndisc.c
@@ -572,6 +572,67 @@ void ndisc_send_na(struct net_device *dev, const struct in6_addr *daddr,
ndisc_send_skb(skb, daddr, src_addr);
}
+void ndisc_bond_send_na(struct net_device *dev, const struct in6_addr *daddr,
+ const struct in6_addr *solicited_addr,
+ bool router, bool solicited, bool override,
+ bool inc_opt, unsigned short vlan_id,
+ const void *mac_dst, const void *mac_src)
+{
+ struct sk_buff *skb;
+ const struct in6_addr *src_addr;
+ struct nd_msg *msg;
+ struct net *net = dev_net(dev);
+ struct sock *sk = net->ipv6.ndisc_sk;
+ int optlen = 0;
+ int ret;
+
+ src_addr = solicited_addr;
+ if (!dev->addr_len)
+ inc_opt = false;
+ if (inc_opt)
+ optlen += ndisc_opt_addr_space(dev,
+ NDISC_NEIGHBOUR_ADVERTISEMENT);
+
+ skb = ndisc_alloc_skb(dev, sizeof(*msg) + optlen);
+ if (!skb)
+ return;
+
+ msg = skb_put(skb, sizeof(*msg));
+ *msg = (struct nd_msg) {
+ .icmph = {
+ .icmp6_type = NDISC_NEIGHBOUR_ADVERTISEMENT,
+ .icmp6_router = router,
+ .icmp6_solicited = solicited,
+ .icmp6_override = override,
+ },
+ .target = *solicited_addr,
+ };
+
+ if (inc_opt)
+ ndisc_fill_addr_option(skb, ND_OPT_TARGET_LL_ADDR,
+ dev->dev_addr,
+ NDISC_NEIGHBOUR_ADVERTISEMENT);
+
+ if (vlan_id)
+ __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q),
+ vlan_id);
+
+ msg->icmph.icmp6_cksum = csum_ipv6_magic(src_addr, daddr, skb->len,
+ IPPROTO_ICMPV6,
+ csum_partial(&msg->icmph,
+ skb->len, 0));
+
+ ip6_nd_hdr(skb, src_addr, daddr, inet6_sk(sk)->hop_limit, skb->len);
+
+ skb->protocol = htons(ETH_P_IPV6);
+ skb->dev = dev;
+ if (dev_hard_header(skb, dev, ETH_P_IPV6, mac_dst, mac_src, skb->len) < 0)
+ return;
+
+ ret = dev_queue_xmit(skb);
+}
+EXPORT_SYMBOL(ndisc_bond_send_na);
+
static void ndisc_send_unsol_na(struct net_device *dev)
{
struct inet6_dev *idev;
--
2.27.0
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 2/3] net:ipv6:Export inet6_ifa_finish_destroy and ipv6_get_ifaddr
2022-03-11 2:49 [PATCH 0/3] net:bonding:Add support for IPV6 RLB to balance-alb mode Sun Shouxin
2022-03-11 2:49 ` [PATCH 1/3] net:ipv6:Add ndisc_bond_send_na to support sending na by slave directly Sun Shouxin
@ 2022-03-11 2:49 ` Sun Shouxin
2022-03-11 2:49 ` [PATCH 3/3] net:bonding:Add support for IPV6 RLB to balance-alb mode Sun Shouxin
2 siblings, 0 replies; 9+ messages in thread
From: Sun Shouxin @ 2022-03-11 2:49 UTC (permalink / raw)
To: j.vosburgh, vfalico, andy, davem, kuba, yoshfuji, dsahern
Cc: netdev, linux-kernel, huyd12, sunshouxin
Export inet6_ifa_finish_destroy and ipv6_get_ifaddr for bonding usage.
Signed-off-by: Sun Shouxin <sunshouxin@chinatelecom.cn>
---
net/ipv6/addrconf.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
index b22504176588..12004b8a46b5 100644
--- a/net/ipv6/addrconf.c
+++ b/net/ipv6/addrconf.c
@@ -975,6 +975,7 @@ void inet6_ifa_finish_destroy(struct inet6_ifaddr *ifp)
kfree_rcu(ifp, rcu);
}
+EXPORT_SYMBOL(inet6_ifa_finish_destroy);
static void
ipv6_link_dev_addr(struct inet6_dev *idev, struct inet6_ifaddr *ifp)
@@ -2037,6 +2038,7 @@ struct inet6_ifaddr *ipv6_get_ifaddr(struct net *net, const struct in6_addr *add
return result;
}
+EXPORT_SYMBOL(ipv6_get_ifaddr);
/* Gets referenced address, destroys ifaddr */
--
2.27.0
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 3/3] net:bonding:Add support for IPV6 RLB to balance-alb mode
2022-03-11 2:49 [PATCH 0/3] net:bonding:Add support for IPV6 RLB to balance-alb mode Sun Shouxin
2022-03-11 2:49 ` [PATCH 1/3] net:ipv6:Add ndisc_bond_send_na to support sending na by slave directly Sun Shouxin
2022-03-11 2:49 ` [PATCH 2/3] net:ipv6:Export inet6_ifa_finish_destroy and ipv6_get_ifaddr Sun Shouxin
@ 2022-03-11 2:49 ` Sun Shouxin
2022-03-11 16:47 ` kernel test robot
2022-03-11 16:58 ` kernel test robot
2 siblings, 2 replies; 9+ messages in thread
From: Sun Shouxin @ 2022-03-11 2:49 UTC (permalink / raw)
To: j.vosburgh, vfalico, andy, davem, kuba, yoshfuji, dsahern
Cc: netdev, linux-kernel, huyd12, sunshouxin
This patch is implementing IPV6 RLB for balance-alb mode.
Suggested-by: Hu Yadi <huyd12@chinatelecom.cn>
Signed-off-by: Sun Shouxin <sunshouxin@chinatelecom.cn>
---
drivers/net/bonding/bond_3ad.c | 2 +-
drivers/net/bonding/bond_alb.c | 588 ++++++++++++++++++++++++++++-
drivers/net/bonding/bond_debugfs.c | 14 +
drivers/net/bonding/bond_main.c | 6 +-
include/net/bond_3ad.h | 2 +-
include/net/bond_alb.h | 7 +
include/net/bonding.h | 6 +-
7 files changed, 611 insertions(+), 14 deletions(-)
diff --git a/drivers/net/bonding/bond_3ad.c b/drivers/net/bonding/bond_3ad.c
index a86b1f71762e..3cba269f12e2 100644
--- a/drivers/net/bonding/bond_3ad.c
+++ b/drivers/net/bonding/bond_3ad.c
@@ -2682,7 +2682,7 @@ int bond_3ad_get_active_agg_info(struct bonding *bond, struct ad_info *ad_info)
return ret;
}
-int bond_3ad_lacpdu_recv(const struct sk_buff *skb, struct bonding *bond,
+int bond_3ad_lacpdu_recv(struct sk_buff *skb, struct bonding *bond,
struct slave *slave)
{
struct lacpdu *lacpdu, _lacpdu;
diff --git a/drivers/net/bonding/bond_alb.c b/drivers/net/bonding/bond_alb.c
index 303c8d32d451..b17e2c091ea6 100644
--- a/drivers/net/bonding/bond_alb.c
+++ b/drivers/net/bonding/bond_alb.c
@@ -23,6 +23,8 @@
#include <asm/byteorder.h>
#include <net/bonding.h>
#include <net/bond_alb.h>
+#include <net/addrconf.h>
+#include <net/ip6_checksum.h>
static const u8 mac_v6_allmcast[ETH_ALEN + 2] __long_aligned = {
0x33, 0x33, 0x00, 0x00, 0x00, 0x01
@@ -57,6 +59,13 @@ static void rlb_purge_src_ip(struct bonding *bond, struct arp_pkt *arp);
static void rlb_src_unlink(struct bonding *bond, u32 index);
static void rlb_src_link(struct bonding *bond, u32 ip_src_hash,
u32 ip_dst_hash);
+static void rlb6_delete_table_entry(struct bonding *bond, u32 index);
+static u8 *alb_get_lladdr(struct sk_buff *skb);
+static void alb_set_nd_option(struct sk_buff *skb, struct bonding *bond,
+ struct slave *tx_slave);
+static bool alb_determine_ipv6_nd(struct sk_buff *skb, struct bonding *bond);
+static int rlb_recv(struct sk_buff *skb, struct bonding *bond,
+ struct slave *slave);
static inline u8 _simple_hash(const u8 *hash_start, int hash_size)
{
@@ -269,7 +278,7 @@ static void rlb_update_entry_from_arp(struct bonding *bond, struct arp_pkt *arp)
spin_unlock_bh(&bond->mode_lock);
}
-static int rlb_arp_recv(const struct sk_buff *skb, struct bonding *bond,
+static int rlb_arp_recv(struct sk_buff *skb, struct bonding *bond,
struct slave *slave)
{
struct arp_pkt *arp, _arp;
@@ -415,6 +424,31 @@ static void rlb_clear_slave(struct bonding *bond, struct slave *slave)
}
}
+ rx_hash_table = bond_info->rx6_hashtbl;
+ index = bond_info->rx6_hashtbl_used_head;
+ for (; index != RLB_NULL_INDEX; index = next_index) {
+ next_index = rx_hash_table[index].used_next;
+ if (rx_hash_table[index].slave == slave) {
+ struct slave *assigned_slave = rlb_next_rx_slave(bond);
+
+ if (assigned_slave) {
+ u8 mac_dst[ETH_ALEN];
+
+ rx_hash_table[index].slave = assigned_slave;
+ memcpy(mac_dst, rx_hash_table[index].mac_dst,
+ sizeof(mac_dst));
+ if (is_valid_ether_addr(mac_dst)) {
+ bond_info->rx6_hashtbl[index].ntt = 1;
+ bond_info->rx6_ntt = 1;
+ bond_info->rlb6_update_retry_counter =
+ RLB_UPDATE_RETRY;
+ }
+ } else { /* there is no active slave */
+ rx_hash_table[index].slave = NULL;
+ }
+ }
+ }
+
spin_unlock_bh(&bond->mode_lock);
if (slave != rtnl_dereference(bond->curr_active_slave))
@@ -704,7 +738,7 @@ static void rlb_rebalance(struct bonding *bond)
struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond));
struct slave *assigned_slave;
struct rlb_client_info *client_info;
- int ntt;
+ int ntt, ntt_ip6;
u32 hash_index;
spin_lock_bh(&bond->mode_lock);
@@ -724,9 +758,27 @@ static void rlb_rebalance(struct bonding *bond)
}
}
+ ntt_ip6 = 0;
+ hash_index = bond_info->rx6_hashtbl_used_head;
+ for (; hash_index != RLB_NULL_INDEX;
+ hash_index = client_info->used_next) {
+ client_info = &bond_info->rx6_hashtbl[hash_index];
+ assigned_slave = __rlb_next_rx_slave(bond);
+ if (assigned_slave && client_info->slave != assigned_slave) {
+ client_info->slave = assigned_slave;
+ if (!is_zero_ether_addr(client_info->mac_dst)) {
+ client_info->ntt = 1;
+ ntt_ip6 = 1;
+ }
+ }
+ }
+
/* update the team's flag only after the whole iteration */
if (ntt)
bond_info->rx_ntt = 1;
+
+ if (ntt_ip6)
+ bond_info->rx6_ntt = 1;
spin_unlock_bh(&bond->mode_lock);
}
@@ -846,6 +898,7 @@ static int rlb_initialize(struct bonding *bond)
{
struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond));
struct rlb_client_info *new_hashtbl;
+ struct rlb_client_info *new6_hashtbl;
int size = RLB_HASH_TABLE_SIZE * sizeof(struct rlb_client_info);
int i;
@@ -853,19 +906,29 @@ static int rlb_initialize(struct bonding *bond)
if (!new_hashtbl)
return -1;
+ new6_hashtbl = kmalloc(size, GFP_KERNEL);
+ if (!new6_hashtbl) {
+ kfree(new_hashtbl);
+ return -1;
+ }
+
spin_lock_bh(&bond->mode_lock);
bond_info->rx_hashtbl = new_hashtbl;
+ bond_info->rx6_hashtbl = new6_hashtbl;
bond_info->rx_hashtbl_used_head = RLB_NULL_INDEX;
+ bond_info->rx6_hashtbl_used_head = RLB_NULL_INDEX;
- for (i = 0; i < RLB_HASH_TABLE_SIZE; i++)
+ for (i = 0; i < RLB_HASH_TABLE_SIZE; i++) {
rlb_init_table_entry(bond_info->rx_hashtbl + i);
+ rlb_init_table_entry(bond_info->rx6_hashtbl + i);
+ }
spin_unlock_bh(&bond->mode_lock);
/* register to receive ARPs */
- bond->recv_probe = rlb_arp_recv;
+ bond->recv_probe = rlb_recv;
return 0;
}
@@ -880,6 +943,10 @@ static void rlb_deinitialize(struct bonding *bond)
bond_info->rx_hashtbl = NULL;
bond_info->rx_hashtbl_used_head = RLB_NULL_INDEX;
+ kfree(bond_info->rx6_hashtbl);
+ bond_info->rx6_hashtbl = NULL;
+ bond_info->rx6_hashtbl_used_head = RLB_NULL_INDEX;
+
spin_unlock_bh(&bond->mode_lock);
}
@@ -901,9 +968,394 @@ static void rlb_clear_vlan(struct bonding *bond, unsigned short vlan_id)
curr_index = next_index;
}
+ curr_index = bond_info->rx6_hashtbl_used_head;
+ while (curr_index != RLB_NULL_INDEX) {
+ struct rlb_client_info *curr = &bond_info->rx6_hashtbl[curr_index];
+ u32 next_index = bond_info->rx6_hashtbl[curr_index].used_next;
+
+ if (curr->vlan_id == vlan_id)
+ rlb6_delete_table_entry(bond, curr_index);
+
+ curr_index = next_index;
+ }
+
spin_unlock_bh(&bond->mode_lock);
}
+/*********************** ipv6 rlb specific functions ***************************/
+void rlb6_update_client(struct rlb_client_info *client_info)
+{
+ int i;
+
+ if (!client_info->slave || !is_valid_ether_addr(client_info->mac_dst))
+ return;
+
+ for (i = 0; i < RLB_ARP_BURST_SIZE; i++) {
+ ndisc_bond_send_na(client_info->slave->dev,
+ &client_info->ip6_dst,
+ &client_info->ip6_src,
+ false, false, true, true,
+ client_info->vlan_id,
+ client_info->mac_dst,
+ client_info->slave->dev->dev_addr);
+ }
+}
+
+static void rlb6_update_rx_clients(struct bonding *bond)
+{
+ struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond));
+ struct rlb_client_info *client_info;
+ u32 hash_index;
+
+ spin_lock_bh(&bond->mode_lock);
+
+ hash_index = bond_info->rx6_hashtbl_used_head;
+ for (; hash_index != RLB_NULL_INDEX;
+ hash_index = client_info->used_next) {
+ client_info = &bond_info->rx6_hashtbl[hash_index];
+ if (client_info->ntt) {
+ rlb6_update_client(client_info);
+ if (bond_info->rlb6_update_retry_counter == 0)
+ client_info->ntt = 0;
+ }
+ }
+
+ bond_info->rlb6_update_delay_counter = RLB_UPDATE_DELAY;
+
+ spin_unlock_bh(&bond->mode_lock);
+}
+
+static void rlb6_delete_table_entry_dst(struct bonding *bond, u32 index)
+{
+ struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond));
+ u32 next_index = bond_info->rx6_hashtbl[index].used_next;
+ u32 prev_index = bond_info->rx6_hashtbl[index].used_prev;
+
+ if (index == bond_info->rx6_hashtbl_used_head)
+ bond_info->rx6_hashtbl_used_head = next_index;
+
+ if (next_index != RLB_NULL_INDEX)
+ bond_info->rx6_hashtbl[next_index].used_prev = prev_index;
+
+ if (prev_index != RLB_NULL_INDEX)
+ bond_info->rx6_hashtbl[prev_index].used_next = next_index;
+}
+
+static void rlb6_src_link(struct bonding *bond, u32 ip_src_hash,
+ u32 ip_dst_hash)
+{
+ struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond));
+ u32 next;
+
+ bond_info->rx6_hashtbl[ip_dst_hash].src_prev = ip_src_hash;
+ next = bond_info->rx6_hashtbl[ip_src_hash].src_first;
+ bond_info->rx6_hashtbl[ip_dst_hash].src_next = next;
+ if (next != RLB_NULL_INDEX)
+ bond_info->rx6_hashtbl[next].src_prev = ip_dst_hash;
+ bond_info->rx6_hashtbl[ip_src_hash].src_first = ip_dst_hash;
+}
+
+static void rlb6_src_unlink(struct bonding *bond, u32 index)
+{
+ struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond));
+ u32 next_index = bond_info->rx6_hashtbl[index].src_next;
+ u32 prev_index = bond_info->rx6_hashtbl[index].src_prev;
+
+ bond_info->rx6_hashtbl[index].src_next = RLB_NULL_INDEX;
+ bond_info->rx6_hashtbl[index].src_prev = RLB_NULL_INDEX;
+
+ if (next_index != RLB_NULL_INDEX)
+ bond_info->rx6_hashtbl[next_index].src_prev = prev_index;
+
+ if (prev_index == RLB_NULL_INDEX)
+ return;
+
+ if (bond_info->rx6_hashtbl[prev_index].src_first == index)
+ bond_info->rx6_hashtbl[prev_index].src_first = next_index;
+ else
+ bond_info->rx6_hashtbl[prev_index].src_next = next_index;
+}
+
+static void rlb6_req_update_slave_clients(struct bonding *bond,
+ struct slave *slave)
+{
+ struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond));
+ struct rlb_client_info *client_info;
+ u32 hash_index;
+ int ntt = 0;
+
+ spin_lock_bh(&bond->mode_lock);
+
+ hash_index = bond_info->rx6_hashtbl_used_head;
+ for (; hash_index != RLB_NULL_INDEX;
+ hash_index = client_info->used_next) {
+ client_info = &bond_info->rx6_hashtbl[hash_index];
+ if (client_info->slave == slave &&
+ is_valid_ether_addr(client_info->mac_dst)) {
+ client_info->ntt = 1;
+ ntt = 1;
+ }
+ }
+
+ if (ntt) {
+ bond_info->rx6_ntt = 1;
+ bond_info->rlb6_update_retry_counter =
+ RLB_UPDATE_RETRY;
+ }
+ spin_unlock_bh(&bond->mode_lock);
+}
+
+static struct slave *rlb6_nd_choose_channel(struct sk_buff *skb,
+ struct bonding *bond,
+ struct ipv6hdr *ip6hdr,
+ u8 type)
+{
+ struct nd_msg *msg;
+ struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond));
+ struct slave *assigned_slave, *curr_active_slave;
+ struct rlb_client_info *client_info;
+ struct ethhdr *eth_data;
+ u8 *dst_ip;
+ u32 hash_index = 0;
+
+ spin_lock(&bond->mode_lock);
+
+ msg = (struct nd_msg *)skb_transport_header(skb);
+ eth_data = eth_hdr(skb);
+ curr_active_slave = rcu_dereference(bond->curr_active_slave);
+
+ if (type == NDISC_NEIGHBOUR_SOLICITATION)
+ dst_ip = (u8 *)msg->target.s6_addr;
+ else
+ dst_ip = (u8 *)ip6hdr->daddr.s6_addr;
+
+ hash_index = _simple_hash(dst_ip,
+ sizeof(struct in6_addr));
+ client_info = &bond_info->rx6_hashtbl[hash_index];
+
+ if (client_info->assigned) {
+ if (!memcmp(client_info->ip6_dst.s6_addr, dst_ip,
+ sizeof(struct in6_addr)) &&
+ !memcmp(client_info->ip6_src.s6_addr,
+ ip6hdr->saddr.s6_addr,
+ sizeof(ip6hdr->saddr.s6_addr))) {
+ ether_addr_copy(client_info->mac_src,
+ eth_data->h_source);
+
+ assigned_slave = client_info->slave;
+ if (assigned_slave) {
+ spin_unlock(&bond->mode_lock);
+ return assigned_slave;
+ }
+ } else {
+ if (curr_active_slave &&
+ curr_active_slave != client_info->slave) {
+ client_info->slave = curr_active_slave;
+ rlb6_update_client(client_info);
+ }
+ }
+ }
+
+ /* assign a new slave */
+ assigned_slave = __rlb_next_rx_slave(bond);
+
+ if (assigned_slave) {
+ if (!(client_info->assigned &&
+ !memcmp(client_info->ip6_src.s6_addr,
+ ip6hdr->saddr.s6_addr, sizeof(ip6hdr->saddr.s6_addr)))) {
+ u32 hash_src = _simple_hash((u8 *)ip6hdr->saddr.s6_addr,
+ sizeof(ip6hdr->saddr.s6_addr));
+
+ rlb6_src_unlink(bond, hash_index);
+ rlb6_src_link(bond, hash_src, hash_index);
+ }
+
+ memcpy(client_info->ip6_src.s6_addr, ip6hdr->saddr.s6_addr,
+ sizeof(ip6hdr->saddr.s6_addr));
+ memcpy(client_info->ip6_dst.s6_addr, dst_ip,
+ sizeof(struct in6_addr));
+
+ ether_addr_copy(client_info->mac_dst, eth_data->h_dest);
+ ether_addr_copy(client_info->mac_src, eth_data->h_source);
+
+ client_info->slave = assigned_slave;
+
+ if (is_valid_ether_addr(client_info->mac_dst)) {
+ client_info->ntt = 1;
+ bond->alb_info.rx6_ntt = 1;
+ } else {
+ client_info->ntt = 0;
+ }
+
+ if (vlan_get_tag(skb, &client_info->vlan_id))
+ client_info->vlan_id = 0;
+
+ if (!client_info->assigned) {
+ u32 prev_tbl_head = bond_info->rx6_hashtbl_used_head;
+
+ bond_info->rx6_hashtbl_used_head = hash_index;
+ client_info->used_next = prev_tbl_head;
+ if (prev_tbl_head != RLB_NULL_INDEX)
+ bond_info->rx6_hashtbl[prev_tbl_head].used_prev = hash_index;
+ client_info->assigned = 1;
+ }
+ }
+
+ spin_unlock(&bond->mode_lock);
+
+ return assigned_slave;
+}
+
+static struct slave *rlb_nd_xmit(struct sk_buff *skb, struct bonding *bond)
+{
+ struct slave *tx_slave = NULL;
+ struct ipv6hdr *ip6hdr;
+ struct icmp6hdr *hdr;
+ u8 *lladdr;
+
+ if (!pskb_network_may_pull(skb, sizeof(*ip6hdr)))
+ return NULL;
+
+ ip6hdr = ipv6_hdr(skb);
+ if (ip6hdr->nexthdr != IPPROTO_ICMPV6)
+ return NULL;
+
+ if (!pskb_network_may_pull(skb, sizeof(*ip6hdr) + sizeof(*hdr)))
+ return NULL;
+
+ hdr = icmp6_hdr(skb);
+
+ if (hdr->icmp6_type != NDISC_NEIGHBOUR_ADVERTISEMENT &&
+ hdr->icmp6_type != NDISC_NEIGHBOUR_SOLICITATION) {
+ return NULL;
+ }
+
+ lladdr = alb_get_lladdr(skb);
+ if (!lladdr)
+ return NULL;
+
+ if (!bond_slave_has_mac_rx(bond, lladdr))
+ return NULL;
+
+ tx_slave = rlb6_nd_choose_channel(skb, bond, ip6hdr, hdr->icmp6_type);
+ if (!tx_slave)
+ return NULL;
+
+ alb_set_nd_option(skb, bond, tx_slave);
+
+ return tx_slave;
+}
+
+static void rlb6_update_entry_from_na(struct bonding *bond,
+ struct ipv6hdr *ip6hdr, u8 *lladdr)
+{
+ struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond));
+ struct rlb_client_info *client_info;
+ u32 hash_index;
+
+ spin_lock_bh(&bond->mode_lock);
+
+ hash_index = _simple_hash(ip6hdr->saddr.s6_addr,
+ sizeof(ip6hdr->saddr.s6_addr));
+ client_info = &bond_info->rx6_hashtbl[hash_index];
+
+ if (client_info->assigned &&
+ !memcmp(ip6hdr->saddr.s6_addr, client_info->ip6_dst.s6_addr,
+ sizeof(ip6hdr->saddr.s6_addr)) && !memcmp(ip6hdr->daddr.s6_addr,
+ client_info->ip6_src.s6_addr, sizeof(ip6hdr->daddr.s6_addr)) &&
+ !ether_addr_equal_64bits(client_info->mac_dst, lladdr)) {
+ memcpy(client_info->mac_dst, lladdr,
+ sizeof(client_info->mac_dst));
+ client_info->ntt = 1;
+ bond_info->rx6_ntt = 1;
+ }
+ spin_unlock_bh(&bond->mode_lock);
+}
+
+static void rlb6_delete_table_entry(struct bonding *bond, u32 index)
+{
+ struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond));
+ struct rlb_client_info *entry = &bond_info->rx_hashtbl[index];
+
+ rlb6_delete_table_entry_dst(bond, index);
+ rlb_init_table_entry_dst(entry);
+ rlb6_src_unlink(bond, index);
+}
+
+static void rlb6_purge_src_ip(struct bonding *bond, struct ipv6hdr *ip6hdr,
+ u8 *lladdr)
+{
+ struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond));
+ struct rlb_client_info *client_info;
+ u32 ip_src_hash = _simple_hash((u8 *)ip6hdr->saddr.s6_addr,
+ sizeof(ip6hdr->saddr.s6_addr));
+ u32 index, next_index;
+
+ spin_lock_bh(&bond->mode_lock);
+
+ index = bond_info->rx6_hashtbl[ip_src_hash].src_first;
+ while (index != RLB_NULL_INDEX) {
+ client_info = &bond_info->rx6_hashtbl[index];
+ next_index = client_info->src_next;
+
+ if (!memcmp(client_info->ip6_src.s6_addr,
+ ip6hdr->saddr.s6_addr,
+ sizeof(ip6hdr->saddr.s6_addr)) &&
+ !ether_addr_equal_64bits(lladdr,
+ client_info->mac_src))
+ rlb6_delete_table_entry(bond, index);
+ index = next_index;
+ }
+
+ spin_unlock_bh(&bond->mode_lock);
+}
+
+static int rlb_nd_recv(struct sk_buff *skb, struct bonding *bond)
+{
+ struct ipv6hdr *ip6hdr;
+ struct nd_msg *msg;
+ struct inet6_ifaddr *ifp;
+ u8 *lladdr;
+
+ if (!pskb_network_may_pull(skb, sizeof(*ip6hdr)))
+ return RX_HANDLER_ANOTHER;
+
+ ip6hdr = ipv6_hdr(skb);
+
+ ifp = ipv6_get_ifaddr(dev_net(skb->dev), &ip6hdr->saddr, NULL, 0);
+ if (ifp) {
+ in6_ifa_put(ifp);
+ return RX_HANDLER_ANOTHER;
+ }
+
+ if (!pskb_network_may_pull(skb, sizeof(struct ipv6hdr) +
+ sizeof(struct nd_msg)))
+ return RX_HANDLER_ANOTHER;
+
+ msg = (struct nd_msg *)skb_transport_header(skb);
+ lladdr = alb_get_lladdr(skb);
+ if (!lladdr)
+ return RX_HANDLER_ANOTHER;
+
+ rlb6_purge_src_ip(bond, ip6hdr, lladdr);
+
+ if (msg->icmph.icmp6_type == NDISC_NEIGHBOUR_ADVERTISEMENT)
+ rlb6_update_entry_from_na(bond, ip6hdr, lladdr);
+
+ return RX_HANDLER_ANOTHER;
+}
+
+static int rlb_recv(struct sk_buff *skb, struct bonding *bond,
+ struct slave *slave)
+{
+ if (skb->protocol == cpu_to_be16(ETH_P_ARP))
+ return rlb_arp_recv(skb, bond, slave);
+ else if (alb_determine_ipv6_nd(skb, bond))
+ return rlb_nd_recv(skb, bond);
+
+ return RX_HANDLER_ANOTHER;
+}
+
/*********************** tlb/rlb shared functions *********************/
static void alb_send_lp_vid(struct slave *slave, const u8 mac_addr[],
@@ -1068,6 +1520,7 @@ static void alb_fasten_mac_swap(struct bonding *bond, struct slave *slave1,
* has changed
*/
rlb_req_update_slave_clients(bond, slave1);
+ rlb6_req_update_slave_clients(bond, slave1);
}
} else {
disabled_slave = slave1;
@@ -1080,6 +1533,7 @@ static void alb_fasten_mac_swap(struct bonding *bond, struct slave *slave1,
* has changed
*/
rlb_req_update_slave_clients(bond, slave2);
+ rlb6_req_update_slave_clients(bond, slave2);
}
} else {
disabled_slave = slave2;
@@ -1291,6 +1745,111 @@ static bool alb_determine_nd(struct sk_buff *skb, struct bonding *bond)
hdr->icmp6_type == NDISC_NEIGHBOUR_SOLICITATION;
}
+static bool alb_determine_ipv6_nd(struct sk_buff *skb, struct bonding *bond)
+{
+ if (skb->protocol == htons(ETH_P_IPV6)) {
+ if (skb_vlan_tag_present(skb))
+ skb->transport_header = skb->network_header + sizeof(struct ipv6hdr);
+ return alb_determine_nd(skb, bond);
+ }
+
+ return false;
+}
+
+static void alb_change_nd_option(struct sk_buff *skb, const void *data)
+{
+ struct nd_msg *msg = (struct nd_msg *)skb_transport_header(skb);
+ struct nd_opt_hdr *nd_opt = (struct nd_opt_hdr *)msg->opt;
+ struct net_device *dev = skb->dev;
+ struct icmp6hdr *icmp6h = icmp6_hdr(skb);
+ struct ipv6hdr *ip6hdr = ipv6_hdr(skb);
+ u8 *lladdr = NULL;
+ u32 ndoptlen = skb_tail_pointer(skb) - (skb_transport_header(skb) +
+ offsetof(struct nd_msg, opt));
+
+ while (ndoptlen) {
+ int l;
+
+ switch (nd_opt->nd_opt_type) {
+ case ND_OPT_SOURCE_LL_ADDR:
+ case ND_OPT_TARGET_LL_ADDR:
+ lladdr = ndisc_opt_addr_data(nd_opt, dev);
+ break;
+
+ default:
+ lladdr = NULL;
+ break;
+ }
+
+ l = nd_opt->nd_opt_len << 3;
+
+ if (ndoptlen < l || l == 0)
+ return;
+
+ if (lladdr) {
+ memcpy(lladdr, data, dev->addr_len);
+ icmp6h->icmp6_cksum = 0;
+
+ icmp6h->icmp6_cksum = csum_ipv6_magic(&ip6hdr->saddr,
+ &ip6hdr->daddr,
+ ntohs(ip6hdr->payload_len),
+ IPPROTO_ICMPV6,
+ csum_partial(icmp6h,
+ ntohs(ip6hdr->payload_len),
+ 0));
+ return;
+ }
+ ndoptlen -= l;
+ nd_opt = ((void *)nd_opt) + l;
+ }
+}
+
+static u8 *alb_get_lladdr(struct sk_buff *skb)
+{
+ struct nd_msg *msg = (struct nd_msg *)skb_transport_header(skb);
+ struct nd_opt_hdr *nd_opt = (struct nd_opt_hdr *)msg->opt;
+ struct net_device *dev = skb->dev;
+ u8 *lladdr = NULL;
+ u32 ndoptlen = skb_tail_pointer(skb) - (skb_transport_header(skb) +
+ offsetof(struct nd_msg, opt));
+
+ while (ndoptlen) {
+ int l;
+
+ switch (nd_opt->nd_opt_type) {
+ case ND_OPT_SOURCE_LL_ADDR:
+ case ND_OPT_TARGET_LL_ADDR:
+ lladdr = ndisc_opt_addr_data(nd_opt, dev);
+ break;
+
+ default:
+ break;
+ }
+
+ l = nd_opt->nd_opt_len << 3;
+
+ if (ndoptlen < l || l == 0)
+ return NULL;
+
+ if (lladdr)
+ return lladdr;
+
+ ndoptlen -= l;
+ nd_opt = ((void *)nd_opt) + l;
+ }
+
+ return lladdr;
+}
+
+static void alb_set_nd_option(struct sk_buff *skb, struct bonding *bond,
+ struct slave *tx_slave)
+{
+ if (tx_slave != rcu_access_pointer(bond->curr_active_slave)) {
+ if (alb_determine_nd(skb, bond))
+ alb_change_nd_option(skb, tx_slave->dev->dev_addr);
+ }
+}
+
/************************ exported alb functions ************************/
int bond_alb_initialize(struct bonding *bond, int rlb_enabled)
@@ -1457,12 +2016,17 @@ struct slave *bond_xmit_alb_slave_get(struct bonding *bond,
break;
}
- if (alb_determine_nd(skb, bond)) {
+ tx_slave = rlb_nd_xmit(skb, bond);
+ if (tx_slave) {
+ do_tx_balance = false;
+ break;
+ }
+
+ if (!pskb_network_may_pull(skb, sizeof(*ip6hdr))) {
do_tx_balance = false;
break;
}
- /* The IPv6 header is pulled by alb_determine_nd */
/* Additionally, DAD probes should not be tx-balanced as that
* will lead to false positives for duplicate addresses and
* prevent address configuration from working.
@@ -1612,6 +2176,17 @@ void bond_alb_monitor(struct work_struct *work)
bond_info->rx_ntt = 0;
}
}
+ if (bond_info->rx6_ntt) {
+ if (bond_info->rlb6_update_delay_counter) {
+ --bond_info->rlb6_update_delay_counter;
+ } else {
+ rlb6_update_rx_clients(bond);
+ if (bond_info->rlb6_update_retry_counter)
+ --bond_info->rlb6_update_retry_counter;
+ else
+ bond_info->rx6_ntt = 0;
+ }
+ }
}
rcu_read_unlock();
re_arm:
@@ -1812,6 +2387,7 @@ int bond_alb_set_mac_address(struct net_device *bond_dev, void *addr)
if (bond->alb_info.rlb_enabled) {
/* inform clients mac address has changed */
rlb_req_update_slave_clients(bond, curr_active);
+ rlb6_req_update_slave_clients(bond, curr_active);
}
}
diff --git a/drivers/net/bonding/bond_debugfs.c b/drivers/net/bonding/bond_debugfs.c
index 4f9b4a18c74c..90e88ff9b2bf 100644
--- a/drivers/net/bonding/bond_debugfs.c
+++ b/drivers/net/bonding/bond_debugfs.c
@@ -41,6 +41,20 @@ static int bond_debug_rlb_hash_show(struct seq_file *m, void *v)
client_info->slave->dev->name);
}
+ seq_puts(m, "SourceIP DestinationIP Destination MAC Src MAC DEV\n");
+
+ hash_index = bond_info->rx6_hashtbl_used_head;
+ for (; hash_index != RLB_NULL_INDEX;
+ hash_index = client_info->used_next) {
+ client_info = &bond_info->rx6_hashtbl[hash_index];
+ seq_printf(m, "%-40pI6 %-40pI6 %-17pM %-17pM %s\n",
+ &client_info->ip6_src,
+ &client_info->ip6_dst,
+ &client_info->mac_dst,
+ &client_info->mac_src,
+ client_info->slave->dev->name);
+ }
+
spin_unlock_bh(&bond->mode_lock);
return 0;
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
index 55e0ba2a163d..e487ac5bc533 100644
--- a/drivers/net/bonding/bond_main.c
+++ b/drivers/net/bonding/bond_main.c
@@ -1510,8 +1510,8 @@ static rx_handler_result_t bond_handle_frame(struct sk_buff **pskb)
struct sk_buff *skb = *pskb;
struct slave *slave;
struct bonding *bond;
- int (*recv_probe)(const struct sk_buff *, struct bonding *,
- struct slave *);
+ int (*recv_probe)(struct sk_buff *skb, struct bonding *bond,
+ struct slave *slave);
int ret = RX_HANDLER_ANOTHER;
skb = skb_share_check(skb, GFP_ATOMIC);
@@ -3228,7 +3228,7 @@ static int bond_na_rcv(const struct sk_buff *skb, struct bonding *bond,
}
#endif
-int bond_rcv_validate(const struct sk_buff *skb, struct bonding *bond,
+int bond_rcv_validate(struct sk_buff *skb, struct bonding *bond,
struct slave *slave)
{
#if IS_ENABLED(CONFIG_IPV6)
diff --git a/include/net/bond_3ad.h b/include/net/bond_3ad.h
index 184105d68294..51886d9c928d 100644
--- a/include/net/bond_3ad.h
+++ b/include/net/bond_3ad.h
@@ -300,7 +300,7 @@ void bond_3ad_handle_link_change(struct slave *slave, char link);
int bond_3ad_get_active_agg_info(struct bonding *bond, struct ad_info *ad_info);
int __bond_3ad_get_active_agg_info(struct bonding *bond,
struct ad_info *ad_info);
-int bond_3ad_lacpdu_recv(const struct sk_buff *skb, struct bonding *bond,
+int bond_3ad_lacpdu_recv(struct sk_buff *skb, struct bonding *bond,
struct slave *slave);
int bond_3ad_set_carrier(struct bonding *bond);
void bond_3ad_update_lacp_active(struct bonding *bond);
diff --git a/include/net/bond_alb.h b/include/net/bond_alb.h
index 191c36afa1f4..b1a572eead31 100644
--- a/include/net/bond_alb.h
+++ b/include/net/bond_alb.h
@@ -94,6 +94,8 @@ struct tlb_client_info {
struct rlb_client_info {
__be32 ip_src; /* the server IP address */
__be32 ip_dst; /* the client IP address */
+ struct in6_addr ip6_src;
+ struct in6_addr ip6_dst;
u8 mac_src[ETH_ALEN]; /* the server MAC address */
u8 mac_dst[ETH_ALEN]; /* the client MAC address */
@@ -131,10 +133,13 @@ struct alb_bond_info {
/* -------- rlb parameters -------- */
int rlb_enabled;
struct rlb_client_info *rx_hashtbl; /* Receive hash table */
+ struct rlb_client_info *rx6_hashtbl; /* Receive hash table */
u32 rx_hashtbl_used_head;
+ u32 rx6_hashtbl_used_head;
u8 rx_ntt; /* flag - need to transmit
* to all rx clients
*/
+ u8 rx6_ntt;
struct slave *rx_slave;/* last slave to xmit from */
u8 primary_is_promisc; /* boolean */
u32 rlb_promisc_timeout_counter;/* counts primary
@@ -144,6 +149,8 @@ struct alb_bond_info {
u32 rlb_update_retry_counter;/* counter of retries
* of client update
*/
+ u32 rlb6_update_delay_counter;
+ u32 rlb6_update_retry_counter;
u8 rlb_rebalance; /* flag - indicates that the
* rx traffic should be
* rebalanced
diff --git a/include/net/bonding.h b/include/net/bonding.h
index d0dfe727e0b1..c71dc175178d 100644
--- a/include/net/bonding.h
+++ b/include/net/bonding.h
@@ -220,8 +220,8 @@ struct bonding {
struct bond_up_slave __rcu *all_slaves;
bool force_primary;
s32 slave_cnt; /* never change this value outside the attach/detach wrappers */
- int (*recv_probe)(const struct sk_buff *, struct bonding *,
- struct slave *);
+ int (*recv_probe)(struct sk_buff *skb, struct bonding *bond,
+ struct slave *slave);
/* mode_lock is used for mode-specific locking needs, currently used by:
* 3ad mode (4) - protect against running bond_3ad_unbind_slave() and
* bond_3ad_state_machine_handler() concurrently and also
@@ -639,7 +639,7 @@ struct bond_net {
struct class_attribute class_attr_bonding_masters;
};
-int bond_rcv_validate(const struct sk_buff *skb, struct bonding *bond, struct slave *slave);
+int bond_rcv_validate(struct sk_buff *skb, struct bonding *bond, struct slave *slave);
netdev_tx_t bond_dev_queue_xmit(struct bonding *bond, struct sk_buff *skb, struct net_device *slave_dev);
int bond_create(struct net *net, const char *name);
int bond_create_sysfs(struct bond_net *net);
--
2.27.0
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH 1/3] net:ipv6:Add ndisc_bond_send_na to support sending na by slave directly
2022-03-11 2:49 ` [PATCH 1/3] net:ipv6:Add ndisc_bond_send_na to support sending na by slave directly Sun Shouxin
@ 2022-03-11 14:44 ` kernel test robot
2022-03-11 16:58 ` David Ahern
1 sibling, 0 replies; 9+ messages in thread
From: kernel test robot @ 2022-03-11 14:44 UTC (permalink / raw)
To: Sun Shouxin, j.vosburgh, vfalico, andy, davem, kuba, yoshfuji, dsahern
Cc: kbuild-all, netdev, linux-kernel, huyd12, sunshouxin
Hi Sun,
Thank you for the patch! Perhaps something to improve:
[auto build test WARNING on 2a9eef868a997ec575c2e6ae885e91313f635d59]
url: https://github.com/0day-ci/linux/commits/Sun-Shouxin/net-bonding-Add-support-for-IPV6-RLB-to-balance-alb-mode/20220311-110221
base: 2a9eef868a997ec575c2e6ae885e91313f635d59
config: mips-bmips_be_defconfig (https://download.01.org/0day-ci/archive/20220311/202203112242.Gjf5MZjs-lkp@intel.com/config)
compiler: mips-linux-gcc (GCC) 11.2.0
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://github.com/0day-ci/linux/commit/9bd4966a283f758f100bd97d09967edc92903c76
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Sun-Shouxin/net-bonding-Add-support-for-IPV6-RLB-to-balance-alb-mode/20220311-110221
git checkout 9bd4966a283f758f100bd97d09967edc92903c76
# save the config file to linux build tree
mkdir build_dir
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.2.0 make.cross O=build_dir ARCH=mips SHELL=/bin/bash net/ipv6/
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
All warnings (new ones prefixed by >>):
net/ipv6/ndisc.c: In function 'ndisc_bond_send_na':
>> net/ipv6/ndisc.c:587:13: warning: variable 'ret' set but not used [-Wunused-but-set-variable]
587 | int ret;
| ^~~
vim +/ret +587 net/ipv6/ndisc.c
574
575 void ndisc_bond_send_na(struct net_device *dev, const struct in6_addr *daddr,
576 const struct in6_addr *solicited_addr,
577 bool router, bool solicited, bool override,
578 bool inc_opt, unsigned short vlan_id,
579 const void *mac_dst, const void *mac_src)
580 {
581 struct sk_buff *skb;
582 const struct in6_addr *src_addr;
583 struct nd_msg *msg;
584 struct net *net = dev_net(dev);
585 struct sock *sk = net->ipv6.ndisc_sk;
586 int optlen = 0;
> 587 int ret;
588
589 src_addr = solicited_addr;
590 if (!dev->addr_len)
591 inc_opt = false;
592 if (inc_opt)
593 optlen += ndisc_opt_addr_space(dev,
594 NDISC_NEIGHBOUR_ADVERTISEMENT);
595
596 skb = ndisc_alloc_skb(dev, sizeof(*msg) + optlen);
597 if (!skb)
598 return;
599
600 msg = skb_put(skb, sizeof(*msg));
601 *msg = (struct nd_msg) {
602 .icmph = {
603 .icmp6_type = NDISC_NEIGHBOUR_ADVERTISEMENT,
604 .icmp6_router = router,
605 .icmp6_solicited = solicited,
606 .icmp6_override = override,
607 },
608 .target = *solicited_addr,
609 };
610
611 if (inc_opt)
612 ndisc_fill_addr_option(skb, ND_OPT_TARGET_LL_ADDR,
613 dev->dev_addr,
614 NDISC_NEIGHBOUR_ADVERTISEMENT);
615
616 if (vlan_id)
617 __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q),
618 vlan_id);
619
620 msg->icmph.icmp6_cksum = csum_ipv6_magic(src_addr, daddr, skb->len,
621 IPPROTO_ICMPV6,
622 csum_partial(&msg->icmph,
623 skb->len, 0));
624
625 ip6_nd_hdr(skb, src_addr, daddr, inet6_sk(sk)->hop_limit, skb->len);
626
627 skb->protocol = htons(ETH_P_IPV6);
628 skb->dev = dev;
629 if (dev_hard_header(skb, dev, ETH_P_IPV6, mac_dst, mac_src, skb->len) < 0)
630 return;
631
632 ret = dev_queue_xmit(skb);
633 }
634 EXPORT_SYMBOL(ndisc_bond_send_na);
635
---
0-DAY CI Kernel Test Service
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 3/3] net:bonding:Add support for IPV6 RLB to balance-alb mode
2022-03-11 2:49 ` [PATCH 3/3] net:bonding:Add support for IPV6 RLB to balance-alb mode Sun Shouxin
@ 2022-03-11 16:47 ` kernel test robot
2022-03-11 16:58 ` kernel test robot
1 sibling, 0 replies; 9+ messages in thread
From: kernel test robot @ 2022-03-11 16:47 UTC (permalink / raw)
To: Sun Shouxin, j.vosburgh, vfalico, andy, davem, kuba, yoshfuji, dsahern
Cc: llvm, kbuild-all, netdev, linux-kernel, huyd12, sunshouxin
Hi Sun,
Thank you for the patch! Perhaps something to improve:
[auto build test WARNING on 2a9eef868a997ec575c2e6ae885e91313f635d59]
url: https://github.com/0day-ci/linux/commits/Sun-Shouxin/net-bonding-Add-support-for-IPV6-RLB-to-balance-alb-mode/20220311-110221
base: 2a9eef868a997ec575c2e6ae885e91313f635d59
config: x86_64-randconfig-a005 (https://download.01.org/0day-ci/archive/20220312/202203120015.kkExdFHA-lkp@intel.com/config)
compiler: clang version 15.0.0 (https://github.com/llvm/llvm-project 276ca87382b8f16a65bddac700202924228982f6)
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://github.com/0day-ci/linux/commit/dde3df4ab3030a55968f48dc96ff2014d8f18410
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Sun-Shouxin/net-bonding-Add-support-for-IPV6-RLB-to-balance-alb-mode/20220311-110221
git checkout dde3df4ab3030a55968f48dc96ff2014d8f18410
# save the config file to linux build tree
mkdir build_dir
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=x86_64 SHELL=/bin/bash drivers/net/bonding/
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
All warnings (new ones prefixed by >>):
>> drivers/net/bonding/bond_alb.c:986:6: warning: no previous prototype for function 'rlb6_update_client' [-Wmissing-prototypes]
void rlb6_update_client(struct rlb_client_info *client_info)
^
drivers/net/bonding/bond_alb.c:986:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
void rlb6_update_client(struct rlb_client_info *client_info)
^
static
1 warning generated.
vim +/rlb6_update_client +986 drivers/net/bonding/bond_alb.c
984
985 /*********************** ipv6 rlb specific functions ***************************/
> 986 void rlb6_update_client(struct rlb_client_info *client_info)
987 {
988 int i;
989
990 if (!client_info->slave || !is_valid_ether_addr(client_info->mac_dst))
991 return;
992
993 for (i = 0; i < RLB_ARP_BURST_SIZE; i++) {
994 ndisc_bond_send_na(client_info->slave->dev,
995 &client_info->ip6_dst,
996 &client_info->ip6_src,
997 false, false, true, true,
998 client_info->vlan_id,
999 client_info->mac_dst,
1000 client_info->slave->dev->dev_addr);
1001 }
1002 }
1003
---
0-DAY CI Kernel Test Service
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 3/3] net:bonding:Add support for IPV6 RLB to balance-alb mode
2022-03-11 2:49 ` [PATCH 3/3] net:bonding:Add support for IPV6 RLB to balance-alb mode Sun Shouxin
2022-03-11 16:47 ` kernel test robot
@ 2022-03-11 16:58 ` kernel test robot
1 sibling, 0 replies; 9+ messages in thread
From: kernel test robot @ 2022-03-11 16:58 UTC (permalink / raw)
To: Sun Shouxin, j.vosburgh, vfalico, andy, davem, kuba, yoshfuji, dsahern
Cc: kbuild-all, netdev, linux-kernel, huyd12, sunshouxin
Hi Sun,
Thank you for the patch! Perhaps something to improve:
[auto build test WARNING on 2a9eef868a997ec575c2e6ae885e91313f635d59]
url: https://github.com/0day-ci/linux/commits/Sun-Shouxin/net-bonding-Add-support-for-IPV6-RLB-to-balance-alb-mode/20220311-110221
base: 2a9eef868a997ec575c2e6ae885e91313f635d59
config: i386-randconfig-a005 (https://download.01.org/0day-ci/archive/20220312/202203120001.k8e1fNyg-lkp@intel.com/config)
compiler: gcc-9 (Ubuntu 9.4.0-1ubuntu1~20.04) 9.4.0
reproduce (this is a W=1 build):
# https://github.com/0day-ci/linux/commit/dde3df4ab3030a55968f48dc96ff2014d8f18410
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Sun-Shouxin/net-bonding-Add-support-for-IPV6-RLB-to-balance-alb-mode/20220311-110221
git checkout dde3df4ab3030a55968f48dc96ff2014d8f18410
# save the config file to linux build tree
mkdir build_dir
make W=1 O=build_dir ARCH=i386 SHELL=/bin/bash drivers/net/bonding/
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
All warnings (new ones prefixed by >>):
>> drivers/net/bonding/bond_alb.c:986:6: warning: no previous prototype for 'rlb6_update_client' [-Wmissing-prototypes]
986 | void rlb6_update_client(struct rlb_client_info *client_info)
| ^~~~~~~~~~~~~~~~~~
vim +/rlb6_update_client +986 drivers/net/bonding/bond_alb.c
984
985 /*********************** ipv6 rlb specific functions ***************************/
> 986 void rlb6_update_client(struct rlb_client_info *client_info)
987 {
988 int i;
989
990 if (!client_info->slave || !is_valid_ether_addr(client_info->mac_dst))
991 return;
992
993 for (i = 0; i < RLB_ARP_BURST_SIZE; i++) {
994 ndisc_bond_send_na(client_info->slave->dev,
995 &client_info->ip6_dst,
996 &client_info->ip6_src,
997 false, false, true, true,
998 client_info->vlan_id,
999 client_info->mac_dst,
1000 client_info->slave->dev->dev_addr);
1001 }
1002 }
1003
---
0-DAY CI Kernel Test Service
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 1/3] net:ipv6:Add ndisc_bond_send_na to support sending na by slave directly
2022-03-11 2:49 ` [PATCH 1/3] net:ipv6:Add ndisc_bond_send_na to support sending na by slave directly Sun Shouxin
2022-03-11 14:44 ` kernel test robot
@ 2022-03-11 16:58 ` David Ahern
1 sibling, 0 replies; 9+ messages in thread
From: David Ahern @ 2022-03-11 16:58 UTC (permalink / raw)
To: Sun Shouxin, j.vosburgh, vfalico, andy, davem, kuba, yoshfuji
Cc: netdev, linux-kernel, huyd12
On 3/10/22 7:49 PM, Sun Shouxin wrote:
> diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c
> index fcb288b0ae13..c59a110e9b10 100644
> --- a/net/ipv6/ndisc.c
> +++ b/net/ipv6/ndisc.c
> @@ -572,6 +572,67 @@ void ndisc_send_na(struct net_device *dev, const struct in6_addr *daddr,
> ndisc_send_skb(skb, daddr, src_addr);
> }
>
> +void ndisc_bond_send_na(struct net_device *dev, const struct in6_addr *daddr,
This ipv6 code, not bond code
> + const struct in6_addr *solicited_addr,
> + bool router, bool solicited, bool override,
> + bool inc_opt, unsigned short vlan_id,
> + const void *mac_dst, const void *mac_src)
> +{
> + struct sk_buff *skb;
> + const struct in6_addr *src_addr;
> + struct nd_msg *msg;
> + struct net *net = dev_net(dev);
> + struct sock *sk = net->ipv6.ndisc_sk;
> + int optlen = 0;
> + int ret;
> +
> + src_addr = solicited_addr;
> + if (!dev->addr_len)
> + inc_opt = false;
> + if (inc_opt)
> + optlen += ndisc_opt_addr_space(dev,
> + NDISC_NEIGHBOUR_ADVERTISEMENT);
> +
> + skb = ndisc_alloc_skb(dev, sizeof(*msg) + optlen);
> + if (!skb)
> + return;
> +
> + msg = skb_put(skb, sizeof(*msg));
> + *msg = (struct nd_msg) {
> + .icmph = {
> + .icmp6_type = NDISC_NEIGHBOUR_ADVERTISEMENT,
> + .icmp6_router = router,
> + .icmp6_solicited = solicited,
> + .icmp6_override = override,
> + },
> + .target = *solicited_addr,
> + };
> +
> + if (inc_opt)
> + ndisc_fill_addr_option(skb, ND_OPT_TARGET_LL_ADDR,
> + dev->dev_addr,
> + NDISC_NEIGHBOUR_ADVERTISEMENT);
> +
> + if (vlan_id)
> + __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q),
> + vlan_id);
> +
> + msg->icmph.icmp6_cksum = csum_ipv6_magic(src_addr, daddr, skb->len,
> + IPPROTO_ICMPV6,
> + csum_partial(&msg->icmph,
> + skb->len, 0));
> +
> + ip6_nd_hdr(skb, src_addr, daddr, inet6_sk(sk)->hop_limit, skb->len);
> +
> + skb->protocol = htons(ETH_P_IPV6);
> + skb->dev = dev;
> + if (dev_hard_header(skb, dev, ETH_P_IPV6, mac_dst, mac_src, skb->len) < 0)
> + return;
> +
> + ret = dev_queue_xmit(skb);
> +}
> +EXPORT_SYMBOL(ndisc_bond_send_na);
It would be better to refactor ndisc_send_na and extract what you think
you need into a new helper that gets exported for bond.
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 1/3] net:ipv6:Add ndisc_bond_send_na to support sending na by slave directly
@ 2022-03-12 17:52 kernel test robot
0 siblings, 0 replies; 9+ messages in thread
From: kernel test robot @ 2022-03-12 17:52 UTC (permalink / raw)
To: kbuild
[-- Attachment #1: Type: text/plain, Size: 18934 bytes --]
CC: llvm(a)lists.linux.dev
CC: kbuild-all(a)lists.01.org
BCC: lkp(a)intel.com
In-Reply-To: <20220311024958.7458-2-sunshouxin@chinatelecom.cn>
References: <20220311024958.7458-2-sunshouxin@chinatelecom.cn>
TO: Sun Shouxin <sunshouxin@chinatelecom.cn>
TO: j.vosburgh(a)gmail.com
TO: vfalico(a)gmail.com
TO: andy(a)greyhouse.net
TO: davem(a)davemloft.net
TO: kuba(a)kernel.org
TO: yoshfuji(a)linux-ipv6.org
TO: dsahern(a)kernel.org
CC: netdev(a)vger.kernel.org
CC: linux-kernel(a)vger.kernel.org
CC: huyd12(a)chinatelecom.cn
CC: sunshouxin(a)chinatelecom.cn
Hi Sun,
Thank you for the patch! Perhaps something to improve:
[auto build test WARNING on 2a9eef868a997ec575c2e6ae885e91313f635d59]
url: https://github.com/0day-ci/linux/commits/Sun-Shouxin/net-bonding-Add-support-for-IPV6-RLB-to-balance-alb-mode/20220311-110221
base: 2a9eef868a997ec575c2e6ae885e91313f635d59
:::::: branch date: 2 days ago
:::::: commit date: 2 days ago
config: x86_64-randconfig-c007 (https://download.01.org/0day-ci/archive/20220313/202203130159.VLYBoOIo-lkp(a)intel.com/config)
compiler: clang version 15.0.0 (https://github.com/llvm/llvm-project 276ca87382b8f16a65bddac700202924228982f6)
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://github.com/0day-ci/linux/commit/9bd4966a283f758f100bd97d09967edc92903c76
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Sun-Shouxin/net-bonding-Add-support-for-IPV6-RLB-to-balance-alb-mode/20220311-110221
git checkout 9bd4966a283f758f100bd97d09967edc92903c76
# save the config file to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=x86_64 clang-analyzer
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
clang-analyzer warnings: (new ones prefixed by >>)
^
net/wireless/reg.c:1544:14: note: Assuming 'x' is < field 'n_reg_rules'
for (x = 0; x < rd1->n_reg_rules; x++) {
^~~~~~~~~~~~~~~~~~~~
net/wireless/reg.c:1544:2: note: Loop condition is true. Entering loop body
for (x = 0; x < rd1->n_reg_rules; x++) {
^
net/wireless/reg.c:1546:15: note: Assuming 'y' is < field 'n_reg_rules'
for (y = 0; y < rd2->n_reg_rules; y++) {
^~~~~~~~~~~~~~~~~~~~
net/wireless/reg.c:1546:3: note: Loop condition is true. Entering loop body
for (y = 0; y < rd2->n_reg_rules; y++) {
^
net/wireless/reg.c:1548:8: note: Assuming the condition is true
if (!reg_rules_intersect(rd1, rd2, rule1, rule2,
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
net/wireless/reg.c:1548:4: note: Taking true branch
if (!reg_rules_intersect(rd1, rd2, rule1, rule2,
^
net/wireless/reg.c:1546:15: note: Assuming 'y' is >= field 'n_reg_rules'
for (y = 0; y < rd2->n_reg_rules; y++) {
^~~~~~~~~~~~~~~~~~~~
net/wireless/reg.c:1546:3: note: Loop condition is false. Execution continues on line 1544
for (y = 0; y < rd2->n_reg_rules; y++) {
^
net/wireless/reg.c:1544:14: note: Assuming 'x' is >= field 'n_reg_rules'
for (x = 0; x < rd1->n_reg_rules; x++) {
^~~~~~~~~~~~~~~~~~~~
net/wireless/reg.c:1544:2: note: Loop condition is false. Execution continues on line 1554
for (x = 0; x < rd1->n_reg_rules; x++) {
^
net/wireless/reg.c:1554:7: note: 'num_rules' is 1
if (!num_rules)
^~~~~~~~~
net/wireless/reg.c:1554:2: note: Taking false branch
if (!num_rules)
^
net/wireless/reg.c:1557:7: note: Calling 'kzalloc'
rd = kzalloc(struct_size(rd, reg_rules, num_rules), GFP_KERNEL);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/slab.h:714:9: note: Memory is allocated
return kmalloc(size, flags | __GFP_ZERO);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
net/wireless/reg.c:1557:7: note: Returned allocated memory
rd = kzalloc(struct_size(rd, reg_rules, num_rules), GFP_KERNEL);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
net/wireless/reg.c:1558:6: note: Assuming 'rd' is non-null
if (!rd)
^~~
net/wireless/reg.c:1558:2: note: Taking false branch
if (!rd)
^
net/wireless/reg.c:1561:2: note: Loop condition is true. Entering loop body
for (x = 0; x < rd1->n_reg_rules; x++) {
^
net/wireless/reg.c:1563:3: note: Loop condition is true. Entering loop body
for (y = 0; y < rd2->n_reg_rules; y++) {
^
net/wireless/reg.c:1571:8: note: Assuming 'r' is not equal to 0
if (r)
^
net/wireless/reg.c:1571:4: note: Taking true branch
if (r)
^
net/wireless/reg.c:1572:5: note: Execution continues on line 1563
continue;
^
net/wireless/reg.c:1563:3: note: Loop condition is false. Execution continues on line 1561
for (y = 0; y < rd2->n_reg_rules; y++) {
^
net/wireless/reg.c:1561:2: note: Loop condition is false. Execution continues on line 1579
for (x = 0; x < rd1->n_reg_rules; x++) {
^
net/wireless/reg.c:3813:19: note: Returned allocated memory
intersected_rd = regdom_intersect(rd, get_cfg80211_regdom());
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
net/wireless/reg.c:3814:7: note: 'intersected_rd' is non-null
if (!intersected_rd)
^~~~~~~~~~~~~~
net/wireless/reg.c:3814:2: note: Taking false branch
if (!intersected_rd)
^
net/wireless/reg.c:3821:2: note: Potential leak of memory pointed to by 'intersected_rd'
return 0;
^
Suppressed 10 warnings (10 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
11 warnings generated.
net/ipv6/ip6_fib.c:1403:2: warning: Value stored to 'pn' is never read [clang-analyzer-deadcode.DeadStores]
pn = fn;
^ ~~
net/ipv6/ip6_fib.c:1403:2: note: Value stored to 'pn' is never read
pn = fn;
^ ~~
Suppressed 10 warnings (9 in non-user code, 1 with check filters).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
9 warnings generated.
Suppressed 9 warnings (9 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
14 warnings generated.
>> net/ipv6/ndisc.c:632:2: warning: Value stored to 'ret' is never read [clang-analyzer-deadcode.DeadStores]
ret = dev_queue_xmit(skb);
^ ~~~~~~~~~~~~~~~~~~~
net/ipv6/ndisc.c:632:2: note: Value stored to 'ret' is never read
ret = dev_queue_xmit(skb);
^ ~~~~~~~~~~~~~~~~~~~
net/ipv6/ndisc.c:814:14: warning: Although the value stored to 'probes' is used in the enclosing expression, the value is never actually read from 'probes' [clang-analyzer-deadcode.DeadStores]
} else if ((probes -= NEIGH_VAR(neigh->parms, APP_PROBES)) < 0) {
^
net/ipv6/ndisc.c:814:14: note: Although the value stored to 'probes' is used in the enclosing expression, the value is never actually read from 'probes'
net/ipv6/ndisc.c:918:10: warning: Value stored to 'np' during its initialization is never read [clang-analyzer-deadcode.DeadStores]
u8 *np = (u8 *)&nonce;
^~ ~~~~~~~~~~~~
net/ipv6/ndisc.c:918:10: note: Value stored to 'np' during its initialization is never read
u8 *np = (u8 *)&nonce;
^~ ~~~~~~~~~~~~
net/ipv6/ndisc.c:1935:3: warning: Call to function 'strcpy' is insecure as it does not provide bounding of the memory buffer. Replace unbounded copy functions with analogous functions that support length arguments such as 'strlcpy'. CWE-119 [clang-analyzer-security.insecureAPI.strcpy]
strcpy(warncomm, current->comm);
^~~~~~
net/ipv6/ndisc.c:1935:3: note: Call to function 'strcpy' is insecure as it does not provide bounding of the memory buffer. Replace unbounded copy functions with analogous functions that support length arguments such as 'strlcpy'. CWE-119
strcpy(warncomm, current->comm);
^~~~~~
Suppressed 10 warnings (9 in non-user code, 1 with check filters).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
9 warnings generated.
Suppressed 9 warnings (9 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
9 warnings generated.
Suppressed 9 warnings (9 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
10 warnings generated.
include/linux/skbuff.h:2755:9: warning: Access to field 'head' results in a dereference of a null pointer (loaded from variable 'skb') [clang-analyzer-core.NullDereference]
return skb->head + skb->transport_header;
^
net/ipv6/raw.c:770:2: note: Taking false branch
DECLARE_SOCKADDR(struct sockaddr_in6 *, sin6, msg->msg_name);
^
include/linux/net.h:206:16: note: expanded from macro 'DECLARE_SOCKADDR'
type dst = ({ __sockaddr_check_size(sizeof(*dst)); (type) src; })
^
include/linux/socket.h:19:2: note: expanded from macro '__sockaddr_check_size'
BUILD_BUG_ON(((size) > sizeof(struct __kernel_sockaddr_storage)))
^
include/linux/build_bug.h:50:2: note: expanded from macro 'BUILD_BUG_ON'
BUILD_BUG_ON_MSG(condition, "BUILD_BUG_ON failed: " #condition)
^
note: (skipping 1 expansions in backtrace; use -fmacro-backtrace-limit=0 to see all)
include/linux/compiler_types.h:349:2: note: expanded from macro 'compiletime_assert'
_compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
^
include/linux/compiler_types.h:337:2: note: expanded from macro '_compiletime_assert'
__compiletime_assert(condition, msg, prefix, suffix)
^
include/linux/compiler_types.h:329:3: note: expanded from macro '__compiletime_assert'
if (!(condition)) \
^
net/ipv6/raw.c:770:2: note: Loop condition is false. Exiting loop
DECLARE_SOCKADDR(struct sockaddr_in6 *, sin6, msg->msg_name);
^
include/linux/net.h:206:16: note: expanded from macro 'DECLARE_SOCKADDR'
type dst = ({ __sockaddr_check_size(sizeof(*dst)); (type) src; })
^
include/linux/socket.h:19:2: note: expanded from macro '__sockaddr_check_size'
BUILD_BUG_ON(((size) > sizeof(struct __kernel_sockaddr_storage)))
^
include/linux/build_bug.h:50:2: note: expanded from macro 'BUILD_BUG_ON'
BUILD_BUG_ON_MSG(condition, "BUILD_BUG_ON failed: " #condition)
^
note: (skipping 1 expansions in backtrace; use -fmacro-backtrace-limit=0 to see all)
include/linux/compiler_types.h:349:2: note: expanded from macro 'compiletime_assert'
_compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
^
include/linux/compiler_types.h:337:2: note: expanded from macro '_compiletime_assert'
__compiletime_assert(condition, msg, prefix, suffix)
^
include/linux/compiler_types.h:321:2: note: expanded from macro '__compiletime_assert'
do { \
^
net/ipv6/raw.c:789:6: note: Assuming the condition is false
if (len > INT_MAX)
^~~~~~~~~~~~~
net/ipv6/raw.c:789:2: note: Taking false branch
if (len > INT_MAX)
^
net/ipv6/raw.c:793:6: note: Assuming the condition is false
if (msg->msg_flags & MSG_OOB)
^~~~~~~~~~~~~~~~~~~~~~~~
net/ipv6/raw.c:793:2: note: Taking false branch
if (msg->msg_flags & MSG_OOB)
^
net/ipv6/raw.c:801:12: note: Left side of '||' is false
hdrincl = READ_ONCE(hdrincl);
^
include/asm-generic/rwonce.h:49:2: note: expanded from macro 'READ_ONCE'
compiletime_assert_rwonce_type(x); \
^
include/asm-generic/rwonce.h:36:21: note: expanded from macro 'compiletime_assert_rwonce_type'
compiletime_assert(__native_word(t) || sizeof(t) == sizeof(long long), \
^
include/linux/compiler_types.h:316:3: note: expanded from macro '__native_word'
(sizeof(t) == sizeof(char) || sizeof(t) == sizeof(short) || \
vim +/ret +632 net/ipv6/ndisc.c
e1ec7842df5db8 YOSHIFUJI Hideaki 2007-04-24 574
9bd4966a283f75 Sun Shouxin 2022-03-10 575 void ndisc_bond_send_na(struct net_device *dev, const struct in6_addr *daddr,
9bd4966a283f75 Sun Shouxin 2022-03-10 576 const struct in6_addr *solicited_addr,
9bd4966a283f75 Sun Shouxin 2022-03-10 577 bool router, bool solicited, bool override,
9bd4966a283f75 Sun Shouxin 2022-03-10 578 bool inc_opt, unsigned short vlan_id,
9bd4966a283f75 Sun Shouxin 2022-03-10 579 const void *mac_dst, const void *mac_src)
9bd4966a283f75 Sun Shouxin 2022-03-10 580 {
9bd4966a283f75 Sun Shouxin 2022-03-10 581 struct sk_buff *skb;
9bd4966a283f75 Sun Shouxin 2022-03-10 582 const struct in6_addr *src_addr;
9bd4966a283f75 Sun Shouxin 2022-03-10 583 struct nd_msg *msg;
9bd4966a283f75 Sun Shouxin 2022-03-10 584 struct net *net = dev_net(dev);
9bd4966a283f75 Sun Shouxin 2022-03-10 585 struct sock *sk = net->ipv6.ndisc_sk;
9bd4966a283f75 Sun Shouxin 2022-03-10 586 int optlen = 0;
9bd4966a283f75 Sun Shouxin 2022-03-10 587 int ret;
9bd4966a283f75 Sun Shouxin 2022-03-10 588
9bd4966a283f75 Sun Shouxin 2022-03-10 589 src_addr = solicited_addr;
9bd4966a283f75 Sun Shouxin 2022-03-10 590 if (!dev->addr_len)
9bd4966a283f75 Sun Shouxin 2022-03-10 591 inc_opt = false;
9bd4966a283f75 Sun Shouxin 2022-03-10 592 if (inc_opt)
9bd4966a283f75 Sun Shouxin 2022-03-10 593 optlen += ndisc_opt_addr_space(dev,
9bd4966a283f75 Sun Shouxin 2022-03-10 594 NDISC_NEIGHBOUR_ADVERTISEMENT);
9bd4966a283f75 Sun Shouxin 2022-03-10 595
9bd4966a283f75 Sun Shouxin 2022-03-10 596 skb = ndisc_alloc_skb(dev, sizeof(*msg) + optlen);
9bd4966a283f75 Sun Shouxin 2022-03-10 597 if (!skb)
9bd4966a283f75 Sun Shouxin 2022-03-10 598 return;
9bd4966a283f75 Sun Shouxin 2022-03-10 599
9bd4966a283f75 Sun Shouxin 2022-03-10 600 msg = skb_put(skb, sizeof(*msg));
9bd4966a283f75 Sun Shouxin 2022-03-10 601 *msg = (struct nd_msg) {
9bd4966a283f75 Sun Shouxin 2022-03-10 602 .icmph = {
9bd4966a283f75 Sun Shouxin 2022-03-10 603 .icmp6_type = NDISC_NEIGHBOUR_ADVERTISEMENT,
9bd4966a283f75 Sun Shouxin 2022-03-10 604 .icmp6_router = router,
9bd4966a283f75 Sun Shouxin 2022-03-10 605 .icmp6_solicited = solicited,
9bd4966a283f75 Sun Shouxin 2022-03-10 606 .icmp6_override = override,
9bd4966a283f75 Sun Shouxin 2022-03-10 607 },
9bd4966a283f75 Sun Shouxin 2022-03-10 608 .target = *solicited_addr,
9bd4966a283f75 Sun Shouxin 2022-03-10 609 };
9bd4966a283f75 Sun Shouxin 2022-03-10 610
9bd4966a283f75 Sun Shouxin 2022-03-10 611 if (inc_opt)
9bd4966a283f75 Sun Shouxin 2022-03-10 612 ndisc_fill_addr_option(skb, ND_OPT_TARGET_LL_ADDR,
9bd4966a283f75 Sun Shouxin 2022-03-10 613 dev->dev_addr,
9bd4966a283f75 Sun Shouxin 2022-03-10 614 NDISC_NEIGHBOUR_ADVERTISEMENT);
9bd4966a283f75 Sun Shouxin 2022-03-10 615
9bd4966a283f75 Sun Shouxin 2022-03-10 616 if (vlan_id)
9bd4966a283f75 Sun Shouxin 2022-03-10 617 __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q),
9bd4966a283f75 Sun Shouxin 2022-03-10 618 vlan_id);
9bd4966a283f75 Sun Shouxin 2022-03-10 619
9bd4966a283f75 Sun Shouxin 2022-03-10 620 msg->icmph.icmp6_cksum = csum_ipv6_magic(src_addr, daddr, skb->len,
9bd4966a283f75 Sun Shouxin 2022-03-10 621 IPPROTO_ICMPV6,
9bd4966a283f75 Sun Shouxin 2022-03-10 622 csum_partial(&msg->icmph,
9bd4966a283f75 Sun Shouxin 2022-03-10 623 skb->len, 0));
9bd4966a283f75 Sun Shouxin 2022-03-10 624
9bd4966a283f75 Sun Shouxin 2022-03-10 625 ip6_nd_hdr(skb, src_addr, daddr, inet6_sk(sk)->hop_limit, skb->len);
9bd4966a283f75 Sun Shouxin 2022-03-10 626
9bd4966a283f75 Sun Shouxin 2022-03-10 627 skb->protocol = htons(ETH_P_IPV6);
9bd4966a283f75 Sun Shouxin 2022-03-10 628 skb->dev = dev;
9bd4966a283f75 Sun Shouxin 2022-03-10 629 if (dev_hard_header(skb, dev, ETH_P_IPV6, mac_dst, mac_src, skb->len) < 0)
9bd4966a283f75 Sun Shouxin 2022-03-10 630 return;
9bd4966a283f75 Sun Shouxin 2022-03-10 631
9bd4966a283f75 Sun Shouxin 2022-03-10 @632 ret = dev_queue_xmit(skb);
9bd4966a283f75 Sun Shouxin 2022-03-10 633 }
9bd4966a283f75 Sun Shouxin 2022-03-10 634 EXPORT_SYMBOL(ndisc_bond_send_na);
9bd4966a283f75 Sun Shouxin 2022-03-10 635
---
0-DAY CI Kernel Test Service
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2022-03-12 17:52 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-03-11 2:49 [PATCH 0/3] net:bonding:Add support for IPV6 RLB to balance-alb mode Sun Shouxin
2022-03-11 2:49 ` [PATCH 1/3] net:ipv6:Add ndisc_bond_send_na to support sending na by slave directly Sun Shouxin
2022-03-11 14:44 ` kernel test robot
2022-03-11 16:58 ` David Ahern
2022-03-11 2:49 ` [PATCH 2/3] net:ipv6:Export inet6_ifa_finish_destroy and ipv6_get_ifaddr Sun Shouxin
2022-03-11 2:49 ` [PATCH 3/3] net:bonding:Add support for IPV6 RLB to balance-alb mode Sun Shouxin
2022-03-11 16:47 ` kernel test robot
2022-03-11 16:58 ` kernel test robot
2022-03-12 17:52 [PATCH 1/3] net:ipv6:Add ndisc_bond_send_na to support sending na by slave directly kernel test robot
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.