Jurgen,

J?rgen Keil wrote:
> Assuming I have a system with gldv3 ethernet nic, where the external link is 
> down,
> and the build 66 xen bits:  Shouldn't it be possible to communicate between a
> Solaris domU and the host Solaris dom0?

Yes, that path should be preserved when the physical link is down.

> It seems that (with build66 xen) the local network connection between domU 
> and dom0
> only works, when the external link is up (and IPMP is disabled).

Thanks for the report, yes it's a bug. The link state of the primary 
interface (in this case the interface plumbed by dom0) passed to DLS 
should be reported as being up if a VNIC is defined on the same NIC. I 
filed 6599495.

Thanks,
Nicolas.

> 
> Details:
> 
> Tecra S1 laptop, iprb and ipw nics, Solaris dom0, and Solaris domU.
> xen b66 bits, iprb glv3 nic driver copied from snv_71.
> 
> System is not connected to a network (at least not on iprb, ipw is unplumbed)
> 
> # dladm show-dev
> ipw0            link: up        speed:     0Mb  duplex: unknown
> iprb0           link: down      speed:     0Mb  duplex: half
> 
> # ifconfig -a
> lo0: flags=2001000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv4,VIRTUAL> mtu 8232 
> index 1
>         inet 127.0.0.1 netmask ff000000 
> iprb0: flags=201000803<UP,BROADCAST,MULTICAST,IPv4,CoS> mtu 1500 index 2
>         inet 192.168.2.21 netmask ffffff00 broadcast 192.168.2.255
>         groupname mobile
>         ether 0:a0:d1:d5:bc:b4 
> lo0: flags=2002000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv6,VIRTUAL> mtu 8252 
> index 1
>         inet6 ::1/128 
> iprb0: flags=202000800<MULTICAST,IPv6,CoS> mtu 1500 index 2
>         inet6 fe80::2a0:d1ff:fed5:bcb4/10 
>         groupname mobile
>         ether 0:a0:d1:d5:bc:b4 
> ipw0: flags=202100840<RUNNING,MULTICAST,ROUTER,IPv6,CoS> mtu 1500 index 3
>         inet6 fe80::204:23ff:fe4f:69bf/10 
>         ether 0:4:23:4f:69:bf 
> ipw0:1: flags=202180841<UP,RUNNING,MULTICAST,ADDRCONF,ROUTER,IPv6,CoS> mtu 
> 1500 index 3
>         inet6 fec0::2:204:23ff:fe4f:69bf/64 
> 
> # arp -an
> Net to Media Table: IPv4
> Device   IP Address               Mask      Flags      Phys Addr
> ------ -------------------- --------------- -------- ---------------
> iprb0  192.168.2.21         255.255.255.255 SPLdA    00:a0:d1:d5:bc:b4
> iprb0  224.0.0.0            240.0.0.0       SM       01:00:5e:00:00:00
> 
> Note: Flags 'd' for iprb0's 192.168.2.21 address:
> 
>            d    Unverified; this is a local IP  address  that  is
>                 currently undergoing Duplicate Address Detection.
>                 ARP will not respond to requests for this address
>                 until Duplicate Address Detection completes.
> 
> 
> Problem: no network connectivity from domU to dom0.  Test is an attempt to 
> telnet from
> domU to ip address 192.168.2.21 (ip address of iprb0 in dom0).
> 
> Problem #1:  
> ===========
> 
> arp requests from domU to dom0 are dropped by dom0. dtrace show this:
> 
> ...
>   0              -> putnext                   
>   0                -> ar_rput                 
>   0                 | ar_rput:rput_normal     
>   0                 | ar_rput:arp-physical-in-start 
>   0                 | ar_rput:arp-physical-in-end 
>   0                  -> ar_ce_resolve_all     
>   0                    -> ar_ce_hash          
>   0                    <- ar_ce_hash          returns d57bc35c
>   0                  <- ar_ce_resolve_all     returns 1
>   0                  -> ar_ce_lookup_entry    
>   0                   | ar_ce_lookup_entry:entry arl d7c05774, proto 800, 
> dst_paddr 192.168.2.21 plen 4
>   0                    -> ar_ce_hash          
>   0                    <- ar_ce_hash          returns d57bc450
>   0                  <- ar_ce_lookup_entry    returns e9586654
>   0                  -> bcmp                  
>   0                  <- bcmp                  returns 1
>   0                 | ar_rput:rput_request_unverified 
>   0                  -> freemsg               
>   0                    -> dblk_lastfree_desb  
>   0                      -> xnb_rx_complete   
>   0                        -> xnb_rx_schedule_unmop 
>   0                        <- xnb_rx_schedule_unmop returns e0687000
>   0                        -> xnb_rx_perform_pending_unmop 
>   0                          -> HYPERVISOR_grant_table_op 
>   0                          <- HYPERVISOR_grant_table_op returns 0
>   0                        <- xnb_rx_perform_pending_unmop returns 0
> ...
> 
> 
> usr/src/uts/common/inet/arp/arp.c:
> 
>   3280          /*
>   3281           * If the target is unverified by DAD, then one of two things 
> is true:
>   3282           * either it's someone else claiming this address (on a probe 
> or an
>   3283           * announcement) or it's just a regular request.  The former 
> is
>   3284           * failure, but a regular request is not.
>   3285           */
>   3286          if (dst_ace->ace_flags & ACE_F_UNVERIFIED) {
>   3287                  /*
>   3288                   * Check for a reflection.  Some misbehaving bridges 
> will
>   3289                   * reflect our own transmitted packets back to us.
>   3290                   */
>   3291                  if (hlen == dst_ace->ace_hw_addr_length &&
>   3292                      bcmp(src_haddr, dst_ace->ace_hw_addr, hlen) == 0) 
> {
>   3293                          DTRACE_PROBE3(rput_probe_reflected, arl_t *, 
> arl,
>   3294                              arh_t *, arh, ace_t *, dst_ace);
>   3295                          freeb(mp);
>   3296                          freemsg(mp1);
>   3297                          TRACE_2(TR_FAC_ARP, TR_ARP_RPUT_END,
>   3298                              "arp_rput_end: q %p (%S)", q, 
> "reflection");
>   3299                          return;
>   3300                  }
>   3301                  if (is_probe || op == ARP_RESPONSE) {
>   3302                          ar_client_notify(arl, mp1, AR_CN_FAILED);
>   3303                          ar_ce_delete(dst_ace);
>   3304                  } else if (err == AR_CHANGED) {
>   3305                          ar_client_notify(arl, mp1, AR_CN_ANNOUNCE);
>   3306                  } else {
>   3307                          DTRACE_PROBE3(rput_request_unverified, arl_t 
> *, arl,
>   3308                              arh_t *, arh, ace_t *, dst_ace);
>   3309                          freemsg(mp1);
>   3310                  }
>   3311                  freeb(mp);
>   3312                  TRACE_2(TR_FAC_ARP, TR_ARP_RPUT_END,
>   3313                      "arp_rput_end: q %p (%S)", q, "unverified");
>   3314                  return;
>   3315          }
> 
> Problem #2:
> ===========
> 
> ARP duplicate address detection can be disabled, but there still isn't
> "network" connectivity between domU and dom0:
> 
> # ndd -set /dev/arp arp_fastprobe_count 0
> # ifconfig iprb0 inet 0
> # ifconfig iprb0 inet max
> # arp -an
> Net to Media Table: IPv4
> Device   IP Address               Mask      Flags      Phys Addr
> ------ -------------------- --------------- -------- ---------------
> iprb0  192.168.2.21         255.255.255.255 SPLA     00:a0:d1:d5:bc:b4
> iprb0  224.0.0.0            240.0.0.0       SM       01:00:5e:00:00:00
> 
> 
> dtrace shows that we're now trying to xmit something, but the response
> messages seem to be dropped immediately in ar_xmit():
> 
>   0              -> putnext                   
>   0                -> ar_rput                 
>   0                 | ar_rput:rput_normal     
>   0                 | ar_rput:arp-physical-in-start 
>   0                 | ar_rput:arp-physical-in-end 
>   0                  -> ar_ce_resolve_all     
>   0                    -> ar_ce_hash          
>   0                    <- ar_ce_hash          returns d57bc35c
>   0                    -> ar_ce_resolve       
>   0                      -> bcmp              
>   0                      <- bcmp              returns 0
>   0                    <- ar_ce_resolve       returns 0
>   0                  <- ar_ce_resolve_all     returns 2
>   0                  -> ar_ce_lookup_entry    
>   0                   | ar_ce_lookup_entry:entry arl d7c05774, proto 800, 
> dst_paddr 192.168.2.21 plen 4
>   0                    -> ar_ce_hash          
>   0                    <- ar_ce_hash          returns d57bc450
>   0                  <- ar_ce_lookup_entry    returns e95861d4
>   0                  -> ddi_get_lbolt         
>   0                  <- ddi_get_lbolt         returns 767f2
>   0                  -> ar_xmit               
>   0                   | ar_xmit:entry         arl d7c05774 ap d78136c0 
> ap->ap_link_down 1
>   0                  <- ar_xmit               returns 3
>   0                  -> freemsg               
>   0                    -> dblk_lastfree       
>   0                      -> kmem_cache_free   
>   0                      <- kmem_cache_free   returns a4a1
>   0                    <- dblk_lastfree       returns a4a1
>   0                    -> dblk_lastfree_desb  
>   0                      -> xnb_rx_complete   
>   0                        -> xnb_rx_schedule_unmop 
>   0                        <- xnb_rx_schedule_unmop returns e0687000
> 
> It seems arp does not send replies because the iprb0 link is down:
> 
>   4271  /* ar_xmit is called to transmit an ARP Request or Response. */
>   4272  static void
>   4273  ar_xmit(arl_t *arl, uint32_t operation, uint32_t proto, uint32_t plen,
>   4274      const uchar_t *haddr1, const uchar_t *paddr1, const uchar_t 
> *haddr2,
>   4275      const uchar_t *paddr2, const uchar_t *dstaddr, arp_stack_t *as)
>   4276  {
>   4277          arh_t   *arh;
>   4278          uint8_t *cp;
>   4279          uint_t  hlen;
>   4280          mblk_t  *mp;
>   4281          arlphy_t *ap = arl->arl_phy;
>   4282
>   4283          if (ap == NULL) {
>   4284                  DTRACE_PROBE1(xmit_no_arl_phy, arl_t *, arl);
>   4285                  return;
>   4286          }
>   4287
>   4288          /* IFF_NOARP flag is set or link down: do not send arp 
> messages */
>   4289          if ((arl->arl_flags & ARL_F_NOARP) || ap->ap_link_down)
>   4290                  return;
>  
> 
> # mdb -k
> Loading modules: [ unix genunix specfs dtrace xpv_uppc scsi_vhci zfs random 
> ip hook neti sctp arp usba uhci s1394 nca fctl lofs audiosup md crypto fcip 
> fcp logindmux ptm ufs sppp nfs ipc ]
>> d78136c0::print arlphy_t  
> {
>     ap_arp_hw_type = 0x1
>     ap_arp_addr = 0xd7d2a528
>     ap_hw_addr = 0xd8c96d40
>     ap_hw_addrlen = 0x6
>     ap_xmit_mp = 0xd8c9a020
>     ap_xmit_addroff = 0x14
>     ap_xmit_sapoff = 0x1a
>     ap_saplen = 0xfffffffe
>     ap_defend_start = 0
>     ap_defend_count = 0
>     ap_notifies = 0x1
>     ap_link_down = 0x1
> }
>> d7c05774::print arl_t
> {
>     arl_next = 0
>     arl_rq = 0xd8c98e30
>     arl_wq = 0xd8c98eb0
>     arl_ppa = 0
>     arl_name = [ "iprb0" ]
>     arl_unbind_mp = 0xd4289a00
>     arl_detach_mp = 0
>     arl_provider_style = 0x500
>     arl_queue = 0
>     arl_queue_tail = 0
>     arl_flags = 0
>     arl_dlpi_pending = 0xffff
>     arl_dlpi_deferred = 0
>     arl_state = 0x2
>     arl_closing = 0
>     arl_index = 0x1
>     arl_phy = 0xd78136c0
> }
> 
> Problem #3:
> ===========
> 
> After connecting iprb0 to a switch; link is now up.  interface setup still 
> has a
> groupname.  Still no network connectivity between dom0 and domU.
> 
> # dladm show-dev
> ipw0            Link: up        speed:     0Mb  Duplex: unknown
> iprb0           Link: up        speed:   100Mb  Duplex: full
> vnic0           Link: unknown   speed:     0Mb  Duplex: unknown
> # ifconfig iprb0 group "abc"
> # ifconfig iprb0
> iprb0: flags=201000843<UP,BROADCAST,RUNNING,MULTICAST,IPv4,CoS> mtu 1500 
> index 2
>         inet 192.168.2.21 netmask ff000000 broadcast 192.255.255.255
>         groupname abc
>         ether 0:a0:d1:d5:bc:b4 
> 
> After deleting the groupname, it's finally possible to telnet from domU back
> into dom0...
>  
>  
> This message posted from opensolaris.org
> _______________________________________________
> crossbow-discuss mailing list
> crossbow-discuss at opensolaris.org
> http://mail.opensolaris.org/mailman/listinfo/crossbow-discuss

-- 
Nicolas Droux - Solaris Networking - Sun Microsystems, Inc.
droux at sun.com - http://blogs.sun.com/droux


Reply via email to