Update: The source code is now refactored entirely.

Bugfixes:
---------
	Missing annotation succeeding gateway addr, before
rtrequest() is called.

	dst = lsp;
	netmask = lsp;
	gateway = nxthp;
	info->rti_ifa = ifa;

is changed by

	mrt->mrt_nh_ftn.sftn_len = sizeof(struct sockaddr_ftn); |
	mrt->mrt_nh_ftn.smpls_op = operation;                   |
                                    ---+------------------------+
in                                     |
                                       |
	dst = lsp;                     |
	netmask = lsp;                 |
	gateway = ifa->ifa_dstaddr;  <-+
	info->rti_ifa = ifa;

Use of rt_gateway as argumant of mpls_output().

	(*ifp->if_output)(ifp, m, rt->rt_gateway, ro);

Next operation:
---------------
	Starting testing of raw socket, now... and do some
bugfixes relating mpls_input(), e. g. push operation.
Implementation of penultimative hop popping (will be
enabled by sysctl() and controlled my rt_msg's).

Changes:
--------
	Fastpath routing from IP transit into MPLS cloud
implemented. Gateway address is modefied by

    /*
     * Socket address for
     * MPLS label binding.
     */
	struct sockaddr_ftn {
		u_char	sftn_len;
		u_char	sftn_family;	/* AF_XXX, where FEC is defined */
		uint16_t	_padding0;
		uint32_t	_padding[6];
		uint32_t	smpls_label; /* ingress label */
		uint32_t	smpls_vprd;	/* route distinguisher for VPLS */
	};

used to provide information about NH in MPLS transit. Suppose

struct rtentry {
	struct	radix_node rt_nodes[2];	< key >
	struct	sockaddr *rt_gateway;   < key, val, <P LSP, VPRD, OP >>
	int	rt_flags;
	int	rt_refcnt;
	struct	ifnet *rt_ifp;
	struct	ifaddr *rt_ifa;
	struct	rt_metrics_lite rt_rmx;
	u_int	rt_fibnum;
	struct	mtx rt_mtx;
 };

btw.

 +----------------+
 | FEC <=> RN_Key | e.g. 192.168.3.6 <=> destination
 +----------------+
                  |
                  + reference              .   + MPLS label (BoS)
                  |                        .   |
                  v                        .   v
                  +-------------+----------+-----+------+----+
 alloc'd memory:  | 192.168.3.6 | 10.6.1.6 | 666 | VPRD | Op |
                  +-------------+----------+-----+------+----+
                                        A
                                        |
                                        + rt_gateway <=> next hop

In rtentry{} by rt_gateway reffered memory which stores rn_key
and gateway address is extended by

	< P LSP, VPRT, Op >

by rt_setgate() and occours as

	< key, val, <P LSP, VPRD, Op >>

now. The MPLS label

	666

is pushed on stack by mpls_encap() during runtime of mpls_output().
This implies, transition from IP into MPLS transit is performed by
only ONE lookup of routing table.

This allows fine grained FEC-to-NHLFE mapping to different and or
unique FECs, until label space exceedes. Otherwise, if a label
is mapped to link layer interface, this results that any traffic
(from network layer) with different FECs is merged into a set
of aggregated routes.

BTW, raw socket is implemented for exception handling due to
received PDUs which are annotated by MPLS_LABEL_RTALERT.