Problem description:
In if_vmove(), if_detach_internal() and if_attach_internal() are
called in series to detach and reattach the interface. When
detaching, if_delgroup() is called and the interface leaves all of
the group membership. And then upon attachment, if_addgroup(ifp,
IFG_ALL) is called and it joins only "all" group again.
This has a problem. Normally, a cloned interface automatically joins
a group whose name is ifc_name of the cloner in addition to "all"
upon creation. However, if_vmove() removes the membership and does
not restore upon attachment.
Implementation of fix:
- if_detach_internal() now accepts (struct if_clone **) as an additional argument to make it possible to save the cloner information.
- if_attach_internal() now accepts (struct if_clone *) to restore group membership of a cloned interface.