http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/bd4bc025/server/src/com/cloud/network/guru/DirectNetworkGuru.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/guru/DirectNetworkGuru.java 
b/server/src/com/cloud/network/guru/DirectNetworkGuru.java
index b290c1d..d6a8812 100755
--- a/server/src/com/cloud/network/guru/DirectNetworkGuru.java
+++ b/server/src/com/cloud/network/guru/DirectNetworkGuru.java
@@ -42,7 +42,9 @@ import com.cloud.network.NetworkVO;
 import com.cloud.network.Networks.BroadcastDomainType;
 import com.cloud.network.Networks.Mode;
 import com.cloud.network.Networks.TrafficType;
+import com.cloud.network.PublicIpv6AddressVO;
 import com.cloud.network.dao.IPAddressDao;
+import com.cloud.network.dao.PublicIpv6AddressDao;
 import com.cloud.offering.NetworkOffering;
 import com.cloud.offerings.dao.NetworkOfferingDao;
 import com.cloud.user.Account;
@@ -72,6 +74,8 @@ public class DirectNetworkGuru extends AdapterBase implements 
NetworkGuru {
     IPAddressDao _ipAddressDao;
     @Inject
     NetworkOfferingDao _networkOfferingDao;
+    @Inject
+    PublicIpv6AddressDao _ipv6Dao;
     
     private static final TrafficType[] _trafficTypes = {TrafficType.Guest};
     
@@ -120,11 +124,20 @@ public class DirectNetworkGuru extends AdapterBase 
implements NetworkGuru {
                 throw new InvalidParameterValueException("cidr and gateway 
must be specified together.");
             }
 
+            if ((userSpecified.getIp6Cidr() == null && 
userSpecified.getIp6Gateway() != null) || (userSpecified.getIp6Cidr() != null 
&& userSpecified.getIp6Gateway() == null)) {
+                throw new InvalidParameterValueException("cidrv6 and gatewayv6 
must be specified together.");
+            }
+
             if (userSpecified.getCidr() != null) {
                 config.setCidr(userSpecified.getCidr());
                 config.setGateway(userSpecified.getGateway());
             }
 
+            if (userSpecified.getIp6Cidr() != null) {
+                config.setIp6Cidr(userSpecified.getIp6Cidr());
+                config.setIp6Gateway(userSpecified.getIp6Gateway());
+            }
+
             if (userSpecified.getBroadcastUri() != null) {
                 config.setBroadcastUri(userSpecified.getBroadcastUri());
                 config.setState(State.Setup);
@@ -137,6 +150,9 @@ public class DirectNetworkGuru extends AdapterBase 
implements NetworkGuru {
 
         boolean isSecurityGroupEnabled = 
_networkModel.areServicesSupportedByNetworkOffering(offering.getId(), 
Service.SecurityGroup);
         if (isSecurityGroupEnabled) {
+               if (userSpecified.getIp6Cidr() != null) {
+                throw new InvalidParameterValueException("Didn't support 
security group with IPv6");
+               }
             config.setName("SecurityGroupEnabledNetwork");
             config.setDisplayText("SecurityGroupEnabledNetwork");
         }
@@ -165,13 +181,13 @@ public class DirectNetworkGuru extends AdapterBase 
implements NetworkGuru {
 
         if (nic == null) {
             nic = new NicProfile(ReservationStrategy.Create, null, null, null, 
null);
-        } else if (nic.getIp4Address() == null) {
+        } else if (nic.getIp4Address() == null && nic.getIp6Address() == null) 
{
             nic.setStrategy(ReservationStrategy.Start);
         } else {
             nic.setStrategy(ReservationStrategy.Create);
         }
 
-        _networkMgr.allocateDirectIp(nic, dc, vm, network, 
nic.getRequestedIp());
+        _networkMgr.allocateDirectIp(nic, dc, vm, network, 
nic.getRequestedIpv4(), nic.getRequestedIpv6());
         nic.setStrategy(ReservationStrategy.Create);
 
         return nic;
@@ -180,8 +196,8 @@ public class DirectNetworkGuru extends AdapterBase 
implements NetworkGuru {
     @Override
     public void reserve(NicProfile nic, Network network, 
VirtualMachineProfile<? extends VirtualMachine> vm, DeployDestination dest, 
ReservationContext context)
             throws InsufficientVirtualNetworkCapcityException, 
InsufficientAddressCapacityException, ConcurrentOperationException {
-        if (nic.getIp4Address() == null) {
-            _networkMgr.allocateDirectIp(nic, dest.getDataCenter(), vm, 
network, null);
+        if (nic.getIp4Address() == null && nic.getIp6Address() == null) {
+            _networkMgr.allocateDirectIp(nic, dest.getDataCenter(), vm, 
network, null, null);
             nic.setStrategy(ReservationStrategy.Create);
         }
     }
@@ -202,14 +218,23 @@ public class DirectNetworkGuru extends AdapterBase 
implements NetworkGuru {
             s_logger.debug("Deallocate network: networkId: " + 
nic.getNetworkId() + ", ip: " + nic.getIp4Address());
         }
        
-        IPAddressVO ip = 
_ipAddressDao.findByIpAndSourceNetworkId(nic.getNetworkId(), 
nic.getIp4Address());
-        if (ip != null) {
-            Transaction txn = Transaction.currentTxn();
-            txn.start();
-            _networkMgr.markIpAsUnavailable(ip.getId());
-            _ipAddressDao.unassignIpAddress(ip.getId());
-            txn.commit();
-        }
+       if (nic.getIp4Address() != null) {
+               IPAddressVO ip = 
_ipAddressDao.findByIpAndSourceNetworkId(nic.getNetworkId(), 
nic.getIp4Address());
+               if (ip != null) {
+                       Transaction txn = Transaction.currentTxn();
+                       txn.start();
+                       _networkMgr.markIpAsUnavailable(ip.getId());
+                       _ipAddressDao.unassignIpAddress(ip.getId());
+                       txn.commit();
+               }
+       }
+       
+       if (nic.getIp6Address() != null) {
+               PublicIpv6AddressVO ip = 
_ipv6Dao.findByDcIdAndIp(network.getDataCenterId(), nic.getIp6Address());
+               if (ip != null) {
+                       _ipv6Dao.remove(ip.getId());
+               }
+       }
         nic.deallocate();
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/bd4bc025/server/src/com/cloud/network/guru/DirectPodBasedNetworkGuru.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/guru/DirectPodBasedNetworkGuru.java 
b/server/src/com/cloud/network/guru/DirectPodBasedNetworkGuru.java
index 8ca4547..709d280 100755
--- a/server/src/com/cloud/network/guru/DirectPodBasedNetworkGuru.java
+++ b/server/src/com/cloud/network/guru/DirectPodBasedNetworkGuru.java
@@ -96,7 +96,7 @@ public class DirectPodBasedNetworkGuru extends 
DirectNetworkGuru {
             rsStrategy = ReservationStrategy.Create;
         }
         
-        if (nic != null && nic.getRequestedIp() != null) {
+        if (nic != null && nic.getRequestedIpv4() != null) {
             throw new CloudRuntimeException("Does not support custom ip 
allocation at this time: " + nic);
         }
        

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/bd4bc025/server/src/com/cloud/network/guru/ExternalGuestNetworkGuru.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/guru/ExternalGuestNetworkGuru.java 
b/server/src/com/cloud/network/guru/ExternalGuestNetworkGuru.java
index f8a8a95..7a09d94 100644
--- a/server/src/com/cloud/network/guru/ExternalGuestNetworkGuru.java
+++ b/server/src/com/cloud/network/guru/ExternalGuestNetworkGuru.java
@@ -195,7 +195,7 @@ public class ExternalGuestNetworkGuru extends 
GuestNetworkGuru {
     public NicProfile allocate(Network config, NicProfile nic, 
VirtualMachineProfile<? extends VirtualMachine> vm) throws 
InsufficientVirtualNetworkCapcityException,
             InsufficientAddressCapacityException {
 
-        if 
(_networkModel.networkIsConfiguredForExternalNetworking(config.getDataCenterId(),
 config.getId()) && nic != null && nic.getRequestedIp() != null) {
+        if 
(_networkModel.networkIsConfiguredForExternalNetworking(config.getDataCenterId(),
 config.getId()) && nic != null && nic.getRequestedIpv4() != null) {
             throw new CloudRuntimeException("Does not support custom ip 
allocation at this time: " + nic);
         }
         

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/bd4bc025/server/src/com/cloud/network/guru/GuestNetworkGuru.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/guru/GuestNetworkGuru.java 
b/server/src/com/cloud/network/guru/GuestNetworkGuru.java
index 9587885..79ab87b 100755
--- a/server/src/com/cloud/network/guru/GuestNetworkGuru.java
+++ b/server/src/com/cloud/network/guru/GuestNetworkGuru.java
@@ -352,7 +352,7 @@ public abstract class GuestNetworkGuru extends AdapterBase 
implements NetworkGur
 
             String guestIp = null;
             if (network.getSpecifyIpRanges()) {
-                _networkMgr.allocateDirectIp(nic, dc, vm, network, 
nic.getRequestedIp());
+                _networkMgr.allocateDirectIp(nic, dc, vm, network, 
nic.getRequestedIpv4(), null);
             } else {
                 //if Vm is router vm and source nat is enabled in the network, 
set ip4 to the network gateway
                 boolean isGateway = false;
@@ -371,7 +371,7 @@ public abstract class GuestNetworkGuru extends AdapterBase 
implements NetworkGur
                 if (isGateway) {
                     guestIp = network.getGateway();
                 } else {
-                    guestIp = _networkMgr.acquireGuestIpAddress(network, 
nic.getRequestedIp());
+                    guestIp = _networkMgr.acquireGuestIpAddress(network, 
nic.getRequestedIpv4());
                     if (guestIp == null) {
                         throw new 
InsufficientVirtualNetworkCapcityException("Unable to acquire Guest IP" +
                                 " address for network " + network, 
DataCenter.class, dc.getId());

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/bd4bc025/server/src/com/cloud/network/guru/PodBasedNetworkGuru.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/guru/PodBasedNetworkGuru.java 
b/server/src/com/cloud/network/guru/PodBasedNetworkGuru.java
index b513325..bbe568d 100755
--- a/server/src/com/cloud/network/guru/PodBasedNetworkGuru.java
+++ b/server/src/com/cloud/network/guru/PodBasedNetworkGuru.java
@@ -100,7 +100,7 @@ public class PodBasedNetworkGuru extends AdapterBase 
implements NetworkGuru {
         assert trafficType == TrafficType.Management || trafficType == 
TrafficType.Storage: "Well, I can't take care of this config now can I? " + 
config; 
         
         if (nic != null) {
-            if (nic.getRequestedIp() != null) {
+            if (nic.getRequestedIpv4() != null) {
                 throw new CloudRuntimeException("Does not support custom ip 
allocation at this time: " + nic);
             }
             nic.setStrategy(nic.getIp4Address() != null ? 
ReservationStrategy.Create : ReservationStrategy.Start);

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/bd4bc025/server/src/com/cloud/network/guru/PublicNetworkGuru.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/guru/PublicNetworkGuru.java 
b/server/src/com/cloud/network/guru/PublicNetworkGuru.java
index ddee5a5..8e912d6 100755
--- a/server/src/com/cloud/network/guru/PublicNetworkGuru.java
+++ b/server/src/com/cloud/network/guru/PublicNetworkGuru.java
@@ -142,7 +142,7 @@ public class PublicNetworkGuru extends AdapterBase 
implements NetworkGuru {
 
         DataCenter dc = _dcDao.findById(network.getDataCenterId());       
 
-        if (nic != null && nic.getRequestedIp() != null) {
+        if (nic != null && nic.getRequestedIpv4() != null) {
             throw new CloudRuntimeException("Does not support custom ip 
allocation at this time: " + nic);
         }
 

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/bd4bc025/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
----------------------------------------------------------------------
diff --git 
a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java 
b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
index e1c78e1..c0e7888 100755
--- 
a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
+++ 
b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
@@ -1656,7 +1656,7 @@ public class VirtualNetworkApplianceManagerImpl 
implements VirtualNetworkApplian
                 }
             }
 
-            NicProfile gatewayNic = new NicProfile(defaultNetworkStartIp);
+            NicProfile gatewayNic = new NicProfile(defaultNetworkStartIp, 
null);
             if (setupPublicNetwork) {
                 if (isRedundant) {
                     
gatewayNic.setIp4Address(_networkMgr.acquireGuestIpAddress(guestNetwork, null));
@@ -3018,11 +3018,11 @@ public class VirtualNetworkApplianceManagerImpl 
implements VirtualNetworkApplian
     }
     
     private void createDhcpEntryCommand(VirtualRouter router, UserVm vm, NicVO 
nic, Commands cmds) {
-        DhcpEntryCommand dhcpCommand = new 
DhcpEntryCommand(nic.getMacAddress(), nic.getIp4Address(), vm.getHostName());
+        DhcpEntryCommand dhcpCommand = new 
DhcpEntryCommand(nic.getMacAddress(), nic.getIp4Address(), vm.getHostName(), 
nic.getIp6Address());
         DataCenterVO dcVo = 
_dcDao.findById(router.getDataCenterIdToDeployIn());
         String gatewayIp = findGatewayIp(vm.getId());
         boolean needGateway = true;
-        if (!gatewayIp.equals(nic.getGateway())) {
+        if (gatewayIp != null && !gatewayIp.equals(nic.getGateway())) {
             needGateway = false;
             GuestOSVO guestOS = _guestOSDao.findById(vm.getGuestOSId());
             // Do set dhcp:router option for non-default nic on certain 
OS(including Windows), and leave other OS unset.
@@ -3038,7 +3038,9 @@ public class VirtualNetworkApplianceManagerImpl 
implements VirtualNetworkApplian
             gatewayIp = "0.0.0.0";
         }
         dhcpCommand.setDefaultRouter(gatewayIp);
+        dhcpCommand.setIp6Gateway(nic.getIp6Gateway());
         dhcpCommand.setDefaultDns(findDefaultDnsIp(vm.getId()));
+        dhcpCommand.setDuid(NetUtils.getDuidLL(nic.getMacAddress()));
 
         dhcpCommand.setAccessDetail(NetworkElementCommand.ROUTER_IP, 
getRouterControlIp(router.getId()));
         dhcpCommand.setAccessDetail(NetworkElementCommand.ROUTER_NAME, 
router.getInstanceName());

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/bd4bc025/server/src/com/cloud/network/vpc/VpcManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/vpc/VpcManagerImpl.java 
b/server/src/com/cloud/network/vpc/VpcManagerImpl.java
index fa6bd30..26e882e 100644
--- a/server/src/com/cloud/network/vpc/VpcManagerImpl.java
+++ b/server/src/com/cloud/network/vpc/VpcManagerImpl.java
@@ -1884,7 +1884,7 @@ public class VpcManagerImpl implements VpcManager, 
Manager{
 
         //2) Create network
         Network guestNetwork = _ntwkMgr.createGuestNetwork(ntwkOffId, name, 
displayText, gateway, cidr, vlanId, 
-                networkDomain, owner, domainId, pNtwk, zoneId, aclType, 
subdomainAccess, vpcId);
+                networkDomain, owner, domainId, pNtwk, zoneId, aclType, 
subdomainAccess, vpcId, null, null);
 
         return guestNetwork;
     }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/bd4bc025/server/src/com/cloud/vm/NicVO.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/vm/NicVO.java 
b/server/src/com/cloud/vm/NicVO.java
index 64b9153..8e2edda 100644
--- a/server/src/com/cloud/vm/NicVO.java
+++ b/server/src/com/cloud/vm/NicVO.java
@@ -99,6 +99,12 @@ public class NicVO implements Nic {
     @Column(name = "default_nic")
     boolean defaultNic;
 
+    @Column(name = "ip6_gateway")
+    String ip6Gateway;
+
+    @Column(name = "ip6_cidr")
+    String ip6Cidr;
+
     @Column(name = "strategy")
     @Enumerated(value = EnumType.STRING)
     ReservationStrategy reservationStrategy;
@@ -156,6 +162,7 @@ public class NicVO implements Nic {
         this.defaultNic = defaultNic;
     }
 
+    @Override
     public String getIp6Address() {
         return ip6Address;
     }
@@ -324,4 +331,22 @@ public class NicVO implements Nic {
     public void setUuid(String uuid) {
        this.uuid = uuid;
     }
+
+    @Override
+       public String getIp6Gateway() {
+               return ip6Gateway;
+       }
+
+       public void setIp6Gateway(String ip6Gateway) {
+               this.ip6Gateway = ip6Gateway;
+       }
+
+    @Override
+       public String getIp6Cidr() {
+               return ip6Cidr;
+       }
+
+       public void setIp6Cidr(String ip6Cidr) {
+               this.ip6Cidr = ip6Cidr;
+       }
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/bd4bc025/server/src/com/cloud/vm/UserVmManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java 
b/server/src/com/cloud/vm/UserVmManagerImpl.java
index 5891056..870eecc 100644
--- a/server/src/com/cloud/vm/UserVmManagerImpl.java
+++ b/server/src/com/cloud/vm/UserVmManagerImpl.java
@@ -2184,7 +2184,7 @@ public class UserVmManagerImpl implements UserVmManager, 
UserVmService, Manager
                     s_logger.debug("Creating network for account " + owner + " 
from the network offering id=" +requiredOfferings.get(0).getId() + " as a part 
of deployVM process");
                     Network newNetwork = 
_networkMgr.createGuestNetwork(requiredOfferings.get(0).getId(),
                             owner.getAccountName() + "-network", 
owner.getAccountName() + "-network", null, null,
-                            null, null, owner, null, physicalNetwork, 
zone.getId(), ACLType.Account, null, null);
+                            null, null, owner, null, physicalNetwork, 
zone.getId(), ACLType.Account, null, null, null, null);
                     defaultNetwork = _networkDao.findById(newNetwork.getId());
                 } else if (virtualNetworks.size() > 1) {
                     throw new InvalidParameterValueException("More than 1 
default Isolated networks are found for account " + owner + "; please specify 
networkIds");
@@ -2372,13 +2372,13 @@ public class UserVmManagerImpl implements 
UserVmManager, UserVmService, Manager
                 requestedIp = requestedIps.get(network.getId());
             }
 
-            NicProfile profile = new NicProfile(requestedIp);
+            NicProfile profile = new NicProfile(requestedIp, null);
 
             if (defaultNetworkNumber == 0) {
                 defaultNetworkNumber++;
                 // if user requested specific ip for default network, add it
                 if (defaultNetworkIp != null) {
-                    profile = new NicProfile(defaultNetworkIp);
+                    profile = new NicProfile(defaultNetworkIp, null);
                 }
 
                 profile.setDefaultNic(true);
@@ -3543,7 +3543,7 @@ public class UserVmManagerImpl implements UserVmManager, 
UserVmService, Manager
                         requiredOfferings.get(0).getId() + " as a part of 
deployVM process");
                             Network newNetwork = 
_networkMgr.createGuestNetwork(requiredOfferings.get(0).getId(),
                                     newAccount.getAccountName() + "-network", 
newAccount.getAccountName() + "-network", null, null,
-                                    null, null, newAccount, null, 
physicalNetwork, zone.getId(), ACLType.Account, null, null);
+                                    null, null, newAccount, null, 
physicalNetwork, zone.getId(), ACLType.Account, null, null, null, null);
                             defaultNetwork = 
_networkDao.findById(newNetwork.getId());
                         } else if (virtualNetworks.size() > 1) {
                             throw new InvalidParameterValueException("More 
than 1 default Isolated networks are found " +

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/bd4bc025/server/test/com/cloud/network/MockNetworkManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/test/com/cloud/network/MockNetworkManagerImpl.java 
b/server/test/com/cloud/network/MockNetworkManagerImpl.java
index ef5b9c9..df409a8 100755
--- a/server/test/com/cloud/network/MockNetworkManagerImpl.java
+++ b/server/test/com/cloud/network/MockNetworkManagerImpl.java
@@ -247,7 +247,7 @@ public class MockNetworkManagerImpl implements 
NetworkManager, Manager, NetworkS
 
     @Override
     public Network createGuestNetwork(long networkOfferingId, String name, 
String displayText, String gateway, String cidr, String vlanId, String 
networkDomain, Account owner, Long domainId,
-            PhysicalNetwork physicalNetwork, long zoneId, ACLType aclType, 
Boolean subdomainAccess, Long vpcId) throws ConcurrentOperationException, 
InsufficientCapacityException, ResourceAllocationException {
+            PhysicalNetwork physicalNetwork, long zoneId, ACLType aclType, 
Boolean subdomainAccess, Long vpcId, String gatewayv6, String cidrv6) throws 
ConcurrentOperationException, InsufficientCapacityException, 
ResourceAllocationException {
         // TODO Auto-generated method stub
         return null;
     }
@@ -660,7 +660,7 @@ public class MockNetworkManagerImpl implements 
NetworkManager, Manager, NetworkS
      */
     @Override
     public void allocateDirectIp(NicProfile nic, DataCenter dc, 
VirtualMachineProfile<? extends VirtualMachine> vm,
-            Network network, String requestedIp) throws 
InsufficientVirtualNetworkCapcityException,
+            Network network, String requestedIpv4, String requestedIpv6) 
throws InsufficientVirtualNetworkCapcityException,
             InsufficientAddressCapacityException {
         // TODO Auto-generated method stub
         
@@ -818,4 +818,12 @@ public class MockNetworkManagerImpl implements 
NetworkManager, Manager, NetworkS
         // TODO Auto-generated method stub
         return null;
     }
+
+       @Override
+       public PublicIpv6Address assignPublicIp6Address(long dcId, Long podId,
+                       Account owner, VlanType type, Long networkId, String 
requestedIpv6,
+                       boolean isSystem) throws 
InsufficientAddressCapacityException {
+               // TODO Auto-generated method stub
+               return null;
+       }
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/bd4bc025/server/test/com/cloud/network/MockNetworkModelImpl.java
----------------------------------------------------------------------
diff --git a/server/test/com/cloud/network/MockNetworkModelImpl.java 
b/server/test/com/cloud/network/MockNetworkModelImpl.java
index 1771660..07c6247 100644
--- a/server/test/com/cloud/network/MockNetworkModelImpl.java
+++ b/server/test/com/cloud/network/MockNetworkModelImpl.java
@@ -806,4 +806,10 @@ public class MockNetworkModelImpl implements NetworkModel, 
Manager {
         return false;
     }
 
+       @Override
+       public Vlan getVlanForNetwork(long networkId) {
+               // TODO Auto-generated method stub
+               return null;
+       }
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/bd4bc025/server/test/com/cloud/vpc/MockConfigurationManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/test/com/cloud/vpc/MockConfigurationManagerImpl.java 
b/server/test/com/cloud/vpc/MockConfigurationManagerImpl.java
index 3989ecf..d0f0c62 100644
--- a/server/test/com/cloud/vpc/MockConfigurationManagerImpl.java
+++ b/server/test/com/cloud/vpc/MockConfigurationManagerImpl.java
@@ -493,7 +493,7 @@ public class MockConfigurationManagerImpl implements 
ConfigurationManager, Confi
      */
     @Override
     public Vlan createVlanAndPublicIpRange(long zoneId, long networkId, long 
physicalNetworkId, boolean forVirtualNetwork, Long podId, String startIP, 
String endIP, String vlanGateway, String vlanNetmask, String vlanId,
-            Account vlanOwner) throws InsufficientCapacityException, 
ConcurrentOperationException, InvalidParameterValueException {
+            Account vlanOwner, String startIPv6, String endIPv6, String 
vlanGatewayv6, String vlanCidrv6) throws InsufficientCapacityException, 
ConcurrentOperationException, InvalidParameterValueException {
         // TODO Auto-generated method stub
         return null;
     }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/bd4bc025/server/test/com/cloud/vpc/MockNetworkManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/test/com/cloud/vpc/MockNetworkManagerImpl.java 
b/server/test/com/cloud/vpc/MockNetworkManagerImpl.java
index b4e1794..13426e6 100644
--- a/server/test/com/cloud/vpc/MockNetworkManagerImpl.java
+++ b/server/test/com/cloud/vpc/MockNetworkManagerImpl.java
@@ -56,6 +56,7 @@ import com.cloud.network.PhysicalNetwork;
 import com.cloud.network.PhysicalNetworkServiceProvider;
 import com.cloud.network.PhysicalNetworkTrafficType;
 import com.cloud.network.PublicIpAddress;
+import com.cloud.network.PublicIpv6Address;
 import com.cloud.network.addr.PublicIp;
 import com.cloud.network.dao.NetworkServiceMapDao;
 import com.cloud.network.element.LoadBalancingServiceProvider;
@@ -846,7 +847,7 @@ public class MockNetworkManagerImpl implements 
NetworkManager, NetworkService, M
     @Override
     public Network createGuestNetwork(long networkOfferingId, String name, 
String displayText, String gateway,
             String cidr, String vlanId, String networkDomain, Account owner, 
Long domainId,
-            PhysicalNetwork physicalNetwork, long zoneId, ACLType aclType, 
Boolean subdomainAccess, Long vpcId)
+            PhysicalNetwork physicalNetwork, long zoneId, ACLType aclType, 
Boolean subdomainAccess, Long vpcId, String gatewayv6, String cidrv6)
             throws ConcurrentOperationException, 
InsufficientCapacityException, ResourceAllocationException {
         // TODO Auto-generated method stub
         return null;
@@ -1011,10 +1012,9 @@ public class MockNetworkManagerImpl implements 
NetworkManager, NetworkService, M
      */
     @Override
     public void allocateDirectIp(NicProfile nic, DataCenter dc, 
VirtualMachineProfile<? extends VirtualMachine> vm,
-            Network network, String requestedIp) throws 
InsufficientVirtualNetworkCapcityException,
+            Network network, String requestedIpv4, String requestedIpv6) 
throws InsufficientVirtualNetworkCapcityException,
             InsufficientAddressCapacityException {
         // TODO Auto-generated method stub
-        
     }
 
 
@@ -1313,10 +1313,6 @@ public class MockNetworkManagerImpl implements 
NetworkManager, NetworkService, M
         return null;
     }
 
-
-
-
-
     /* (non-Javadoc)
      * @see com.cloud.network.NetworkService#getNetwork(java.lang.String)
      */
@@ -1325,4 +1321,12 @@ public class MockNetworkManagerImpl implements 
NetworkManager, NetworkService, M
         // TODO Auto-generated method stub
         return null;
     }
+
+       @Override
+       public PublicIpv6Address assignPublicIp6Address(long dcId, Long podId,
+                       Account owner, VlanType type, Long networkId, String 
requestedIpv6,
+                       boolean isSystem) throws 
InsufficientAddressCapacityException {
+               // TODO Auto-generated method stub
+               return null;
+       }
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/bd4bc025/setup/db/create-schema.sql
----------------------------------------------------------------------
diff --git a/setup/db/create-schema.sql b/setup/db/create-schema.sql
index 174f53c..db3a8a5 100755
--- a/setup/db/create-schema.sql
+++ b/setup/db/create-schema.sql
@@ -207,6 +207,8 @@ CREATE TABLE `cloud`.`networks` (
   `broadcast_uri` varchar(255) COMMENT 'broadcast domain specifier',
   `gateway` varchar(15) COMMENT 'gateway for this network configuration',
   `cidr` varchar(18) COMMENT 'network cidr', 
+  `ip6_gateway` varchar(50) COMMENT 'IPv6 gateway for this network', 
+  `ip6_cidr` varchar(50) COMMENT 'IPv6 cidr for this network',
   `mode` varchar(32) COMMENT 'How to retrieve ip address in this network',
   `network_offering_id` bigint unsigned NOT NULL COMMENT 'network offering id 
that this configuration is created from',
   `physical_network_id` bigint unsigned COMMENT 'physical network id that this 
configuration is based on',
@@ -270,6 +272,8 @@ CREATE TABLE `cloud`.`nics` (
   `update_time` timestamp NOT NULL COMMENT 'time the state was changed',
   `isolation_uri` varchar(255) COMMENT 'id for isolation',
   `ip6_address` char(40) COMMENT 'ip6 address',
+  `ip6_gateway` varchar(50) COMMENT 'gateway for ip6 address',
+  `ip6_cidr` varchar(50) COMMENT 'cidr for ip6 address',
   `default_nic` tinyint NOT NULL COMMENT "None", 
   `vm_type` varchar(32) COMMENT 'type of vm: System or User vm',
   `created` datetime NOT NULL COMMENT 'date created',
@@ -500,7 +504,10 @@ CREATE TABLE `cloud`.`vlan` (
   `vlan_id` varchar(255),
   `vlan_gateway` varchar(255),
   `vlan_netmask` varchar(255),
+  `ip6_gateway` varchar(255),
+  `ip6_cidr` varchar(255),
   `description` varchar(255),
+  `ip6_range` varchar(255),
   `vlan_type` varchar(255),
   `data_center_id` bigint unsigned NOT NULL,
   `network_id` bigint unsigned NOT NULL COMMENT 'id of corresponding network 
offering',
@@ -2543,5 +2550,30 @@ INSERT INTO `cloud`.`counter` (id, uuid, source, name, 
value,created) VALUES (2,
 INSERT INTO `cloud`.`counter` (id, uuid, source, name, value,created) VALUES 
(3, UUID(), 'snmp','Linux CPU Idle - percentage', '1.3.6.1.4.1.2021.11.11.0', 
now());
 INSERT INTO `cloud`.`counter` (id, uuid, source, name, value,created) VALUES 
(100, UUID(), 'netscaler','Response Time - microseconds', 'RESPTIME', now());
 
+CREATE TABLE  `cloud`.`public_ipv6_address` (
+  `id` bigint unsigned NOT NULL UNIQUE auto_increment,
+  `uuid` varchar(40),
+  `account_id` bigint unsigned NULL,
+  `domain_id` bigint unsigned NULL,
+  `ip_address` char(50) NOT NULL,
+  `data_center_id` bigint unsigned NOT NULL COMMENT 'zone that it belongs to',
+  `vlan_id` bigint unsigned NOT NULL,
+  `state` char(32) NOT NULL default 'Free' COMMENT 'state of the ip address',
+  `mac_address` varchar(40) NOT NULL COMMENT 'mac address of this ip',
+  `source_network_id` bigint unsigned NOT NULL COMMENT 'network id ip belongs 
to',
+  `network_id` bigint unsigned COMMENT 'network this public ip address is 
associated with',
+  `physical_network_id` bigint unsigned NOT NULL COMMENT 'physical network id 
that this configuration is based on',
+  `created` datetime NULL COMMENT 'Date this ip was allocated to someone',
+  PRIMARY KEY (`id`),
+  UNIQUE (`ip_address`, `source_network_id`),
+  CONSTRAINT `fk_public_ipv6_address__source_network_id` FOREIGN KEY 
(`source_network_id`) REFERENCES `networks`(`id`),
+  CONSTRAINT `fk_public_ipv6_address__network_id` FOREIGN KEY (`network_id`) 
REFERENCES `networks`(`id`),
+  CONSTRAINT `fk_public_ipv6_address__account_id` FOREIGN KEY (`account_id`) 
REFERENCES `account`(`id`),
+  CONSTRAINT `fk_public_ipv6_address__vlan_id` FOREIGN KEY (`vlan_id`) 
REFERENCES `vlan`(`id`) ON DELETE CASCADE,
+  CONSTRAINT `fk_public_ipv6_address__data_center_id` FOREIGN KEY 
(`data_center_id`) REFERENCES `data_center`(`id`) ON DELETE CASCADE,
+  CONSTRAINT `uc_public_ipv6_address__uuid` UNIQUE (`uuid`),
+  CONSTRAINT `fk_public_ipv6_address__physical_network_id` FOREIGN KEY 
(`physical_network_id`) REFERENCES `physical_network`(`id`) ON DELETE CASCADE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
 SET foreign_key_checks = 1;
 

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/bd4bc025/utils/pom.xml
----------------------------------------------------------------------
diff --git a/utils/pom.xml b/utils/pom.xml
index 87c078a..6f45044 100644
--- a/utils/pom.xml
+++ b/utils/pom.xml
@@ -129,6 +129,11 @@
       <version>${cs.ejb.version}</version>
     </dependency>
     <dependency>
+        <groupId>com.googlecode.java-ipv6</groupId>
+        <artifactId>java-ipv6</artifactId>
+        <version>${cs.java-ipv6.version}</version>
+    </dependency>
+    <dependency>
       <groupId>commons-configuration</groupId>
       <artifactId>commons-configuration</artifactId>
       <version>${cs.configuration.version}</version>

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/bd4bc025/utils/src/com/cloud/utils/net/NetUtils.java
----------------------------------------------------------------------
diff --git a/utils/src/com/cloud/utils/net/NetUtils.java 
b/utils/src/com/cloud/utils/net/NetUtils.java
index c456cdc..8bfd376 100755
--- a/utils/src/com/cloud/utils/net/NetUtils.java
+++ b/utils/src/com/cloud/utils/net/NetUtils.java
@@ -41,6 +41,9 @@ import java.util.regex.Pattern;
 import org.apache.log4j.Logger;
 import org.apache.log4j.xml.DOMConfigurator;
 
+import com.googlecode.ipv6.IPv6Address;
+import com.googlecode.ipv6.IPv6Network;
+
 import com.cloud.utils.IteratorUtil;
 import com.cloud.utils.Pair;
 import com.cloud.utils.script.Script;
@@ -1142,4 +1145,73 @@ public class NetUtils {
         
         return true;
     }
+
+       public static boolean isValidIPv6(String ip) {
+               try {
+                       IPv6Address address = IPv6Address.fromString(ip);
+               } catch (IllegalArgumentException ex) {
+                       return false;
+               }
+               return true;
+       }
+
+       public static boolean isValidIp6Cidr(String ip6Cidr) {
+               try {
+                       IPv6Network network = IPv6Network.fromString(ip6Cidr);
+               } catch (IllegalArgumentException ex) {
+                       return false;
+               }
+               return true;
+       }
+
+       public static int getIp6CidrSize(String ip6Cidr) {
+               IPv6Network network = null;
+               try {
+                       network = IPv6Network.fromString(ip6Cidr);
+               } catch (IllegalArgumentException ex) {
+                       return 0;
+               }
+               return network.getNetmask().asPrefixLength();
+       }
+
+       //FIXME: only able to cover lower 32 bits
+       public static String getIp6FromRange(String ip6Range) {
+       String[] ips = ip6Range.split("-");
+       String startIp = ips[0];
+       long gap = countIp6InRange(ip6Range);
+       IPv6Address start = IPv6Address.fromString(startIp);
+       // Find a random number based on lower 32 bits
+       int d = _rand.nextInt((int)(gap % Integer.MAX_VALUE));
+       // And a number based on the difference of lower 32 bits
+       IPv6Address ip = start.add(d);
+       return ip.toString();
+       }
+
+       //RFC3315, section 9.4
+       public static String getDuidLL(String macAddress) {
+               String duid = "00:03:00:06:" + macAddress;
+               return duid;
+       }
+       
+       //FIXME: only able to cover lower 64 bits
+       public static long countIp6InRange(String ip6Range) {
+       String[] ips = ip6Range.split("-");
+       String startIp = ips[0];
+       String endIp = null;
+       if (ips.length > 1) {
+               endIp = ips[1];
+       }
+       IPv6Address start, end;
+       try {
+               start = IPv6Address.fromString(startIp);
+               end = IPv6Address.fromString(endIp);
+               } catch (IllegalArgumentException ex) {
+                       return 0;
+               }
+       long startLow = start.getLowBits(), endLow = end.getLowBits();
+       if (startLow > endLow) {
+               return 0;
+       }
+       return endLow - startLow + 1;
+       }
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/bd4bc025/utils/test/com/cloud/utils/net/NetUtilsTest.java
----------------------------------------------------------------------
diff --git a/utils/test/com/cloud/utils/net/NetUtilsTest.java 
b/utils/test/com/cloud/utils/net/NetUtilsTest.java
index 1eccba3..6290cd6 100644
--- a/utils/test/com/cloud/utils/net/NetUtilsTest.java
+++ b/utils/test/com/cloud/utils/net/NetUtilsTest.java
@@ -69,4 +69,18 @@ public class NetUtilsTest extends TestCase {
         assertFalse(NetUtils.isValidS2SVpnPolicy(";modp1536"));
         assertFalse(NetUtils.isValidS2SVpnPolicy(",aes;modp1536,,,"));
     }
+    
+    public void testIpv6() {
+       assertTrue(NetUtils.isValidIPv6("fc00::1"));
+       assertFalse(NetUtils.isValidIPv6(""));
+       assertFalse(NetUtils.isValidIPv6(null));
+       assertFalse(NetUtils.isValidIPv6("1234:5678::1/64"));
+       assertTrue(NetUtils.isValidIp6Cidr("1234:5678::1/64"));
+       assertFalse(NetUtils.isValidIp6Cidr("1234:5678::1"));
+       assertEquals(NetUtils.getIp6CidrSize("1234:5678::1/32"), 32);
+       assertEquals(NetUtils.getIp6CidrSize("1234:5678::1"), 0);
+       assertEquals(NetUtils.countIp6InRange("1234:5678::1-1234:5678::2"), 2);
+       assertEquals(NetUtils.countIp6InRange("1234:5678::2-1234:5678::0"), 0);
+       assertEquals(NetUtils.getIp6FromRange("1234:5678::1-1234:5678::1"), 
"1234:5678::1");
+    }
 }

Reply via email to