Currently we use pre-calculated headers inside the LLE entries as prepend data for if_output functions. Using these headers allows saving some CPU cycles/memory accesses on the fast path.
However, this approach makes adding L2 header for IPv4 traffic with IPv6 nexthops a bit complex, as we are not able to store multiple pre-calculated headers per lle. Additionally, the solution space is limited by the fact that PCB caching saves LLEs in addition to the nexthop.
Thus, add support for creating special "child" LLEs for the purpose of holding custom family encaps and store pending mbufs.
These LLEs are stored in a linked-list inside a "parent" (e.g. normal) LLE and are not visible when iterating LLE table.
They leverage RTF_STATIC logic, avoiding complex state machine used by the standard LLEs.
"Child" LLE lifetime is bound to the "parent" LLE lifetime - it is not possible to delete "child" LLE if parent is alive.
Note: the code below uses LLE_SF() macro which packs family and flags in a single int field. This is done to simplify merging back to stable/ branch. Once this code lands, most of the cases will be converted to use a dedicated family paremeter.