There are two issues to do this:
Basically, the dtcps uses an interface dynamically within the interfaces specified by -i option. But, you can specify a particular interface for a user by 3rd field in routetable. For example, if your routetable has following line:
when user hoge connects to your dtcps, gif10 will be used for him explicitly.hoge 3ffe:505:9000::/48 gif10
Here, there shouldn't be same interface in routetable. Further, you need to pay attention to don't overlap with the interfaces specified by -i option. For example, if you specify `-i gif20', since the dtcps will try to use gif20 and later, you can specify gif0 - gif20 in routetable.
Both dtcpc and dtcps have -o option which prevent from destroying an interface. Since dtcpclient itself doesn't configure a tunnel, dtcpclient doesn't have such an option. But, you can specify cloned_interface_keep="YES" in dtcpclient_script.conf, instead.
Though ether dtcpc, dtcps and dtcpclient create necessary interface
dynamically, you may think it is too late.
It is a good idea to create necessary interfaces at boot.
Under FreeBSD, you can specify cloned_interfaces in /etc/rc.conf for
this purpose.
For example, if you want to provide gif0, gif1 and gif2 at boot,
you can specify it as follows:
cloned_interfaces="gif0 gif1 gif2"