2
0
mirror of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git synced 2025-09-04 20:19:47 +08:00

net: replace ND_PRINTK with dynamic debug

ND_PRINTK with val > 1 only works when the ND_DEBUG was set in compilation
phase. Replace it with dynamic debug. Convert ND_PRINTK with val <= 1 to
net_{err,warn}_ratelimited, and convert the rest to net_dbg_ratelimited.

Suggested-by: Ido Schimmel <idosch@idosch.org>
Signed-off-by: Wang Liang <wangliang74@huawei.com>
Reviewed-by: Ido Schimmel <idosch@nvidia.com>
Link: https://patch.msgid.link/20250708033342.1627636-1-wangliang74@huawei.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
Wang Liang 2025-07-08 11:33:42 +08:00 committed by Jakub Kicinski
parent cd258940b3
commit 96698d1898
3 changed files with 67 additions and 115 deletions

View File

@ -60,15 +60,6 @@ enum {
#include <net/neighbour.h> #include <net/neighbour.h>
/* Set to 3 to get tracing... */
#define ND_DEBUG 1
#define ND_PRINTK(val, level, fmt, ...) \
do { \
if (val <= ND_DEBUG) \
net_##level##_ratelimited(fmt, ##__VA_ARGS__); \
} while (0)
struct ctl_table; struct ctl_table;
struct inet6_dev; struct inet6_dev;
struct net_device; struct net_device;

View File

@ -20,8 +20,7 @@ static int lowpan_ndisc_parse_802154_options(const struct net_device *dev,
switch (nd_opt->nd_opt_len) { switch (nd_opt->nd_opt_len) {
case NDISC_802154_SHORT_ADDR_LENGTH: case NDISC_802154_SHORT_ADDR_LENGTH:
if (ndopts->nd_802154_opt_array[nd_opt->nd_opt_type]) if (ndopts->nd_802154_opt_array[nd_opt->nd_opt_type])
ND_PRINTK(2, warn, net_dbg_ratelimited("%s: duplicated short addr ND6 option found: type=%d\n",
"%s: duplicated short addr ND6 option found: type=%d\n",
__func__, nd_opt->nd_opt_type); __func__, nd_opt->nd_opt_type);
else else
ndopts->nd_802154_opt_array[nd_opt->nd_opt_type] = nd_opt; ndopts->nd_802154_opt_array[nd_opt->nd_opt_type] = nd_opt;
@ -63,8 +62,7 @@ static void lowpan_ndisc_802154_update(struct neighbour *n, u32 flags,
lladdr_short = __ndisc_opt_addr_data(ndopts->nd_802154_opts_src_lladdr, lladdr_short = __ndisc_opt_addr_data(ndopts->nd_802154_opts_src_lladdr,
IEEE802154_SHORT_ADDR_LEN, 0); IEEE802154_SHORT_ADDR_LEN, 0);
if (!lladdr_short) { if (!lladdr_short) {
ND_PRINTK(2, warn, net_dbg_ratelimited("NA: invalid short link-layer address length\n");
"NA: invalid short link-layer address length\n");
return; return;
} }
} }
@ -75,8 +73,7 @@ static void lowpan_ndisc_802154_update(struct neighbour *n, u32 flags,
lladdr_short = __ndisc_opt_addr_data(ndopts->nd_802154_opts_tgt_lladdr, lladdr_short = __ndisc_opt_addr_data(ndopts->nd_802154_opts_tgt_lladdr,
IEEE802154_SHORT_ADDR_LEN, 0); IEEE802154_SHORT_ADDR_LEN, 0);
if (!lladdr_short) { if (!lladdr_short) {
ND_PRINTK(2, warn, net_dbg_ratelimited("NA: invalid short link-layer address length\n");
"NA: invalid short link-layer address length\n");
return; return;
} }
} }
@ -209,8 +206,7 @@ static void lowpan_ndisc_prefix_rcv_add_addr(struct net *net,
sllao, tokenized, valid_lft, sllao, tokenized, valid_lft,
prefered_lft); prefered_lft);
if (err) if (err)
ND_PRINTK(2, warn, net_dbg_ratelimited("RA: could not add a short address based address for prefix: %pI6c\n",
"RA: could not add a short address based address for prefix: %pI6c\n",
&pinfo->prefix); &pinfo->prefix);
} }
} }

View File

