Add scope zone id to the in_endpoints structure.
It is possible, that many remote hosts have equal link-local addresses,
but from different scope zones. Thus, they can have different tcp-specific
metrics. Add ip6_zoneid field in addition to ip6 address to hc_metrics
structure to be able handle this case.
* Replace hardcoded number of scopes count with macro.
* Simplify in6_addrscope() function.
* Add several new scope related functions:
 in6_getlinkifnet() returns pointer to struct ifnet, corresponding
  to given link-local scope zone id.
 in6_getscopezone() returns zone id for given scope.
 sa6_checkzone() checks given sockaddr_in6 structure for correctness
  of sin6_scope_id field.
Simplify tcp6_connect(). Also make in6_pcblookup_hash_locked() and
in6_pcbladdr() functions static.
Add zoneid argument to the in6_sockaddr() function.
Constify argument of in6_addrhash().
Add in6ifa_ifwithaddr() function.
It is similar to ifa_ifwithaddr, but uses in6_addr hash for fast lookup.
Some cleanups in in6_pcbbind():
* remove register keyword;
* sort variables declarations;
* use sa6_checkzone() to check sockaddr_in6 structure;
* use in6ifa_ifwithaddr() function;
* remove sa6_embedscope() call.
Initialize zoneid if src or dst address is from link-local scope.
Initialize zoneid.
Properly initialie sin6_scope_id.
Add XXX comment to handle sending to/from link-local address later.
Add scope zone id argument to in6_pcblookup_local function.
Add checks for scope zone id to pcb code.
Remove in6_pcbladdr() function:
* move code from in6_pcbladdr() into in6_pcbconnect_mbuf();
* remove sa6_embedscope() and use sa6_checkzone() instead;
* remove in6_setscope() call;
* pass outgoing interface determined with SAS algorithm into
in6_pcblookup_hash_locked() to be able determine scope zone id;
* initialize in6p_zoneid when connection has link-local address.
Add in6_srcaddrscope() function. It is similar to in6_addrscope(), but
returns link-local scope for IPv4-mapped addresses from 169.254/16 and
127/8 networks.
Rename lookup_addrsel_policy() into lookup_policy_label(). Now it
returns label insted of address policy.
* Add srcaddrcmp() function to compare addresses using SAS Algorithm;
* add srcaddr_choice and dstaddr_props structures to describe source
and destination addresses;
* remove old REPLACE, NEXT and BREAK macros;
Add cached_rtlookup() function. It validates route and if it is ok,
returns it. Otherwise it does new route lookup.
Add check_scopezones() function to check that source address doesn't
break destination scope zone.