On 08/22/17 at 04:44am, Pingfan Liu wrote:
----- Original Message -----
> From: "Dave Young" <dyoung(a)redhat.com>
> To: "Pingfan Liu" <piliu(a)redhat.com>
> Cc: "Ziyue Yang" <ziyang(a)redhat.com>, kexec(a)lists.fedoraproject.org,
"Baoquan He" <bhe(a)redhat.com>
> Sent: Tuesday, August 22, 2017 3:36:37 PM
> Subject: Re: [PATCH v5 1/3] kdump-lib.sh: support link local ipv6 address with
interface name
>
> On 08/22/17 at 02:11am, Pingfan Liu wrote:
> >
> >
> >
> >
> > ----- Original Message -----
> > > From: "Ziyue Yang" <ziyang(a)redhat.com>
> > > To: "Xunlei Pang" <xlpang(a)redhat.com>
> > > Cc: kexec(a)lists.fedoraproject.org, "Baoquan He"
<bhe(a)redhat.com>
> > > Sent: Tuesday, August 22, 2017 11:34:19 AM
> > > Subject: Re: [PATCH v5 1/3] kdump-lib.sh: support link local ipv6 address
> > > with interface name
> > >
> > > Hi,
> > >
> > > On Tue, Aug 22, 2017 at 9:30 AM, Xunlei Pang < xpang(a)redhat.com >
wrote:
> > >
> > >
> > >
> > > On 08/22/2017 at 09:10 AM, Baoquan He wrote:
> > > > On 08/22/17 at 08:59am, Xunlei Pang wrote:
> > > >> On 08/21/2017 at 10:07 AM, Ziyue Yang wrote:
> > > >>>
> > > >>> On Fri, Aug 18, 2017 at 11:33 AM, Xunlei Pang <
xpang(a)redhat.com
> > > >>> <mailto:
> > > >>> xpang(a)redhat.com >> wrote:
> > > >>>
> > > >>> On 08/13/2017 at 05:41 PM, Ziyue Yang wrote:
> > > >>> > When dumping to ssh via local ipv6 address, the ssh
parameter
> > > >>> > in kdump.conf is supposed to have the form like
> > > >>> >
> > > >>> > ssh user@fe80::cc1:8bff:fe90:b95f%eth0
> > > >>> >
> > > >>> > where "%eth0" is an existing network interface
supporting ipv6.
> > > >>> >
> > > >>> > The get_remote_host function in kdump-lib.sh currently
> > > >>> > doesn't remove the network interface in the link
local ipv6
> > > >>> > addresses, causing the ip command in kdump_install_net
> > > >>> > function to fail, leading to a "Bad kdump
location" message.
> > > >>> >
> > > >>> > This commit
> > > >>> > 1) makes get_remote_host function remove network
interface
> > > >>> > in ipv6 addresses if there are any to support host
finding;
> > > >>> > 2) adds is_prefixed_ipv6_link_local function to detect
link local
> > > >>> > ipv6 address with 'kdump-' prefixed interface
name.
> > > >>> >
> > > >>> > Signed-off-by: Ziyue Yang < ziyang(a)redhat.com
<mailto:
> > > >>> > ziyang(a)redhat.com >>
> > > >>> > ---
> > > >>> > kdump-lib.sh | 12 ++++++++++++
> > > >>> > 1 file changed, 12 insertions(+)
> > > >>> >
> > > >>> > diff --git a/kdump-lib.sh b/kdump-lib.sh
> > > >>> > index 3f0af91..e67b28f 100755
> > > >>> > --- a/kdump-lib.sh
> > > >>> > +++ b/kdump-lib.sh
> > > >>> > @@ -312,6 +312,14 @@ is_ipv6_address()
> > > >>> > echo $1 | grep -q ":"
> > > >>> > }
> > > >>> >
> > > >>> > +is_prefixed_ipv6_link_local()
> > > >>> > +{
> > > >>> > + is_ipv6_address $1 && {
> > > >>> > + local _host_postfix=${1##*\%}
> > > >>> > + echo $_host_postfix | grep -q "^kdump-eth"
> > > >>> > + }
> > > >>> > +}
> > > >>> > +
> > > >>> > # get ip address or hostname from nfs/ssh config value
> > > >>> > get_remote_host()
> > > >>> > {
> > > >>> > @@ -323,6 +331,10 @@ get_remote_host()
> > > >>> > _config_val=${_config_val%:/*}
> > > >>> > _config_val=${_config_val#[}
> > > >>> > _config_val=${_config_val%]}
> > > >>> > + # factor out network inteface segment in local ipv6
address
> > > >>> > + if is_ipv6_address $_config_val; then
> > > >>> > + _config_val=${_config_val%\%*}
> > > >>> > + fi
> > > >>>
> > > >>> There is something unclear to me, why does ipv6 address need
an
> > > >>> interface
> > > >>> name followed?
> > > >>> We can see in kdump_install_net(), it uses "ip -o route
get to
> > > >>> $_server"
> > > >>> to acquire the
> > > >>> interface name, is there any chance that the name got is
different
> > > >>> from
> > > >>> that in "ssh"?
> > > >>>
> > > >>>
> > > >>> ssh related commands needs the interface name for routing,
since for
> > > >>> link
> > > >>> local ipv6 addresses there might be multiple interfaces that
could be
> > > >>> used for routing.
> > > >> That's what I concerned about, e.g. there are multiple
available
> > > >> routing,
> > > >> via eth0 or eth1.
> > > >> You specified eth1 for "ssh" in /etc/kdump.conf,
unfortunately
> > > >> kdump_install_net() gets
> > > >> eth0 as kdump's netdev from $(get_ip_route_field
"$_route" "dev"). Is
> > > >> this
> > > >> possible?
> > > > An available route entry must include destination ip and next hop
> > > > information, either next hop ip address, or interface to next hop.
> > > > Only a destination is not a complete route.
> > >
> > > I just simplified.
> > >
> > > To be specific, my question is that whether the netdev got from the route
> > > entry can be ensured
> > > to be the same as the one we specified in "ssh" directive,
because from
> > > the
> > > code we clearly see
> > > there are two different sources.
> > > Yes I agree.
> > > Since $1 in kdump_setup_ifname is promised to be an interface with valid
> > > route, maybe we can use the $1 in kdump_setup_ifname directly as the
> > > interface in the ssh_target related code?
> > >
> >
> > After testing, I found: "ip route get to link-local addr" just
returns the
> > default route-entry. It does not do some arp testing.
> > We can observe the packet by tcpdump, in that case, there is no packet.
> > Also given any invalid or non-exist link-local addr, the cmd always return
> > the default entry.
> >
> > To get the link-path for link-local addr, we should use "ip neigh"
cmd
>
> There are several ip route callback, should we fix all of them? Do we
> have a simple way to do it?
>
I am not sure, but most likely we can not simplify it. "ip route" is based on
routing table.
While "ip neigh" is based on neighbor's discovery protocol(L2 protocol),
which means the peer should be on the switch.
As for link-local addr, there is no subnet fields, I can not figure out how it is go
through routing table.
Versa vice, the problem based on routing-table can not be resolved by L2 info.
Since link local is only local addresses, do we really need these ip
route callback? Maybe we can skip them?
For the static route issue, is it a problem for link local?
Baoquan, do you have idea?
Regards,
Pingfan
> dracut-module-setup.sh: _gateway=$(ip $_ipv6_flag route list dev
> $_netdev | \
> dracut-module-setup.sh: /sbin/ip $_ipv6_flag route show | grep -v default
> | grep ".*via.* $_netdev " |\
> dracut-module-setup.sh:get_ip_route_field()
> dracut-module-setup.sh: _route=`/sbin/ip -o route get to $_server 2>&1`
> dracut-module-setup.sh: _srcaddr=$(get_ip_route_field "$_route"
"src")
> dracut-module-setup.sh: _netdev=$(get_ip_route_field "$_route"
"dev")
> dracut-module-setup.sh: netdev=$(/sbin/ip route get to ${tgt_ipaddr} | \
>
>
[...]
Thanks
Dave