code: func ifaceAddVLAN(iface *net.Interface, vlan *seesaw.VLAN) error {
  	name := fmt.Sprintf("%s.%d", iface.Name, vlan.ID)
  	err := ipRunIface(iface, "link add link %s name %s type vlan id %d", iface.Name, name, vlan.ID)
  	if err != nil {
  		return fmt.Errorf("Failed to create VLAN interface %q: %v", name, err)
  	}
  
  	vlanIface, err := net.InterfaceByName(name)
  	if err != nil {
  		return fmt.Errorf("Failed to find newly created VLAN interface %q: %v", name, err)
  	}
  
  	if err := sysctlInitIface(vlanIface.Name); err != nil {
  		return fmt.Errorf("Failed to initialise sysctls for VLAN interface %q: %v", name, err)
  	}
  
  	if vlan.IPv4Addr != nil {
  		if err := ifaceAddIPv4Addr(vlanIface, vlan.IPv4Addr, vlan.IPv4Mask); err != nil {
  			return fmt.Errorf("Failed to add %v to VLAN interface %q", vlan.IPv4Addr, name)
  		}
  	}
  	if vlan.IPv6Addr != nil {
  		if err := ifaceAddIPv6Addr(vlanIface, vlan.IPv6Addr, vlan.IPv6Mask); err != nil {
  			return fmt.Errorf("Failed to add %v to VLAN interface %q", vlan.IPv6Addr, name)
  		}
  	}
  
  	if iface.Flags&net.FlagUp == 0 {
  		return nil
  	}
  	return ifaceUp(vlanIface)
  }
docs: // ifaceAddVLAN creates a new VLAN interface on the given physical interface.