(command.CommandList
  children: [
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:RUMPSRV)
          op: assign_op.Equal
          rhs: {<unix> <Id.Lit_Colon ':'> <'//r1'>}
          spids: [79]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:RUMPSRV1_2)
          op: assign_op.Equal
          rhs: {<unix> <Id.Lit_Colon ':'> <'//r12'>}
          spids: [84]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:RUMPCLI)
          op: assign_op.Equal
          rhs: {<unix> <Id.Lit_Colon ':'> <'//r2'>}
          spids: [89]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:RUMPSRV3)
          op: assign_op.Equal
          rhs: {<unix> <Id.Lit_Colon ':'> <'//r3'>}
          spids: [94]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:RUMPSRV4)
          op: assign_op.Equal
          rhs: {<unix> <Id.Lit_Colon ':'> <'//r4'>}
          spids: [99]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:IP6SRV)
          op: assign_op.Equal
          rhs: {<fc00> <Id.Lit_Colon ':'> <1> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <1>}
          spids: [104]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:IP6SRV1_2)
          op: assign_op.Equal
          rhs: {<fc00> <Id.Lit_Colon ':'> <1> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <2>}
          spids: [112]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:IP6SRV_PREFIX)
          op: assign_op.Equal
          rhs: {<fc00> <Id.Lit_Colon ':'> <1> <Id.Lit_Colon ':'>}
          spids: [120]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:IP6CLI)
          op: assign_op.Equal
          rhs: {<fc00> <Id.Lit_Colon ':'> <2> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <2>}
          spids: [126]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:IP6SRV3)
          op: assign_op.Equal
          rhs: {<fc00> <Id.Lit_Colon ':'> <3> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <1>}
          spids: [134]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:IP6SRV3_PREFIX)
          op: assign_op.Equal
          rhs: {<fc00> <Id.Lit_Colon ':'> <3> <Id.Lit_Colon ':'>}
          spids: [142]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:IP6SRV4)
          op: assign_op.Equal
          rhs: {<fc00> <Id.Lit_Colon ':'> <4> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <1>}
          spids: [148]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:IP6SRV4_PREFIX)
          op: assign_op.Equal
          rhs: {<fc00> <Id.Lit_Colon ':'> <4> <Id.Lit_Colon ':'>}
          spids: [156]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:PIDFILE)
          op: assign_op.Equal
          rhs: {<'./rump.rtadvd.pid'>}
          spids: [162]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:PIDFILE1_2)
          op: assign_op.Equal
          rhs: {<'./rump.rtadvd.pid12'>}
          spids: [165]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:PIDFILE3)
          op: assign_op.Equal
          rhs: {<'./rump.rtadvd.pid3'>}
          spids: [168]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:PIDFILE4)
          op: assign_op.Equal
          rhs: {<'./rump.rtadvd.pid4'>}
          spids: [171]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:CONFIG)
          op: assign_op.Equal
          rhs: {<'./rtadvd.conf'>}
          spids: [174]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:WAITTIME)
          op: assign_op.Equal
          rhs: {<2>}
          spids: [177]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:DEBUG)
          op: assign_op.Equal
          rhs: 
            {
              (braced_var_sub
                token: <Id.VSub_Name DEBUG>
                suffix_op: (suffix_op.Unary tok:<Id.VTest_ColonHyphen ':-'> arg_word:{<true>})
              )
            }
          spids: [180]
        )
      ]
    )
    (command.ShFunction
      name: init_server
      body: 
        (BraceGroup
          children: [
            (C {<export>} {<Id.Lit_VarLike 'RUMP_SERVER='> ($ Id.VSub_Number '$1')})
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<-o>} 
              {<match> <Id.Lit_Colon ':'> (SQ <'0.->.1'>)} {<rump.sysctl>} {<-w>} {<net.inet6.ip6.forwarding> <Id.Lit_Equals '='> <1>}
            )
            (C {<export>} {<Id.Lit_VarLike 'LD_PRELOAD='> <'/usr/lib/librumphijack.so'>})
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<mkdir>} {<-p>} 
              {<'/rump/var/chroot/rtadvd'>}
            )
            (C {<unset>} {<LD_PRELOAD>})
            (C {<unset>} {<RUMP_SERVER>})
          ]
        )
    )
    (command.ShFunction
      name: setup_shmif0
      body: 
        (BraceGroup
          children: [
            (C {<local>} {<Id.Lit_VarLike 'sock='> ($ Id.VSub_Number '$1')})
            (C {<local>} {<Id.Lit_VarLike 'IP6ADDR='> ($ Id.VSub_Number '$2')})
            (C {<rump_server_add_iface>} {($ Id.VSub_DollarName '$sock')} {<shmif0>} {<bus1>})
            (C {<export>} {<Id.Lit_VarLike 'RUMP_SERVER='> ($ Id.VSub_DollarName '$sock')})
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<rump.ifconfig>} 
              {<shmif0>} {<inet6>} {(${ Id.VSub_Name IP6ADDR)}
            )
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<rump.ifconfig>} 
              {<shmif0>} {<up>}
            )
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<rump.ifconfig>} 
              {<-w>} {<10>}
            )
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [(C {($ Id.VSub_DollarName '$DEBUG')}) (C {<rump.ifconfig>})]
            )
          ]
        )
    )
    (command.ShFunction
      name: wait_term
      body: 
        (BraceGroup
          children: [
            (C {<local>} {<Id.Lit_VarLike 'PIDFILE='> (${ Id.VSub_Number 1)})
            (C {<shift>})
            (command.WhileUntil
              keyword: <Id.KW_While while>
              cond: 
                (condition.Shell
                  commands: [
                    (C {<Id.Lit_LBracket '['>} {<-f>} {(${ Id.VSub_Name PIDFILE)} {<Id.Lit_RBracket ']'>})
                  ]
                )
              body: (command.DoGroup children:[(C {<sleep>} {<0.2>})])
            )
            (command.ControlFlow token:<Id.ControlFlow_Return return> arg_word:{<0>})
          ]
        )
    )
    (command.ShFunction
      name: create_rtadvdconfig
      body: 
        (BraceGroup
          children: [
            (command.Simple
              words: [{<cat>}]
              redirects: [
                (redir
                  op: <Id.Redir_DLess '<<'>
                  loc: (redir_loc.Fd fd:0)
                  arg: 
                    (redir_param.HereDoc
                      here_begin: {<_EOF>}
                      here_end_span_id: 430
                      stdin_parts: [<'shmif0:'> <'\t:mtu#1300:maxinterval#4:mininterval#3:\n'>]
                    )
                )
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {(${ Id.VSub_Name CONFIG)}
                )
              ]
              do_fork: T
            )
          ]
        )
    )
    (command.ShFunction
      name: start_rtadvd
      body: 
        (BraceGroup
          children: [
            (C {<local>} {<Id.Lit_VarLike 'sock='> ($ Id.VSub_Number '$1')})
            (C {<local>} {<Id.Lit_VarLike 'pidfile='> ($ Id.VSub_Number '$2')})
            (C {<export>} {<Id.Lit_VarLike 'RUMP_SERVER='> ($ Id.VSub_DollarName '$sock')})
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<rump.rtadvd>} 
              {<-c>} {(${ Id.VSub_Name CONFIG)} {<-p>} {($ Id.VSub_DollarName '$pidfile')} {<shmif0>}
            )
            (command.WhileUntil
              keyword: <Id.KW_While while>
              cond: 
                (condition.Shell
                  commands: [
                    (command.Sentence
                      child: 
                        (C {<Id.Lit_LBracket '['>} {<Id.KW_Bang '!'>} {<-f>} 
                          {($ Id.VSub_DollarName '$pidfile')} {<Id.Lit_RBracket ']'>}
                        )
                      terminator: <Id.Op_Semi _>
                    )
                  ]
                )
              body: (command.DoGroup children:[(C {<sleep>} {<0.2>})])
            )
            (C {<unset>} {<RUMP_SERVER>})
          ]
        )
    )
    (command.ShFunction
      name: check_entries
      body: 
        (BraceGroup
          children: [
            (C {<local>} {<Id.Lit_VarLike 'cli='> ($ Id.VSub_Number '$1')})
            (C {<local>} {<Id.Lit_VarLike 'srv='> ($ Id.VSub_Number '$2')})
            (C {<local>} {<Id.Lit_VarLike 'addr_prefix='> ($ Id.VSub_Number '$3')})
            (C {<local>} {<Id.Lit_VarLike 'mac_srv='>} {<Id.Lit_VarLike 'll_srv='>})
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:ll_srv)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (command_sub
                        left_token: <Id.Left_DollarParen '$('>
                        child: (C {<get_linklocal_addr>} {($ Id.VSub_DollarName '$srv')} {<shmif0>})
                      )
                    }
                  spids: [547]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:mac_srv)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (command_sub
                        left_token: <Id.Left_DollarParen '$('>
                        child: (C {<get_macaddr>} {($ Id.VSub_DollarName '$srv')} {<shmif0>})
                      )
                    }
                  spids: [557]
                )
              ]
            )
            (C {<export>} {<Id.Lit_VarLike 'RUMP_SERVER='> ($ Id.VSub_DollarName '$cli')})
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [(C {($ Id.VSub_DollarName '$DEBUG')}) (C {<dump_entries>})]
            )
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<-o>} 
              {<match> <Id.Lit_Colon ':'> (SQ <'if=shmif0'>)} {<rump.ndp>} {<-r>}
            )
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<-o>} 
              {<match> <Id.Lit_Colon ':'> (SQ <advertised>)} {<rump.ndp>} {<-p>}
            )
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<-o>} 
              {<match> <Id.Lit_Colon ':'> 
                (DQ (${ Id.VSub_Name ll_srv) <'%shmif0 '> <Id.Lit_BadBackslash '\\'> <'(reachable'> 
                  <Id.Lit_BadBackslash '\\'> <')'>
                )
              } {<rump.ndp>} {<-p>}
            )
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<-o>} 
              {<match> <Id.Lit_Colon ':'> (SQ <'linkmtu=1300'>)} {<rump.ndp>} {<-n>} {<-i>} {<shmif0>}
            )
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<-o>} 
              {<match> <Id.Lit_Colon ':'> 
                (DQ ($ Id.VSub_DollarName '$ll_srv') <'%shmif0 +'> ($ Id.VSub_DollarName '$mac_srv') 
                  <' +shmif0 +(23h59m|1d0h0m)..s S R'>
                )
              } {<rump.ndp>} {<-n>} {<-a>}
            )
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<-o>} 
              {<match> <Id.Lit_Colon ':'> ($ Id.VSub_DollarName '$addr_prefix')} {<rump.ndp>} {<-n>} {<-a>}
            )
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<-o>} 
              {<match> <Id.Lit_Colon ':'> 
                (DQ ($ Id.VSub_DollarName '$addr_prefix') <'.+<(TENTATIVE,)?AUTOCONF>'>)
              } {<rump.ifconfig>} {<shmif0>} {<inet6>}
            )
            (C {<unset>} {<RUMP_SERVER>})
          ]
        )
    )
    (command.ShFunction
      name: dump_entries
      body: 
        (BraceGroup
          children: [
            (C {<echo>} {<ndp>} {<-n>} {<-a>})
            (C {<rump.ndp>} {<-n>} {<-a>})
            (C {<echo>} {<ndp>} {<-p>})
            (C {<rump.ndp>} {<-p>})
            (C {<echo>} {<ndp>} {<-r>})
            (C {<rump.ndp>} {<-r>})
          ]
        )
    )
    (C {<atf_test_case>} {<ra_basic>} {<cleanup>})
    (command.ShFunction
      name: ra_basic_head
      body: 
        (BraceGroup
          children: [
            (C {<atf_set>} {(DQ <descr>)} 
              {(DQ <'Tests for basic functions of router advaertisement(RA)'>)}
            )
            (C {<atf_set>} {(DQ <require.progs>)} 
              {(DQ <'rump_server rump.rtadvd rump.ndp rump.ifconfig'>)}
            )
          ]
        )
    )
    (command.ShFunction
      name: ra_basic_body
      body: 
        (BraceGroup
          children: [
            (C {<rump_server_fs_start>} {($ Id.VSub_DollarName '$RUMPSRV')} {<netinet6>})
            (C {<rump_server_start>} {($ Id.VSub_DollarName '$RUMPCLI')} {<netinet6>})
            (C {<setup_shmif0>} {(${ Id.VSub_Name RUMPSRV)} {(${ Id.VSub_Name IP6SRV)})
            (C {<init_server>} {($ Id.VSub_DollarName '$RUMPSRV')})
            (C {<setup_shmif0>} {(${ Id.VSub_Name RUMPCLI)} {(${ Id.VSub_Name IP6CLI)})
            (C {<export>} {<Id.Lit_VarLike 'RUMP_SERVER='> (${ Id.VSub_Name RUMPCLI)})
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [(C {($ Id.VSub_DollarName '$DEBUG')}) (C {<rump.ndp>} {<-n>} {<-a>})]
            )
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<-o>} 
              {<match> <Id.Lit_Colon ':'> (SQ <'= 0'>)} {<rump.sysctl>} {<net.inet6.ip6.accept_rtadv>}
            )
            (C {<unset>} {<RUMP_SERVER>})
            (C {<create_rtadvdconfig>})
            (C {<start_rtadvd>} {($ Id.VSub_DollarName '$RUMPSRV')} {($ Id.VSub_DollarName '$PIDFILE')})
            (C {<sleep>} {($ Id.VSub_DollarName '$WAITTIME')})
            (C {<export>} {<Id.Lit_VarLike 'RUMP_SERVER='> (${ Id.VSub_Name RUMPCLI)})
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<-o>} {<empty>} 
              {<rump.ndp>} {<-r>}
            )
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<-o>} 
              {<not-match> <Id.Lit_Colon ':'> (SQ <advertised>)} {<rump.ndp>} {<-p>}
            )
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<-o>} 
              {<match> <Id.Lit_Colon ':'> (SQ <'linkmtu=0'>)} {<rump.ndp>} {<-n>} {<-i>} {<shmif0>}
            )
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<-o>} 
              {<not-match> <Id.Lit_Colon ':'> (SQ <'S R'>)} {<rump.ndp>} {<-n>} {<-a>}
            )
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<-o>} 
              {<not-match> <Id.Lit_Colon ':'> (SQ <'fc00:1:'>)} {<rump.ndp>} {<-n>} {<-a>}
            )
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<-o>} 
              {<not-match> <Id.Lit_Colon ':'> (SQ <'fc00:1:'>)} {<rump.ifconfig>} {<shmif0>} {<inet6>}
            )
            (C {<unset>} {<RUMP_SERVER>})
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<kill>} {<-TERM>} 
              {
                (command_sub
                  left_token: <Id.Left_Backtick '`'>
                  child: (C {<cat>} {(${ Id.VSub_Name PIDFILE)})
                )
              }
            )
            (C {<wait_term>} {(${ Id.VSub_Name PIDFILE)})
            (C {<export>} {<Id.Lit_VarLike 'RUMP_SERVER='> (${ Id.VSub_Name RUMPCLI)})
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<-o>} 
              {<match> <Id.Lit_Colon ':'> (SQ <'0.->.1'>)} {<rump.sysctl>} {<-w>} {<net.inet6.ip6.accept_rtadv> <Id.Lit_Equals '='> <1>}
            )
            (C {<unset>} {<RUMP_SERVER>})
            (C {<start_rtadvd>} {($ Id.VSub_DollarName '$RUMPSRV')} {($ Id.VSub_DollarName '$PIDFILE')})
            (C {<sleep>} {($ Id.VSub_DollarName '$WAITTIME')})
            (C {<check_entries>} {($ Id.VSub_DollarName '$RUMPCLI')} {($ Id.VSub_DollarName '$RUMPSRV')} 
              {($ Id.VSub_DollarName '$IP6SRV_PREFIX')}
            )
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<kill>} {<-TERM>} 
              {
                (command_sub
                  left_token: <Id.Left_Backtick '`'>
                  child: (C {<cat>} {(${ Id.VSub_Name PIDFILE)})
                )
              }
            )
            (C {<wait_term>} {(${ Id.VSub_Name PIDFILE)})
            (C {<rump_server_destroy_ifaces>})
          ]
        )
    )
    (command.ShFunction
      name: ra_basic_cleanup
      body: 
        (BraceGroup
          children: [
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (C {<Id.Lit_LBracket '['>} {<-f>} {(${ Id.VSub_Name PIDFILE)} 
                              {<Id.Lit_RBracket ']'>}
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [
                    (C {<kill>} {<-TERM>} 
                      {
                        (command_sub
                          left_token: <Id.Left_Backtick '`'>
                          child: (C {<cat>} {(${ Id.VSub_Name PIDFILE)})
                        )
                      }
                    )
                    (C {<wait_term>} {(${ Id.VSub_Name PIDFILE)})
                  ]
                  spids: [1246 1259]
                )
              ]
            )
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [(C {($ Id.VSub_DollarName '$DEBUG')}) (C {<dump>})]
            )
            (C {<cleanup>})
          ]
        )
    )
    (C {<atf_test_case>} {<ra_flush_prefix_entries>} {<cleanup>})
    (command.ShFunction
      name: ra_flush_prefix_entries_head
      body: 
        (BraceGroup
          children: [
            (C {<atf_set>} {(DQ <descr>)} {(DQ <'Tests for flushing prefixes (ndp -P)'>)})
            (C {<atf_set>} {(DQ <require.progs>)} 
              {(DQ <'rump_server rump.rtadvd rump.ndp rump.ifconfig'>)}
            )
          ]
        )
    )
    (command.ShFunction
      name: ra_flush_prefix_entries_body
      body: 
        (BraceGroup
          children: [
            (C {<rump_server_fs_start>} {($ Id.VSub_DollarName '$RUMPSRV')} {<netinet6>})
            (C {<rump_server_start>} {($ Id.VSub_DollarName '$RUMPCLI')} {<netinet6>})
            (C {<setup_shmif0>} {(${ Id.VSub_Name RUMPSRV)} {(${ Id.VSub_Name IP6SRV)})
            (C {<setup_shmif0>} {(${ Id.VSub_Name RUMPCLI)} {(${ Id.VSub_Name IP6CLI)})
            (C {<init_server>} {($ Id.VSub_DollarName '$RUMPSRV')})
            (C {<create_rtadvdconfig>})
            (C {<export>} {<Id.Lit_VarLike 'RUMP_SERVER='> (${ Id.VSub_Name RUMPCLI)})
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<-o>} 
              {<match> <Id.Lit_Colon ':'> (SQ <'0.->.1'>)} {<rump.sysctl>} {<-w>} {<net.inet6.ip6.accept_rtadv> <Id.Lit_Equals '='> <1>}
            )
            (C {<unset>} {<RUMP_SERVER>})
            (C {<start_rtadvd>} {($ Id.VSub_DollarName '$RUMPSRV')} {($ Id.VSub_DollarName '$PIDFILE')})
            (C {<sleep>} {($ Id.VSub_DollarName '$WAITTIME')})
            (C {<check_entries>} {($ Id.VSub_DollarName '$RUMPCLI')} {($ Id.VSub_DollarName '$RUMPSRV')} 
              {($ Id.VSub_DollarName '$IP6SRV_PREFIX')}
            )
            (C {<export>} {<Id.Lit_VarLike 'RUMP_SERVER='> (${ Id.VSub_Name RUMPCLI)})
            (C {<kill>} {<-KILL>} 
              {
                (command_sub
                  left_token: <Id.Left_Backtick '`'>
                  child: (C {<cat>} {(${ Id.VSub_Name PIDFILE)})
                )
              }
            )
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<rump.ndp>} 
              {<-P>}
            )
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [(C {($ Id.VSub_DollarName '$DEBUG')}) (C {<dump_entries>})]
            )
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<-o>} 
              {<match> <Id.Lit_Colon ':'> (SQ <'if=shmif0'>)} {<rump.ndp>} {<-r>}
            )
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<-o>} {<empty>} 
              {<rump.ndp>} {<-p>}
            )
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<-o>} 
              {<match> <Id.Lit_Colon ':'> (SQ <'linkmtu=1300'>)} {<rump.ndp>} {<-n>} {<-i>} {<shmif0>}
            )
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<-o>} 
              {<match> <Id.Lit_Colon ':'> (SQ <'(23h59m|1d0h0m)..s S R'>)} {<rump.ndp>} {<-n>} {<-a>}
            )
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<-o>} 
              {<match> <Id.Lit_Colon ':'> (SQ <'fc00:1:'>)} {<rump.ndp>} {<-n>} {<-a>}
            )
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<-o>} 
              {<not-match> <Id.Lit_Colon ':'> (SQ <'fc00:1:'>)} {<rump.ifconfig>} {<shmif0>} {<inet6>}
            )
            (C {<unset>} {<RUMP_SERVER>})
            (C {<rump_server_destroy_ifaces>})
          ]
        )
    )
    (command.ShFunction
      name: ra_flush_prefix_entries_cleanup
      body: 
        (BraceGroup
          children: [
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [(C {($ Id.VSub_DollarName '$DEBUG')}) (C {<dump>})]
            )
            (C {<cleanup>})
          ]
        )
    )
    (C {<atf_test_case>} {<ra_flush_defrouter_entries>} {<cleanup>})
    (command.ShFunction
      name: ra_flush_defrouter_entries_head
      body: 
        (BraceGroup
          children: [
            (C {<atf_set>} {(DQ <descr>)} {(DQ <'Tests for flushing default routers (ndp -R)'>)})
            (C {<atf_set>} {(DQ <require.progs>)} 
              {(DQ <'rump_server rump.rtadvd rump.ndp rump.ifconfig'>)}
            )
          ]
        )
    )
    (command.ShFunction
      name: ra_flush_defrouter_entries_body
      body: 
        (BraceGroup
          children: [
            (C {<rump_server_fs_start>} {($ Id.VSub_DollarName '$RUMPSRV')} {<netinet6>})
            (C {<rump_server_start>} {($ Id.VSub_DollarName '$RUMPCLI')} {<netinet6>})
            (C {<setup_shmif0>} {(${ Id.VSub_Name RUMPSRV)} {(${ Id.VSub_Name IP6SRV)})
            (C {<setup_shmif0>} {(${ Id.VSub_Name RUMPCLI)} {(${ Id.VSub_Name IP6CLI)})
            (C {<init_server>} {($ Id.VSub_DollarName '$RUMPSRV')})
            (C {<create_rtadvdconfig>})
            (C {<export>} {<Id.Lit_VarLike 'RUMP_SERVER='> (${ Id.VSub_Name RUMPCLI)})
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<-o>} 
              {<match> <Id.Lit_Colon ':'> (SQ <'0.->.1'>)} {<rump.sysctl>} {<-w>} {<net.inet6.ip6.accept_rtadv> <Id.Lit_Equals '='> <1>}
            )
            (C {<unset>} {<RUMP_SERVER>})
            (C {<start_rtadvd>} {($ Id.VSub_DollarName '$RUMPSRV')} {($ Id.VSub_DollarName '$PIDFILE')})
            (C {<sleep>} {($ Id.VSub_DollarName '$WAITTIME')})
            (C {<check_entries>} {($ Id.VSub_DollarName '$RUMPCLI')} {($ Id.VSub_DollarName '$RUMPSRV')} 
              {($ Id.VSub_DollarName '$IP6SRV_PREFIX')}
            )
            (C {<export>} {<Id.Lit_VarLike 'RUMP_SERVER='> (${ Id.VSub_Name RUMPCLI)})
            (C {<kill>} {<-KILL>} 
              {
                (command_sub
                  left_token: <Id.Left_Backtick '`'>
                  child: (C {<cat>} {(${ Id.VSub_Name PIDFILE)})
                )
              }
            )
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<rump.ndp>} 
              {<-R>}
            )
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [(C {($ Id.VSub_DollarName '$DEBUG')}) (C {<dump_entries>})]
            )
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<-o>} {<empty>} 
              {<rump.ndp>} {<-r>}
            )
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<-o>} 
              {<match> <Id.Lit_Colon ':'> (SQ <'No advertising router'>)} {<rump.ndp>} {<-p>}
            )
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<-o>} 
              {<match> <Id.Lit_Colon ':'> (SQ <'linkmtu=1300'>)} {<rump.ndp>} {<-n>} {<-i>} {<shmif0>}
            )
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<-o>} 
              {<match> <Id.Lit_Colon ':'> (SQ <'(23h59m|1d0h0m)..s S R'>)} {<rump.ndp>} {<-n>} {<-a>}
            )
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<-o>} 
              {<match> <Id.Lit_Colon ':'> (SQ <'fc00:1:'>)} {<rump.ndp>} {<-n>} {<-a>}
            )
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<-o>} 
              {<match> <Id.Lit_Colon ':'> (SQ <'fc00:1:'>)} {<rump.ifconfig>} {<shmif0>} {<inet6>}
            )
            (C {<unset>} {<RUMP_SERVER>})
            (C {<rump_server_destroy_ifaces>})
          ]
        )
    )
    (command.ShFunction
      name: ra_flush_defrouter_entries_cleanup
      body: 
        (BraceGroup
          children: [
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [(C {($ Id.VSub_DollarName '$DEBUG')}) (C {<dump>})]
            )
            (C {<cleanup>})
          ]
        )
    )
    (C {<atf_test_case>} {<ra_delete_address>} {<cleanup>})
    (command.ShFunction
      name: ra_delete_address_head
      body: 
        (BraceGroup
          children: [
            (C {<atf_set>} {(DQ <descr>)} {(DQ <'Tests for deleting auto-configured address'>)})
            (C {<atf_set>} {(DQ <require.progs>)} 
              {(DQ <'rump_server rump.rtadvd rump.ndp rump.ifconfig'>)}
            )
          ]
        )
    )
    (command.ShFunction
      name: ra_delete_address_body
      body: 
        (BraceGroup
          children: [
            (C {<rump_server_fs_start>} {($ Id.VSub_DollarName '$RUMPSRV')} {<netinet6>})
            (C {<rump_server_start>} {($ Id.VSub_DollarName '$RUMPCLI')} {<netinet6>})
            (C {<setup_shmif0>} {(${ Id.VSub_Name RUMPSRV)} {(${ Id.VSub_Name IP6SRV)})
            (C {<setup_shmif0>} {(${ Id.VSub_Name RUMPCLI)} {(${ Id.VSub_Name IP6CLI)})
            (C {<init_server>} {($ Id.VSub_DollarName '$RUMPSRV')})
            (C {<create_rtadvdconfig>})
            (C {<export>} {<Id.Lit_VarLike 'RUMP_SERVER='> (${ Id.VSub_Name RUMPCLI)})
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<-o>} 
              {<match> <Id.Lit_Colon ':'> (SQ <'0.->.1'>)} {<rump.sysctl>} {<-w>} {<net.inet6.ip6.accept_rtadv> <Id.Lit_Equals '='> <1>}
            )
            (C {<unset>} {<RUMP_SERVER>})
            (C {<start_rtadvd>} {($ Id.VSub_DollarName '$RUMPSRV')} {($ Id.VSub_DollarName '$PIDFILE')})
            (C {<sleep>} {($ Id.VSub_DollarName '$WAITTIME')})
            (C {<check_entries>} {($ Id.VSub_DollarName '$RUMPCLI')} {($ Id.VSub_DollarName '$RUMPSRV')} 
              {($ Id.VSub_DollarName '$IP6SRV_PREFIX')}
            )
            (C {<export>} {<Id.Lit_VarLike 'RUMP_SERVER='> (${ Id.VSub_Name RUMPCLI)})
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [(C {($ Id.VSub_DollarName '$DEBUG')}) (C {<rump.ifconfig>} {<shmif0>})]
            )
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<rump.ifconfig>} 
              {<shmif0>} {<inet6>} 
              {
                (command_sub
                  left_token: <Id.Left_DollarParen '$('>
                  child: 
                    (command.Pipeline
                      children: [
                        (C {<rump.ifconfig>} {<shmif0>})
                        (C {<awk>} {(SQ <'/AUTOCONF/ {print $2}'>)})
                      ]
                      negated: F
                    )
                )
              } {<delete>}
            )
            (C {<unset>} {<RUMP_SERVER>})
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<kill>} {<-TERM>} 
              {
                (command_sub
                  left_token: <Id.Left_Backtick '`'>
                  child: (C {<cat>} {(${ Id.VSub_Name PIDFILE)})
                )
              }
            )
            (C {<wait_term>} {(${ Id.VSub_Name PIDFILE)})
            (C {<rump_server_destroy_ifaces>})
          ]
        )
    )
    (command.ShFunction
      name: ra_delete_address_cleanup
      body: 
        (BraceGroup
          children: [
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (C {<Id.Lit_LBracket '['>} {<-f>} {(${ Id.VSub_Name PIDFILE)} 
                              {<Id.Lit_RBracket ']'>}
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [
                    (C {<kill>} {<-TERM>} 
                      {
                        (command_sub
                          left_token: <Id.Left_Backtick '`'>
                          child: (C {<cat>} {(${ Id.VSub_Name PIDFILE)})
                        )
                      }
                    )
                    (C {<wait_term>} {(${ Id.VSub_Name PIDFILE)})
                  ]
                  spids: [2309 2322]
                )
              ]
            )
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [(C {($ Id.VSub_DollarName '$DEBUG')}) (C {<dump>})]
            )
            (C {<cleanup>})
          ]
        )
    )
    (C {<atf_test_case>} {<ra_multiple_routers>} {<cleanup>})
    (command.ShFunction
      name: ra_multiple_routers_head
      body: 
        (BraceGroup
          children: [
            (C {<atf_set>} {(DQ <descr>)} {(DQ <'Tests for multiple routers'>)})
            (C {<atf_set>} {(DQ <require.progs>)} 
              {(DQ <'rump_server rump.rtadvd rump.ndp rump.ifconfig'>)}
            )
          ]
        )
    )
    (command.ShFunction
      name: ra_multiple_routers_body
      body: 
        (BraceGroup
          children: [
            (C {<local>} {<Id.Lit_VarLike 'n='>})
            (C {<rump_server_fs_start>} {($ Id.VSub_DollarName '$RUMPSRV')} {<netinet6>})
            (C {<rump_server_fs_start>} {($ Id.VSub_DollarName '$RUMPSRV3')} {<netinet6>})
            (C {<rump_server_start>} {($ Id.VSub_DollarName '$RUMPCLI')} {<netinet6>})
            (C {<setup_shmif0>} {(${ Id.VSub_Name RUMPSRV)} {(${ Id.VSub_Name IP6SRV)})
            (C {<setup_shmif0>} {(${ Id.VSub_Name RUMPSRV3)} {(${ Id.VSub_Name IP6SRV3)})
            (C {<setup_shmif0>} {(${ Id.VSub_Name RUMPCLI)} {(${ Id.VSub_Name IP6CLI)})
            (C {<init_server>} {($ Id.VSub_DollarName '$RUMPSRV')})
            (C {<init_server>} {($ Id.VSub_DollarName '$RUMPSRV3')})
            (C {<create_rtadvdconfig>})
            (C {<export>} {<Id.Lit_VarLike 'RUMP_SERVER='> (${ Id.VSub_Name RUMPCLI)})
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<-o>} 
              {<match> <Id.Lit_Colon ':'> (SQ <'0.->.1'>)} {<rump.sysctl>} {<-w>} {<net.inet6.ip6.accept_rtadv> <Id.Lit_Equals '='> <1>}
            )
            (C {<unset>} {<RUMP_SERVER>})
            (C {<start_rtadvd>} {($ Id.VSub_DollarName '$RUMPSRV')} {($ Id.VSub_DollarName '$PIDFILE')})
            (C {<start_rtadvd>} {($ Id.VSub_DollarName '$RUMPSRV3')} 
              {($ Id.VSub_DollarName '$PIDFILE3')}
            )
            (C {<sleep>} {($ Id.VSub_DollarName '$WAITTIME')})
            (C {<check_entries>} {($ Id.VSub_DollarName '$RUMPCLI')} {($ Id.VSub_DollarName '$RUMPSRV')} 
              {($ Id.VSub_DollarName '$IP6SRV_PREFIX')}
            )
            (C {<check_entries>} {($ Id.VSub_DollarName '$RUMPCLI')} 
              {($ Id.VSub_DollarName '$RUMPSRV3')} {($ Id.VSub_DollarName '$IP6SRV3_PREFIX')}
            )
            (C {<export>} {<Id.Lit_VarLike 'RUMP_SERVER='> ($ Id.VSub_DollarName '$RUMPCLI')})
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:n)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (command_sub
                        left_token: <Id.Left_DollarParen '$('>
                        child: 
                          (command.Pipeline
                            children: [
                              (C {<rump.ndp>} {<-p>})
                              (C {<grep>} {(SQ <'advertised by'>)})
                              (C {<wc>} {<-l>})
                            ]
                            negated: F
                          )
                      )
                    }
                  spids: [2573]
                )
              ]
            )
            (C {<atf_check_equal>} {($ Id.VSub_DollarName '$n')} {<2>})
            (C {<unset>} {<RUMP_SERVER>})
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<kill>} {<-TERM>} 
              {
                (command_sub
                  left_token: <Id.Left_Backtick '`'>
                  child: (C {<cat>} {(${ Id.VSub_Name PIDFILE)})
                )
              }
            )
            (C {<wait_term>} {(${ Id.VSub_Name PIDFILE)})
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<kill>} {<-TERM>} 
              {
                (command_sub
                  left_token: <Id.Left_Backtick '`'>
                  child: (C {<cat>} {(${ Id.VSub_Name PIDFILE3)})
                )
              }
            )
            (C {<wait_term>} {(${ Id.VSub_Name PIDFILE3)})
            (C {<rump_server_destroy_ifaces>})
          ]
        )
    )
    (command.ShFunction
      name: ra_multiple_routers_cleanup
      body: 
        (BraceGroup
          children: [
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (C {<Id.Lit_LBracket '['>} {<-f>} {(${ Id.VSub_Name PIDFILE)} 
                              {<Id.Lit_RBracket ']'>}
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [
                    (C {<kill>} {<-TERM>} 
                      {
                        (command_sub
                          left_token: <Id.Left_Backtick '`'>
                          child: (C {<cat>} {(${ Id.VSub_Name PIDFILE)})
                        )
                      }
                    )
                    (C {<wait_term>} {(${ Id.VSub_Name PIDFILE)})
                  ]
                  spids: [2680 2693]
                )
              ]
            )
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (C {<Id.Lit_LBracket '['>} {<-f>} {(${ Id.VSub_Name PIDFILE3)} 
                              {<Id.Lit_RBracket ']'>}
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [
                    (C {<kill>} {<-TERM>} 
                      {
                        (command_sub
                          left_token: <Id.Left_Backtick '`'>
                          child: (C {<cat>} {(${ Id.VSub_Name PIDFILE3)})
                        )
                      }
                    )
                    (C {<wait_term>} {(${ Id.VSub_Name PIDFILE3)})
                  ]
                  spids: [2721 2734]
                )
              ]
            )
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [(C {($ Id.VSub_DollarName '$DEBUG')}) (C {<dump>})]
            )
            (C {<cleanup>})
          ]
        )
    )
    (C {<atf_test_case>} {<ra_multiple_routers_single_prefix>} {<cleanup>})
    (command.ShFunction
      name: ra_multiple_routers_single_prefix_head
      body: 
        (BraceGroup
          children: [
            (C {<atf_set>} {(DQ <descr>)} {(DQ <'Tests for multiple routers with a single prefix'>)})
            (C {<atf_set>} {(DQ <require.progs>)} 
              {(DQ <'rump_server rump.rtadvd rump.ndp rump.ifconfig'>)}
            )
          ]
        )
    )
    (command.ShFunction
      name: ra_multiple_routers_single_prefix_body
      body: 
        (BraceGroup
          children: [
            (C {<local>} {<Id.Lit_VarLike 'n='>})
            (C {<rump_server_fs_start>} {($ Id.VSub_DollarName '$RUMPSRV')} {<netinet6>})
            (C {<rump_server_fs_start>} {($ Id.VSub_DollarName '$RUMPSRV1_2')} {<netinet6>})
            (C {<rump_server_start>} {($ Id.VSub_DollarName '$RUMPCLI')} {<netinet6>})
            (C {<setup_shmif0>} {(${ Id.VSub_Name RUMPSRV)} {(${ Id.VSub_Name IP6SRV)})
            (C {<setup_shmif0>} {(${ Id.VSub_Name RUMPSRV1_2)} {(${ Id.VSub_Name IP6SRV1_2)})
            (C {<setup_shmif0>} {(${ Id.VSub_Name RUMPCLI)} {(${ Id.VSub_Name IP6CLI)})
            (C {<init_server>} {($ Id.VSub_DollarName '$RUMPSRV')})
            (C {<init_server>} {($ Id.VSub_DollarName '$RUMPSRV1_2')})
            (C {<create_rtadvdconfig>})
            (C {<export>} {<Id.Lit_VarLike 'RUMP_SERVER='> (${ Id.VSub_Name RUMPCLI)})
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<-o>} 
              {<match> <Id.Lit_Colon ':'> (SQ <'0.->.1'>)} {<rump.sysctl>} {<-w>} {<net.inet6.ip6.accept_rtadv> <Id.Lit_Equals '='> <1>}
            )
            (C {<unset>} {<RUMP_SERVER>})
            (C {<start_rtadvd>} {($ Id.VSub_DollarName '$RUMPSRV')} {($ Id.VSub_DollarName '$PIDFILE')})
            (C {<start_rtadvd>} {($ Id.VSub_DollarName '$RUMPSRV1_2')} 
              {($ Id.VSub_DollarName '$PIDFILE1_2')}
            )
            (C {<sleep>} {($ Id.VSub_DollarName '$WAITTIME')})
            (C {<check_entries>} {($ Id.VSub_DollarName '$RUMPCLI')} {($ Id.VSub_DollarName '$RUMPSRV')} 
              {($ Id.VSub_DollarName '$IP6SRV_PREFIX')}
            )
            (C {<check_entries>} {($ Id.VSub_DollarName '$RUMPCLI')} 
              {($ Id.VSub_DollarName '$RUMPSRV1_2')} {($ Id.VSub_DollarName '$IP6SRV_PREFIX')}
            )
            (C {<export>} {<Id.Lit_VarLike 'RUMP_SERVER='> ($ Id.VSub_DollarName '$RUMPCLI')})
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:n)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (command_sub
                        left_token: <Id.Left_DollarParen '$('>
                        child: 
                          (command.Pipeline
                            children: [
                              (C {<rump.ndp>} {<-p>})
                              (C {<grep>} {(SQ <'advertised by'>)})
                              (C {<wc>} {<-l>})
                            ]
                            negated: F
                          )
                      )
                    }
                  spids: [2985]
                )
              ]
            )
            (C {<atf_check_equal>} {($ Id.VSub_DollarName '$n')} {<1>})
            (C {<unset>} {<RUMP_SERVER>})
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<kill>} {<-TERM>} 
              {
                (command_sub
                  left_token: <Id.Left_Backtick '`'>
                  child: (C {<cat>} {(${ Id.VSub_Name PIDFILE)})
                )
              }
            )
            (C {<wait_term>} {(${ Id.VSub_Name PIDFILE)})
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<kill>} {<-TERM>} 
              {
                (command_sub
                  left_token: <Id.Left_Backtick '`'>
                  child: (C {<cat>} {(${ Id.VSub_Name PIDFILE1_2)})
                )
              }
            )
            (C {<wait_term>} {(${ Id.VSub_Name PIDFILE1_2)})
            (C {<rump_server_destroy_ifaces>})
          ]
        )
    )
    (command.ShFunction
      name: ra_multiple_routers_single_prefix_cleanup
      body: 
        (BraceGroup
          children: [
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (C {<Id.Lit_LBracket '['>} {<-f>} {(${ Id.VSub_Name PIDFILE)} 
                              {<Id.Lit_RBracket ']'>}
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [
                    (C {<kill>} {<-TERM>} 
                      {
                        (command_sub
                          left_token: <Id.Left_Backtick '`'>
                          child: (C {<cat>} {(${ Id.VSub_Name PIDFILE)})
                        )
                      }
                    )
                    (C {<wait_term>} {(${ Id.VSub_Name PIDFILE)})
                  ]
                  spids: [3092 3105]
                )
              ]
            )
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (C {<Id.Lit_LBracket '['>} {<-f>} {(${ Id.VSub_Name PIDFILE1_2)} 
                              {<Id.Lit_RBracket ']'>}
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [
                    (C {<kill>} {<-TERM>} 
                      {
                        (command_sub
                          left_token: <Id.Left_Backtick '`'>
                          child: (C {<cat>} {(${ Id.VSub_Name PIDFILE1_2)})
                        )
                      }
                    )
                    (C {<wait_term>} {(${ Id.VSub_Name PIDFILE1_2)})
                  ]
                  spids: [3133 3146]
                )
              ]
            )
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [(C {($ Id.VSub_DollarName '$DEBUG')}) (C {<dump>})]
            )
            (C {<cleanup>})
          ]
        )
    )
    (C {<atf_test_case>} {<ra_multiple_routers_maxifprefixes>} {<cleanup>})
    (command.ShFunction
      name: ra_multiple_routers_maxifprefixes_head
      body: 
        (BraceGroup
          children: [
            (C {<atf_set>} {(DQ <descr>)} {(DQ <'Tests for exceeding the number of maximum prefixes'>)})
            (C {<atf_set>} {(DQ <require.progs>)} 
              {(DQ <'rump_server rump.rtadvd rump.ndp rump.ifconfig'>)}
            )
          ]
        )
    )
    (command.ShFunction
      name: ra_multiple_routers_maxifprefixes_body
      body: 
        (BraceGroup
          children: [
            (C {<local>} {<Id.Lit_VarLike 'n='>})
            (C {<rump_server_fs_start>} {($ Id.VSub_DollarName '$RUMPSRV')} {<netinet6>})
            (C {<rump_server_fs_start>} {($ Id.VSub_DollarName '$RUMPSRV3')} {<netinet6>})
            (C {<rump_server_fs_start>} {($ Id.VSub_DollarName '$RUMPSRV4')} {<netinet6>})
            (C {<rump_server_start>} {($ Id.VSub_DollarName '$RUMPCLI')} {<netinet6>})
            (C {<setup_shmif0>} {(${ Id.VSub_Name RUMPSRV)} {(${ Id.VSub_Name IP6SRV)})
            (C {<setup_shmif0>} {(${ Id.VSub_Name RUMPSRV3)} {(${ Id.VSub_Name IP6SRV3)})
            (C {<setup_shmif0>} {(${ Id.VSub_Name RUMPSRV4)} {(${ Id.VSub_Name IP6SRV4)})
            (C {<setup_shmif0>} {(${ Id.VSub_Name RUMPCLI)} {(${ Id.VSub_Name IP6CLI)})
            (C {<init_server>} {($ Id.VSub_DollarName '$RUMPSRV')})
            (C {<init_server>} {($ Id.VSub_DollarName '$RUMPSRV3')})
            (C {<init_server>} {($ Id.VSub_DollarName '$RUMPSRV4')})
            (C {<create_rtadvdconfig>})
            (C {<export>} {<Id.Lit_VarLike 'RUMP_SERVER='> (${ Id.VSub_Name RUMPCLI)})
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<-o>} 
              {<match> <Id.Lit_Colon ':'> (SQ <'0.->.1'>)} {<rump.sysctl>} {<-w>} {<net.inet6.ip6.accept_rtadv> <Id.Lit_Equals '='> <1>}
            )
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<-o>} 
              {<match> <Id.Lit_Colon ':'> (SQ <'16.->.2'>)} {<rump.sysctl>} {<-w>} {<net.inet6.ip6.maxifprefixes> <Id.Lit_Equals '='> <2>}
            )
            (C {<unset>} {<RUMP_SERVER>})
            (C {<start_rtadvd>} {($ Id.VSub_DollarName '$RUMPSRV')} {($ Id.VSub_DollarName '$PIDFILE')})
            (C {<start_rtadvd>} {($ Id.VSub_DollarName '$RUMPSRV3')} 
              {($ Id.VSub_DollarName '$PIDFILE3')}
            )
            (C {<sleep>} {($ Id.VSub_DollarName '$WAITTIME')})
            (C {<check_entries>} {($ Id.VSub_DollarName '$RUMPCLI')} {($ Id.VSub_DollarName '$RUMPSRV')} 
              {($ Id.VSub_DollarName '$IP6SRV_PREFIX')}
            )
            (C {<check_entries>} {($ Id.VSub_DollarName '$RUMPCLI')} 
              {($ Id.VSub_DollarName '$RUMPSRV3')} {($ Id.VSub_DollarName '$IP6SRV3_PREFIX')}
            )
            (C {<start_rtadvd>} {($ Id.VSub_DollarName '$RUMPSRV4')} 
              {($ Id.VSub_DollarName '$PIDFILE4')}
            )
            (C {<sleep>} {($ Id.VSub_DollarName '$WAITTIME')})
            (C {<export>} {<Id.Lit_VarLike 'RUMP_SERVER='> (${ Id.VSub_Name RUMPCLI)})
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [(C {($ Id.VSub_DollarName '$DEBUG')}) (C {<dump_entries>})]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:n)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (command_sub
                        left_token: <Id.Left_DollarParen '$('>
                        child: 
                          (command.Pipeline
                            children: [
                              (C {<rump.ndp>} {<-p>})
                              (C {<grep>} {(SQ <'advertised by'>)})
                              (C {<wc>} {<-l>})
                            ]
                            negated: F
                          )
                      )
                    }
                  spids: [3475]
                )
              ]
            )
            (C {<atf_check_equal>} {($ Id.VSub_DollarName '$n')} {<2>})
            (C {<unset>} {<RUMP_SERVER>})
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<kill>} {<-TERM>} 
              {
                (command_sub
                  left_token: <Id.Left_Backtick '`'>
                  child: (C {<cat>} {(${ Id.VSub_Name PIDFILE)})
                )
              }
            )
            (C {<wait_term>} {(${ Id.VSub_Name PIDFILE)})
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<kill>} {<-TERM>} 
              {
                (command_sub
                  left_token: <Id.Left_Backtick '`'>
                  child: (C {<cat>} {(${ Id.VSub_Name PIDFILE3)})
                )
              }
            )
            (C {<wait_term>} {(${ Id.VSub_Name PIDFILE3)})
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<kill>} {<-TERM>} 
              {
                (command_sub
                  left_token: <Id.Left_Backtick '`'>
                  child: (C {<cat>} {(${ Id.VSub_Name PIDFILE4)})
                )
              }
            )
            (C {<wait_term>} {(${ Id.VSub_Name PIDFILE4)})
            (C {<rump_server_destroy_ifaces>})
          ]
        )
    )
    (command.ShFunction
      name: ra_multiple_routers_maxifprefixes_cleanup
      body: 
        (BraceGroup
          children: [
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (C {<Id.Lit_LBracket '['>} {<-f>} {(${ Id.VSub_Name PIDFILE)} 
                              {<Id.Lit_RBracket ']'>}
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [
                    (C {<kill>} {<-TERM>} 
                      {
                        (command_sub
                          left_token: <Id.Left_Backtick '`'>
                          child: (C {<cat>} {(${ Id.VSub_Name PIDFILE)})
                        )
                      }
                    )
                    (C {<wait_term>} {(${ Id.VSub_Name PIDFILE)})
                  ]
                  spids: [3616 3629]
                )
              ]
            )
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (C {<Id.Lit_LBracket '['>} {<-f>} {(${ Id.VSub_Name PIDFILE3)} 
                              {<Id.Lit_RBracket ']'>}
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [
                    (C {<kill>} {<-TERM>} 
                      {
                        (command_sub
                          left_token: <Id.Left_Backtick '`'>
                          child: (C {<cat>} {(${ Id.VSub_Name PIDFILE3)})
                        )
                      }
                    )
                    (C {<wait_term>} {(${ Id.VSub_Name PIDFILE3)})
                  ]
                  spids: [3657 3670]
                )
              ]
            )
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (C {<Id.Lit_LBracket '['>} {<-f>} {(${ Id.VSub_Name PIDFILE4)} 
                              {<Id.Lit_RBracket ']'>}
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [
                    (C {<kill>} {<-TERM>} 
                      {
                        (command_sub
                          left_token: <Id.Left_Backtick '`'>
                          child: (C {<cat>} {(${ Id.VSub_Name PIDFILE4)})
                        )
                      }
                    )
                    (C {<wait_term>} {(${ Id.VSub_Name PIDFILE4)})
                  ]
                  spids: [3698 3711]
                )
              ]
            )
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [(C {($ Id.VSub_DollarName '$DEBUG')}) (C {<dump>})]
            )
            (C {<cleanup>})
          ]
        )
    )
    (C {<atf_test_case>} {<ra_temporary_address>} {<cleanup>})
    (command.ShFunction
      name: ra_temporary_address_head
      body: 
        (BraceGroup
          children: [
            (C {<atf_set>} {(DQ <descr>)} {(DQ <'Tests for IPv6 temporary address'>)})
            (C {<atf_set>} {(DQ <require.progs>)} 
              {(DQ <'rump_server rump.rtadvd rump.ndp rump.ifconfig'>)}
            )
          ]
        )
    )
    (command.ShFunction
      name: check_echo_request_pkt
      body: 
        (BraceGroup
          children: [
            (C {<local>} 
              {<Id.Lit_VarLike 'pkt='> 
                (DQ ($ Id.VSub_Number '$2') <' > '> ($ Id.VSub_Number '$3') <': .+ echo request'>)
              }
            )
            (command.Simple
              words: [{<extract_new_packets>} {($ Id.VSub_Number '$1')}]
              redirects: [(redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<'./out'>})]
              do_fork: T
            )
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (C {($ Id.VSub_DollarName '$DEBUG')})
                (C {<echo>} {($ Id.VSub_DollarName '$pkt')})
              ]
            )
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [(C {($ Id.VSub_DollarName '$DEBUG')}) (C {<cat>} {<'./out'>})]
            )
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<-o>} 
              {<match> <Id.Lit_Colon ':'> (DQ ($ Id.VSub_DollarName '$pkt'))} {<cat>} {<'./out'>}
            )
          ]
        )
    )
    (command.ShFunction
      name: ra_temporary_address_body
      body: 
        (BraceGroup
          children: [
            (C {<local>} {<Id.Lit_VarLike 'ip_auto='>} {<Id.Lit_VarLike 'ip_temp='>})
            (C {<rump_server_fs_start>} {($ Id.VSub_DollarName '$RUMPSRV')} {<netinet6>})
            (C {<rump_server_start>} {($ Id.VSub_DollarName '$RUMPCLI')} {<netinet6>})
            (C {<setup_shmif0>} {($ Id.VSub_DollarName '$RUMPSRV')} {($ Id.VSub_DollarName '$IP6SRV')})
            (C {<init_server>} {($ Id.VSub_DollarName '$RUMPSRV')})
            (C {<setup_shmif0>} {($ Id.VSub_DollarName '$RUMPCLI')} {($ Id.VSub_DollarName '$IP6CLI')})
            (C {<export>} {<Id.Lit_VarLike 'RUMP_SERVER='> ($ Id.VSub_DollarName '$RUMPCLI')})
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<-o>} 
              {<match> <Id.Lit_Colon ':'> (SQ <'0.->.1'>)} {<rump.sysctl>} {<-w>} {<net.inet6.ip6.accept_rtadv> <Id.Lit_Equals '='> <1>}
            )
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<-o>} 
              {<match> <Id.Lit_Colon ':'> (SQ <'0.->.1'>)} {<rump.sysctl>} {<-w>} {<net.inet6.ip6.use_tempaddr> <Id.Lit_Equals '='> <1>}
            )
            (C {<unset>} {<RUMP_SERVER>})
            (C {<create_rtadvdconfig>})
            (C {<start_rtadvd>} {($ Id.VSub_DollarName '$RUMPSRV')} {($ Id.VSub_DollarName '$PIDFILE')})
            (C {<sleep>} {($ Id.VSub_DollarName '$WAITTIME')})
            (C {<check_entries>} {($ Id.VSub_DollarName '$RUMPCLI')} {($ Id.VSub_DollarName '$RUMPSRV')} 
              {($ Id.VSub_DollarName '$IP6SRV_PREFIX')}
            )
            (C {<export>} {<Id.Lit_VarLike 'RUMP_SERVER='> ($ Id.VSub_DollarName '$RUMPCLI')})
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<-o>} 
              {<match> <Id.Lit_Colon ':'> 
                (DQ ($ Id.VSub_DollarName '$IP6SRV_PREFIX') <'.+<(TENTATIVE,)?AUTOCONF,TEMPORARY>'>)
              } {<rump.ifconfig>} {<shmif0>} {<inet6>}
            )
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<rump.ifconfig>} 
              {<-w>} {<10>}
            )
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [(C {($ Id.VSub_DollarName '$DEBUG')}) (C {<rump.ifconfig>} {<shmif0>})]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:ip_auto)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (command_sub
                        left_token: <Id.Left_DollarParen '$('>
                        child: 
                          (command.Pipeline
                            children: [
                              (C {<rump.ifconfig>} {<shmif0>})
                              (C {<awk>} {(SQ <'/<AUTOCONF>/ {sub(/\\/[0-9]*/, ""); print $2;}'>)})
                            ]
                            negated: F
                          )
                      )
                    }
                  spids: [4077]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:ip_temp)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (command_sub
                        left_token: <Id.Left_DollarParen '$('>
                        child: 
                          (command.Pipeline
                            children: [
                              (C {<rump.ifconfig>} {<shmif0>})
                              (C {<awk>} 
                                {(SQ <'/<AUTOCONF,TEMPORARY>/ {sub(/\\/[0-9]*/, ""); print $2;}'>)}
                              )
                            ]
                            negated: F
                          )
                      )
                    }
                  spids: [4092]
                )
              ]
            )
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (C {($ Id.VSub_DollarName '$DEBUG')})
                (C {<echo>} {($ Id.VSub_DollarName '$ip_auto')} {($ Id.VSub_DollarName '$ip_temp')})
              ]
            )
            (command.Simple
              words: [{<extract_new_packets>} {<bus1>}]
              redirects: [(redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<'/dev/null'>})]
              do_fork: T
            )
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<-o>} {<ignore>} 
              {<rump.ping6>} {<-n>} {<-X>} {<2>} {<-c>} {<1>} {($ Id.VSub_DollarName '$IP6SRV')}
            )
            (C {<check_echo_request_pkt>} {<bus1>} {($ Id.VSub_DollarName '$ip_auto')} 
              {($ Id.VSub_DollarName '$IP6SRV')}
            )
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<-o>} 
              {<match> <Id.Lit_Colon ':'> (SQ <'0.->.1'>)} {<rump.sysctl>} {<-w>} {<net.inet6.ip6.prefer_tempaddr> <Id.Lit_Equals '='> <1>}
            )
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<-o>} {<ignore>} 
              {<rump.ping6>} {<-n>} {<-X>} {<2>} {<-c>} {<1>} {($ Id.VSub_DollarName '$IP6SRV')}
            )
            (C {<check_echo_request_pkt>} {<bus1>} {($ Id.VSub_DollarName '$ip_temp')} 
              {($ Id.VSub_DollarName '$IP6SRV')}
            )
            (C {<unset>} {<RUMP_SERVER>})
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<kill>} {<-TERM>} 
              {
                (command_sub
                  left_token: <Id.Left_Backtick '`'>
                  child: (C {<cat>} {(${ Id.VSub_Name PIDFILE)})
                )
              }
            )
            (C {<wait_term>} {($ Id.VSub_DollarName '$PIDFILE')})
            (C {<rump_server_destroy_ifaces>})
          ]
        )
    )
    (command.ShFunction
      name: ra_temporary_address_cleanup
      body: 
        (BraceGroup
          children: [
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (C {<Id.Lit_LBracket '['>} {<-f>} {(${ Id.VSub_Name PIDFILE)} 
                              {<Id.Lit_RBracket ']'>}
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [
                    (C {<kill>} {<-TERM>} 
                      {
                        (command_sub
                          left_token: <Id.Left_Backtick '`'>
                          child: (C {<cat>} {(${ Id.VSub_Name PIDFILE)})
                        )
                      }
                    )
                    (C {<wait_term>} {(${ Id.VSub_Name PIDFILE)})
                  ]
                  spids: [4295 4308]
                )
              ]
            )
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [(C {($ Id.VSub_DollarName '$DEBUG')}) (C {<dump>})]
            )
            (C {<cleanup>})
          ]
        )
    )
    (command.ShFunction
      name: atf_init_test_cases
      body: 
        (BraceGroup
          children: [
            (C {<atf_add_test_case>} {<ra_basic>})
            (C {<atf_add_test_case>} {<ra_flush_prefix_entries>})
            (C {<atf_add_test_case>} {<ra_flush_defrouter_entries>})
            (C {<atf_add_test_case>} {<ra_delete_address>})
            (C {<atf_add_test_case>} {<ra_multiple_routers>})
            (C {<atf_add_test_case>} {<ra_multiple_routers_single_prefix>})
            (C {<atf_add_test_case>} {<ra_multiple_routers_maxifprefixes>})
            (C {<atf_add_test_case>} {<ra_temporary_address>})
          ]
        )
    )
  ]
)