@ -243,8 +243,7 @@ struct ndisc_options *ndisc_parse_options(const struct net_device *dev,
case ND_OPT_NONCE: case ND_OPT_NONCE:
case ND_OPT_REDIRECT_HDR: case ND_OPT_REDIRECT_HDR:
if (ndopts->nd_opt_array[nd_opt->nd_opt_type]) { if (ndopts->nd_opt_array[nd_opt->nd_opt_type]) {
ND_PRINTK(2, warn, net_dbg_ratelimited("%s: duplicated ND6 option found: type=%d\n",
"%s: duplicated ND6 option found: type=%d\n",
__func__, nd_opt->nd_opt_type); __func__, nd_opt->nd_opt_type);
} else { } else {
ndopts->nd_opt_array[nd_opt->nd_opt_type] = nd_opt; ndopts->nd_opt_array[nd_opt->nd_opt_type] = nd_opt;
@ -275,11 +274,8 @@ struct ndisc_options *ndisc_parse_options(const struct net_device *dev,
* to accommodate future extension to the * to accommodate future extension to the
* protocol. * protocol.
*/ */
ND_PRINTK(2, notice, net_dbg_ratelimited("%s: ignored unsupported option; type=%d, len=%d\n",
"%s: ignored unsupported option; type=%d, len=%d\n", __func__, nd_opt->nd_opt_type, nd_opt->nd_opt_len);
__func__,
nd_opt->nd_opt_type,
nd_opt->nd_opt_len);
} }
next_opt: next_opt:
opt_len -= l; opt_len -= l;
@ -754,8 +750,7 @@ static void ndisc_solicit(struct neighbour *neigh, struct sk_buff *skb)
probes -= NEIGH_VAR(neigh->parms, UCAST_PROBES); probes -= NEIGH_VAR(neigh->parms, UCAST_PROBES);
if (probes < 0) { if (probes < 0) {
if (!(READ_ONCE(neigh->nud_state) & NUD_VALID)) { if (!(READ_ONCE(neigh->nud_state) & NUD_VALID)) {
ND_PRINTK(1, dbg, net_dbg_ratelimited("%s: trying to ucast probe in NUD_INVALID: %pI6\n",
"%s: trying to ucast probe in NUD_INVALID: %pI6\n",
__func__, target); __func__, target);
} }
ndisc_send_ns(dev, target, target, saddr, 0); ndisc_send_ns(dev, target, target, saddr, 0);
@ -814,7 +809,7 @@ static enum skb_drop_reason ndisc_recv_ns(struct sk_buff *skb)
return SKB_DROP_REASON_PKT_TOO_SMALL; return SKB_DROP_REASON_PKT_TOO_SMALL;
if (ipv6_addr_is_multicast(&msg->target)) { if (ipv6_addr_is_multicast(&msg->target)) {
ND_PRINTK(2, warn, "NS: multicast target address\n"); net_dbg_ratelimited("NS: multicast target address\n");
return reason; return reason;
} }
@ -823,7 +818,7 @@ static enum skb_drop_reason ndisc_recv_ns(struct sk_buff *skb)
* DAD has to be destined for solicited node multicast address. * DAD has to be destined for solicited node multicast address.
*/ */
if (dad && !ipv6_addr_is_solict_mult(daddr)) { if (dad && !ipv6_addr_is_solict_mult(daddr)) {
ND_PRINTK(2, warn, "NS: bad DAD packet (wrong destination)\n"); net_dbg_ratelimited("NS: bad DAD packet (wrong destination)\n");
return reason; return reason;
} }
@ -833,8 +828,7 @@ static enum skb_drop_reason ndisc_recv_ns(struct sk_buff *skb)
if (ndopts.nd_opts_src_lladdr) { if (ndopts.nd_opts_src_lladdr) {
lladdr = ndisc_opt_addr_data(ndopts.nd_opts_src_lladdr, dev); lladdr = ndisc_opt_addr_data(ndopts.nd_opts_src_lladdr, dev);
if (!lladdr) { if (!lladdr) {
ND_PRINTK(2, warn, net_dbg_ratelimited("NS: invalid link-layer address length\n");
"NS: invalid link-layer address length\n");
return reason; return reason;
} }
@ -844,8 +838,7 @@ static enum skb_drop_reason ndisc_recv_ns(struct sk_buff *skb)
* in the message. * in the message.
*/ */
if (dad) { if (dad) {
ND_PRINTK(2, warn, net_dbg_ratelimited("NS: bad DAD packet (link-layer address option)\n");
"NS: bad DAD packet (link-layer address option)\n");
return reason; return reason;
} }
} }
@ -862,10 +855,8 @@ have_ifp:
if (nonce != 0 && ifp->dad_nonce == nonce) { if (nonce != 0 && ifp->dad_nonce == nonce) {
u8 *np = (u8 *)&nonce; u8 *np = (u8 *)&nonce;
/* Matching nonce if looped back */ /* Matching nonce if looped back */
ND_PRINTK(2, notice, net_dbg_ratelimited("%s: IPv6 DAD loopback for address %pI6c nonce %pM ignored\n",
"%s: IPv6 DAD loopback for address %pI6c nonce %pM ignored\n", ifp->idev->dev->name, &ifp->addr, np);
ifp->idev->dev->name,
&ifp->addr, np);
goto out; goto out;
} }
/* /*
@ -1016,13 +1007,13 @@ static enum skb_drop_reason ndisc_recv_na(struct sk_buff *skb)
return SKB_DROP_REASON_PKT_TOO_SMALL; return SKB_DROP_REASON_PKT_TOO_SMALL;
if (ipv6_addr_is_multicast(&msg->target)) { if (ipv6_addr_is_multicast(&msg->target)) {
ND_PRINTK(2, warn, "NA: target address is multicast\n"); net_dbg_ratelimited("NA: target address is multicast\n");
return reason; return reason;
} }
if (ipv6_addr_is_multicast(daddr) && if (ipv6_addr_is_multicast(daddr) &&
msg->icmph.icmp6_solicited) { msg->icmph.icmp6_solicited) {
ND_PRINTK(2, warn, "NA: solicited NA is multicasted\n"); net_dbg_ratelimited("NA: solicited NA is multicasted\n");
return reason; return reason;
} }
@ -1041,8 +1032,7 @@ static enum skb_drop_reason ndisc_recv_na(struct sk_buff *skb)
if (ndopts.nd_opts_tgt_lladdr) { if (ndopts.nd_opts_tgt_lladdr) {
lladdr = ndisc_opt_addr_data(ndopts.nd_opts_tgt_lladdr, dev); lladdr = ndisc_opt_addr_data(ndopts.nd_opts_tgt_lladdr, dev);
if (!lladdr) { if (!lladdr) {
ND_PRINTK(2, warn, net_dbg_ratelimited("NA: invalid link-layer address length\n");
"NA: invalid link-layer address length\n");
return reason; return reason;
} }
} }
@ -1063,9 +1053,9 @@ static enum skb_drop_reason ndisc_recv_na(struct sk_buff *skb)
unsolicited advertisement. unsolicited advertisement.
*/ */
if (skb->pkt_type != PACKET_LOOPBACK) if (skb->pkt_type != PACKET_LOOPBACK)
ND_PRINTK(1, warn, net_warn_ratelimited("NA: %pM advertised our address %pI6c on %s!\n",
"NA: %pM advertised our address %pI6c on %s!\n", eth_hdr(skb)->h_source, &ifp->addr,
eth_hdr(skb)->h_source, &ifp->addr, ifp->idev->dev->name); ifp->idev->dev->name);
in6_ifa_put(ifp); in6_ifa_put(ifp);
return reason; return reason;
} }
@ -1152,7 +1142,7 @@ static enum skb_drop_reason ndisc_recv_rs(struct sk_buff *skb)
idev = __in6_dev_get(skb->dev); idev = __in6_dev_get(skb->dev);
if (!idev) { if (!idev) {
ND_PRINTK(1, err, "RS: can't find in6 device\n"); net_err_ratelimited("RS: can't find in6 device\n");
return reason; return reason;
} }
@ -1260,11 +1250,9 @@ static enum skb_drop_reason ndisc_router_discovery(struct sk_buff *skb)
optlen = (skb_tail_pointer(skb) - skb_transport_header(skb)) - optlen = (skb_tail_pointer(skb) - skb_transport_header(skb)) -
sizeof(struct ra_msg); sizeof(struct ra_msg);
ND_PRINTK(2, info, net_dbg_ratelimited("RA: %s, dev: %s\n", __func__, skb->dev->name);
"RA: %s, dev: %s\n",
__func__, skb->dev->name);
if (!(ipv6_addr_type(&ipv6_hdr(skb)->saddr) & IPV6_ADDR_LINKLOCAL)) { if (!(ipv6_addr_type(&ipv6_hdr(skb)->saddr) & IPV6_ADDR_LINKLOCAL)) {
ND_PRINTK(2, warn, "RA: source address is not link-local\n"); net_dbg_ratelimited("RA: source address is not link-local\n");
return reason; return reason;
} }
if (optlen < 0) if (optlen < 0)
@ -1272,15 +1260,14 @@ static enum skb_drop_reason ndisc_router_discovery(struct sk_buff *skb)
#ifdef CONFIG_IPV6_NDISC_NODETYPE #ifdef CONFIG_IPV6_NDISC_NODETYPE
if (skb->ndisc_nodetype == NDISC_NODETYPE_HOST) { if (skb->ndisc_nodetype == NDISC_NODETYPE_HOST) {
ND_PRINTK(2, warn, "RA: from host or unauthorized router\n"); net_dbg_ratelimited("RA: from host or unauthorized router\n");
return reason; return reason;
} }
#endif #endif
in6_dev = __in6_dev_get(skb->dev); in6_dev = __in6_dev_get(skb->dev);
if (!in6_dev) { if (!in6_dev) {
ND_PRINTK(0, err, "RA: can't find inet6 device for %s\n", net_err_ratelimited("RA: can't find inet6 device for %s\n", skb->dev->name);
skb->dev->name);
return reason; return reason;
} }
@ -1288,18 +1275,16 @@ static enum skb_drop_reason ndisc_router_discovery(struct sk_buff *skb)
return SKB_DROP_REASON_IPV6_NDISC_BAD_OPTIONS; return SKB_DROP_REASON_IPV6_NDISC_BAD_OPTIONS;
if (!ipv6_accept_ra(in6_dev)) { if (!ipv6_accept_ra(in6_dev)) {
ND_PRINTK(2, info, net_dbg_ratelimited("RA: %s, did not accept ra for dev: %s\n", __func__,
"RA: %s, did not accept ra for dev: %s\n", skb->dev->name);
__func__, skb->dev->name);
goto skip_linkparms; goto skip_linkparms;
} }
#ifdef CONFIG_IPV6_NDISC_NODETYPE #ifdef CONFIG_IPV6_NDISC_NODETYPE
/* skip link-specific parameters from interior routers */ /* skip link-specific parameters from interior routers */
if (skb->ndisc_nodetype == NDISC_NODETYPE_NODEFAULT) { if (skb->ndisc_nodetype == NDISC_NODETYPE_NODEFAULT) {
ND_PRINTK(2, info, net_dbg_ratelimited("RA: %s, nodetype is NODEFAULT, dev: %s\n", __func__,
"RA: %s, nodetype is NODEFAULT, dev: %s\n", skb->dev->name);
__func__, skb->dev->name);
goto skip_linkparms; goto skip_linkparms;
} }
#endif #endif
@ -1328,18 +1313,16 @@ static enum skb_drop_reason ndisc_router_discovery(struct sk_buff *skb)
send_ifinfo_notify = true; send_ifinfo_notify = true;
if (!READ_ONCE(in6_dev->cnf.accept_ra_defrtr)) { if (!READ_ONCE(in6_dev->cnf.accept_ra_defrtr)) {
ND_PRINTK(2, info, net_dbg_ratelimited("RA: %s, defrtr is false for dev: %s\n", __func__,
"RA: %s, defrtr is false for dev: %s\n", skb->dev->name);
__func__, skb->dev->name);
goto skip_defrtr; goto skip_defrtr;
} }
lifetime = ntohs(ra_msg->icmph.icmp6_rt_lifetime); lifetime = ntohs(ra_msg->icmph.icmp6_rt_lifetime);
if (lifetime != 0 && if (lifetime != 0 &&
lifetime < READ_ONCE(in6_dev->cnf.accept_ra_min_lft)) { lifetime < READ_ONCE(in6_dev->cnf.accept_ra_min_lft)) {
ND_PRINTK(2, info, net_dbg_ratelimited("RA: router lifetime (%ds) is too short: %s\n", lifetime,
"RA: router lifetime (%ds) is too short: %s\n", skb->dev->name);
lifetime, skb->dev->name);
goto skip_defrtr; goto skip_defrtr;
} }
@ -1349,8 +1332,7 @@ static enum skb_drop_reason ndisc_router_discovery(struct sk_buff *skb)
net = dev_net(in6_dev->dev); net = dev_net(in6_dev->dev);
if (!READ_ONCE(in6_dev->cnf.accept_ra_from_local) && if (!READ_ONCE(in6_dev->cnf.accept_ra_from_local) &&
ipv6_chk_addr(net, &ipv6_hdr(skb)->saddr, in6_dev->dev, 0)) { ipv6_chk_addr(net, &ipv6_hdr(skb)->saddr, in6_dev->dev, 0)) {
ND_PRINTK(2, info, net_dbg_ratelimited("RA from local address detected on dev: %s: default router ignored\n",
"RA from local address detected on dev: %s: default router ignored\n",
skb->dev->name); skb->dev->name);
goto skip_defrtr; goto skip_defrtr;
} }
@ -1369,8 +1351,7 @@ static enum skb_drop_reason ndisc_router_discovery(struct sk_buff *skb)
rt->fib6_nh->fib_nh_dev, NULL, rt->fib6_nh->fib_nh_dev, NULL,
&ipv6_hdr(skb)->saddr); &ipv6_hdr(skb)->saddr);
if (!neigh) { if (!neigh) {
ND_PRINTK(0, err, net_err_ratelimited("RA: %s got default router without neighbour\n",
"RA: %s got default router without neighbour\n",
__func__); __func__);
fib6_info_release(rt); fib6_info_release(rt);
return reason; return reason;
@ -1384,10 +1365,10 @@ static enum skb_drop_reason ndisc_router_discovery(struct sk_buff *skb)
rt = NULL; rt = NULL;
} }
ND_PRINTK(3, info, "RA: rt: %p lifetime: %d, metric: %d, for dev: %s\n", net_dbg_ratelimited("RA: rt: %p lifetime: %d, metric: %d, for dev: %s\n", rt, lifetime,
rt, lifetime, defrtr_usr_metric, skb->dev->name); defrtr_usr_metric, skb->dev->name);
if (!rt && lifetime) { if (!rt && lifetime) {
ND_PRINTK(3, info, "RA: adding default router\n"); net_dbg_ratelimited("RA: adding default router\n");
if (neigh) if (neigh)
neigh_release(neigh); neigh_release(neigh);
@ -1396,9 +1377,7 @@ static enum skb_drop_reason ndisc_router_discovery(struct sk_buff *skb)
skb->dev, pref, defrtr_usr_metric, skb->dev, pref, defrtr_usr_metric,
lifetime); lifetime);
if (!rt) { if (!rt) {
ND_PRINTK(0, err, net_err_ratelimited("RA: %s failed to add default route\n", __func__);
"RA: %s failed to add default route\n",
__func__);
return reason; return reason;
} }
@ -1406,8 +1385,7 @@ static enum skb_drop_reason ndisc_router_discovery(struct sk_buff *skb)
rt->fib6_nh->fib_nh_dev, NULL, rt->fib6_nh->fib_nh_dev, NULL,
&ipv6_hdr(skb)->saddr); &ipv6_hdr(skb)->saddr);
if (!neigh) { if (!neigh) {
ND_PRINTK(0, err, net_err_ratelimited("RA: %s got default router without neighbour\n",
"RA: %s got default router without neighbour\n",
__func__); __func__);
fib6_info_release(rt); fib6_info_release(rt);
return reason; return reason;
@ -1439,7 +1417,7 @@ static enum skb_drop_reason ndisc_router_discovery(struct sk_buff *skb)
fib6_metric_set(rt, RTAX_HOPLIMIT, fib6_metric_set(rt, RTAX_HOPLIMIT,
ra_msg->icmph.icmp6_hop_limit); ra_msg->icmph.icmp6_hop_limit);
} else { } else {
ND_PRINTK(2, warn, "RA: Got route advertisement with lower hop_limit than minimum\n"); net_dbg_ratelimited("RA: Got route advertisement with lower hop_limit than minimum\n");
} }
} }
@ -1495,8 +1473,7 @@ skip_linkparms:
lladdr = ndisc_opt_addr_data(ndopts.nd_opts_src_lladdr, lladdr = ndisc_opt_addr_data(ndopts.nd_opts_src_lladdr,
skb->dev); skb->dev);
if (!lladdr) { if (!lladdr) {
ND_PRINTK(2, warn, net_dbg_ratelimited("RA: invalid link-layer address length\n");
"RA: invalid link-layer address length\n");
goto out; goto out;
} }
} }
@ -1510,9 +1487,8 @@ skip_linkparms:
} }
if (!ipv6_accept_ra(in6_dev)) { if (!ipv6_accept_ra(in6_dev)) {
ND_PRINTK(2, info, net_dbg_ratelimited("RA: %s, accept_ra is false for dev: %s\n", __func__,
"RA: %s, accept_ra is false for dev: %s\n", skb->dev->name);
__func__, skb->dev->name);
goto out; goto out;
} }
@ -1520,8 +1496,7 @@ skip_linkparms:
if (!READ_ONCE(in6_dev->cnf.accept_ra_from_local) && if (!READ_ONCE(in6_dev->cnf.accept_ra_from_local) &&
ipv6_chk_addr(dev_net(in6_dev->dev), &ipv6_hdr(skb)->saddr, ipv6_chk_addr(dev_net(in6_dev->dev), &ipv6_hdr(skb)->saddr,
in6_dev->dev, 0)) { in6_dev->dev, 0)) {
ND_PRINTK(2, info, net_dbg_ratelimited("RA from local address detected on dev: %s: router info ignored.\n",
"RA from local address detected on dev: %s: router info ignored.\n",
skb->dev->name); skb->dev->name);
goto skip_routeinfo; goto skip_routeinfo;
} }
@ -1558,8 +1533,7 @@ skip_routeinfo:
#ifdef CONFIG_IPV6_NDISC_NODETYPE #ifdef CONFIG_IPV6_NDISC_NODETYPE
/* skip link-specific ndopts from interior routers */ /* skip link-specific ndopts from interior routers */
if (skb->ndisc_nodetype == NDISC_NODETYPE_NODEFAULT) { if (skb->ndisc_nodetype == NDISC_NODETYPE_NODEFAULT) {
ND_PRINTK(2, info, net_dbg_ratelimited("RA: %s, nodetype is NODEFAULT (interior routes), dev: %s\n",
"RA: %s, nodetype is NODEFAULT (interior routes), dev: %s\n",
__func__, skb->dev->name); __func__, skb->dev->name);
goto out; goto out;
} }
@ -1589,7 +1563,7 @@ skip_routeinfo:
} }
if (mtu < IPV6_MIN_MTU || mtu > skb->dev->mtu) { if (mtu < IPV6_MIN_MTU || mtu > skb->dev->mtu) {
ND_PRINTK(2, warn, "RA: invalid mtu: %d\n", mtu); net_dbg_ratelimited("RA: invalid mtu: %d\n", mtu);
} else if (READ_ONCE(in6_dev->cnf.mtu6) != mtu) { } else if (READ_ONCE(in6_dev->cnf.mtu6) != mtu) {
WRITE_ONCE(in6_dev->cnf.mtu6, mtu); WRITE_ONCE(in6_dev->cnf.mtu6, mtu);
fib6_metric_set(rt, RTAX_MTU, mtu); fib6_metric_set(rt, RTAX_MTU, mtu);
@ -1608,7 +1582,7 @@ skip_routeinfo:
} }
if (ndopts.nd_opts_tgt_lladdr || ndopts.nd_opts_rh) { if (ndopts.nd_opts_tgt_lladdr || ndopts.nd_opts_rh) {
ND_PRINTK(2, warn, "RA: invalid RA options\n"); net_dbg_ratelimited("RA: invalid RA options\n");
} }
out: out:
/* Send a notify if RA changed managed/otherconf flags or /* Send a notify if RA changed managed/otherconf flags or
@ -1636,15 +1610,13 @@ static enum skb_drop_reason ndisc_redirect_rcv(struct sk_buff *skb)
switch (skb->ndisc_nodetype) { switch (skb->ndisc_nodetype) {
case NDISC_NODETYPE_HOST: case NDISC_NODETYPE_HOST:
case NDISC_NODETYPE_NODEFAULT: case NDISC_NODETYPE_NODEFAULT:
ND_PRINTK(2, warn, net_dbg_ratelimited("Redirect: from host or unauthorized router\n");
"Redirect: from host or unauthorized router\n");
return reason; return reason;
} }
#endif #endif
if (!(ipv6_addr_type(&ipv6_hdr(skb)->saddr) & IPV6_ADDR_LINKLOCAL)) { if (!(ipv6_addr_type(&ipv6_hdr(skb)->saddr) & IPV6_ADDR_LINKLOCAL)) {
ND_PRINTK(2, warn, net_dbg_ratelimited("Redirect: source address is not link-local\n");
"Redirect: source address is not link-local\n");
return reason; return reason;
} }
@ -1705,15 +1677,13 @@ void ndisc_send_redirect(struct sk_buff *skb, const struct in6_addr *target)
} }
if (ipv6_get_lladdr(dev, &saddr_buf, IFA_F_TENTATIVE)) { if (ipv6_get_lladdr(dev, &saddr_buf, IFA_F_TENTATIVE)) {
ND_PRINTK(2, warn, "Redirect: no link-local address on %s\n", net_dbg_ratelimited("Redirect: no link-local address on %s\n", dev->name);
dev->name);
return; return;
} }
if (!ipv6_addr_equal(&ipv6_hdr(skb)->daddr, target) && if (!ipv6_addr_equal(&ipv6_hdr(skb)->daddr, target) &&
ipv6_addr_type(target) != (IPV6_ADDR_UNICAST|IPV6_ADDR_LINKLOCAL)) { ipv6_addr_type(target) != (IPV6_ADDR_UNICAST|IPV6_ADDR_LINKLOCAL)) {
ND_PRINTK(2, warn, net_dbg_ratelimited("Redirect: target address is not link-local unicast\n");
"Redirect: target address is not link-local unicast\n");
return; return;
} }
@ -1732,8 +1702,7 @@ void ndisc_send_redirect(struct sk_buff *skb, const struct in6_addr *target)
rt = dst_rt6_info(dst); rt = dst_rt6_info(dst);
if (rt->rt6i_flags & RTF_GATEWAY) { if (rt->rt6i_flags & RTF_GATEWAY) {
ND_PRINTK(2, warn, net_dbg_ratelimited("Redirect: destination is not a neighbour\n");
"Redirect: destination is not a neighbour\n");
goto release; goto release;
} }
@ -1746,8 +1715,7 @@ void ndisc_send_redirect(struct sk_buff *skb, const struct in6_addr *target)
if (dev->addr_len) { if (dev->addr_len) {
struct neighbour *neigh = dst_neigh_lookup(skb_dst(skb), target); struct neighbour *neigh = dst_neigh_lookup(skb_dst(skb), target);
if (!neigh) { if (!neigh) {
ND_PRINTK(2, warn, net_dbg_ratelimited("Redirect: no neigh for target address\n");
"Redirect: no neigh for target address\n");
goto release; goto release;
} }
@ -1848,14 +1816,12 @@ enum skb_drop_reason ndisc_rcv(struct sk_buff *skb)
__skb_push(skb, skb->data - skb_transport_header(skb)); __skb_push(skb, skb->data - skb_transport_header(skb));
if (ipv6_hdr(skb)->hop_limit != 255) { if (ipv6_hdr(skb)->hop_limit != 255) {
ND_PRINTK(2, warn, "NDISC: invalid hop-limit: %d\n", net_dbg_ratelimited("NDISC: invalid hop-limit: %d\n", ipv6_hdr(skb)->hop_limit);
ipv6_hdr(skb)->hop_limit);
return SKB_DROP_REASON_IPV6_NDISC_HOP_LIMIT; return SKB_DROP_REASON_IPV6_NDISC_HOP_LIMIT;
} }
if (msg->icmph.icmp6_code != 0) { if (msg->icmph.icmp6_code != 0) {
ND_PRINTK(2, warn, "NDISC: invalid ICMPv6 code: %d\n", net_dbg_ratelimited("NDISC: invalid ICMPv6 code: %d\n", msg->icmph.icmp6_code);
msg->icmph.icmp6_code);
return SKB_DROP_REASON_IPV6_NDISC_BAD_CODE; return SKB_DROP_REASON_IPV6_NDISC_BAD_CODE;
} }
@ -2006,8 +1972,7 @@ static int __net_init ndisc_net_init(struct net *net)
err = inet_ctl_sock_create(&sk, PF_INET6, err = inet_ctl_sock_create(&sk, PF_INET6,
SOCK_RAW, IPPROTO_ICMPV6, net); SOCK_RAW, IPPROTO_ICMPV6, net);
if (err < 0) { if (err < 0) {
ND_PRINTK(0, err, net_err_ratelimited("NDISC: Failed to initialize the control socket (err %d)\n",
"NDISC: Failed to initialize the control socket (err %d)\n",
err); err);
return err; return err;
} }