The source code is now refactored entirely, but untested.
Testing and debugging is not completed, yet.

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

    /*
     * Socket address for MPLS
     * ingress 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.2.1 <=> destination
 +----------------+
                  |
                  + reference              .   + MPLS label (BoS)
                  |                        .   |
                  v                        .   v
                  +-------------+----------+-----+------+----+
 alloc'd memory:  | 192.168.2.1 | 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.