route.c:

void ip6_route_input(struct sk_buff *skb)
	Ŭڤ dst_entry õơskb->dst 롣
- int strict					: daddr  type  (IPV6_ADDR_MULTICAST|IPV6_ADDR_LINKLOCAL) Ȥ &

- relookup:
- read_lock_bh(&rt6_lock)			: rw_lock_t rt6_lock  Ƥ ip6 fib ݸ

- fib6_lookup(&ip6_routing_table, &skb->nh.ipv6h->daddr, &skb->nh.ipv6h->saddr) : lookup_args  fib6_lookup_1()ƤӽФ
						: rt6_info  daddr  saddr Υݥ󥿤 lookup_args 
						: fib6_node  NULL || fn->fn_flags  RTN_TL_ROOT ʤ &ip6_routing_table ֤
  - fib6_lookup_1(root,args)			: Ҥ fn ޤǲꡢfn->fn_flags  RTN_ROOT Ǥʤ֡Ƥ fn ˰ܤäƤ
						: fn_flags  RTN_RTINFO ľ硢fn->leaf->rt6i_dst->addr  args->addr 
    - addr_bit_set(args->addr, fn->fn_bit)	: htonl(1 << ((~fn_bit)&0x1F)) & addr[fn_bit>>5]0  !0 ȽǤˤȤʤ
    - u32_prefix_cmp(&key->addr, args->addr, key->plen) : ץեåդ addr ӡƱʤ 0 ֤

- restart:
- rt = fn->leaf					: fib6_node  rt6_info
- if (rt->rt6i_flags & RTF_CACHE)		: RTF_CACHE ˰äȤip6_rt_policy == 0  RTF_FLOW դƤȤȤʬ
  - rt6_device_match(rt, skb->dev->ifindex, strict) : rt->rt6i_dev  skb->dev õդʤä硢
						: IFF_LOOPBACK Фstrict ͤ ip6_null_entry 
  - dst_clone(rt->u.dst)			: rt->u.dst->__refcnt ͤ 1 ä
    - atomic_inc(atomic_t *)
  - if (rt->rt6i_flags & RTF_FLOW)		: rt6_flow_match_in  0 ֤Ƥ֡rt  u.next éäƤ
  - rt6_flow_match_in(sptr, skb)		: ե륿 FLR_INPUT ǤʤΡskb ȥե륿ͤפʤΤ 0 ֤
    - frule = rt->rt6i_filter			: struct flow_filter *frule  NULL ʤ 1 frule->type  FLR_INPUT Ǥʤ 0 ֤
    - filter = frule->u.filter			: struct pkt_filter *filter ˥롼ơ(__u32 *)((skb->h.raw) + filter->offset) 
						: filter->value Ȥ ^ Ȥä filter->mask Ȥ & äơ0 ʳʤ 0 ֤

- BACKTRACK()					: rt == ip6_null_entry && strict ξ硢fn Υȥåפˤʤޤǡfn->fn_flags ͤ RTN_ROOT
						: ʤ dst_clone out: ˹ԤRTN_RTINFO ʤ restart: 

- if (ip6_rt_policy == 0)			: ݥꥷꤵƤ rt6_flow_lookup_in(rt, skb) ¹Ԥ
  - if (!rt->rt6i_nexthop && !(rt->rt6i_flags & RTF_NONEXTHOP): nexthop ̵RTF_NONEXTHOP ꤵƤʤȤ
    - read_unlock_bh(&rt6_lock)
    - rt6_cow(ort,daddr,saddr)			: ort Υԡäơdaddr / saddr(IPV6_SUBTREE && rt->rt6i_src.plen != 0) ꤷơ
						: 롼ƥ󥰥ơ֥ɲä롣ԡǤʤȤ ip6_null_entry ֤
      - rt = ip6_rt_copy(ort)			: ԡ
      - ipv6_addr_copy(&rt->rt6i_dst.addr,daddr): 襢ɥ쥹򥳥ԡrt6i_flags  RTF_GATEWAY ʤ rt6_gateway ˤ daddr 򥳥ԡ
      - rt->rt6i_nexthop = ndisc_get_neigh(rt->rt6i_dev, &rt->rt6i_gateway): rt6i_dev/rt6i_gateway Ǹ򸡺
      - dst_clone(&rt->u.dst)
      - rt6_ins(rt)				: ip6_routing_table  rt ɲä
        - fib6_add(root, rt)
    - if (rt->u.dst.error != -EEXIST || --attempts <= 0): åȤ route ͤùޤ줿硢relookup: 
						: (ʤȤξ)
    - dst_clone(&rt->u.dst)

- rt6_flow_lookup_in(rt, skb)			: rt  skb Ф rt6_info 뤫򸡺̵֤ ip6_null_entry ֤
  - arg.type = FL_ARG_FORWARD; arg.fl_u.skb = skb;: struct fl_acc_args 
  - rt6_flow_lookup(rt, daddr, saddr, args)	: frule->ops->accept ƤӽФơ˹礨 rt6_info ̵֤ ip6_null_entry
    - for (pol = rt6_pol_list; .. )		: struct pol_chain ˹礦ݥꥷ򸡺
      - fib6_lookup(pol->rules, daddr, saddr)	: pol->rules ʲǾ˹礦 fib6_node ֤
      - for (sprt = fn->leaf; .. )
        - frule = sprt->rt6i_flowr		: struct flow_rule 
        - res = frule->ops->accept(rt, sprt, args, &nrt): FLOWR_SELECT, _CLEAR, _NODECISION ֤
        - switch(res)				: FLOWR_SELECT ʤ found: ˡFLOWR_CLEAR ʤ鼡Υݥꥷ(pol->next)ءFLOWR_NODECISION
						: ʤ鼡 rt6_info(sprt->u.next) ذư
    - found:
    - dst_clone(&nrt->u.dst)
    - rt6_ins(nrt)

- out:
- read_unlock_bh(&rt6_lock)
- out2:
- rt->u.dst .. skb->dst = rt			: 
