You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by ya...@apache.org on 2013/01/31 09:43:05 UTC

[2/12] git commit: refs/heads/network-refactor - IPv6: Accept IPv6 parameter for createNetworkCmd

IPv6: Accept IPv6 parameter for createNetworkCmd

Also ass public_ipv6_address for ipv6 address management.

Extend nics and vlans for ipv6 address.

Add dependency to com.googlecode.ipv6(java-ipv6).

Modify dhcpcommand for ipv6.

Conflicts:

	api/src/com/cloud/agent/api/routing/DhcpEntryCommand.java
	pom.xml
	server/src/com/cloud/configuration/ConfigurationManagerImpl.java
	server/src/com/cloud/configuration/DefaultComponentLibrary.java
	server/src/com/cloud/dc/VlanVO.java
	server/src/com/cloud/network/NetworkManager.java
	server/src/com/cloud/network/NetworkManagerImpl.java
	server/src/com/cloud/network/NetworkVO.java
	server/test/com/cloud/network/MockNetworkManagerImpl.java
	server/test/com/cloud/network/MockNetworkModelImpl.java
	server/test/com/cloud/vpc/MockNetworkManagerImpl.java


Project: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/commit/4bdc94aa
Tree: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/tree/4bdc94aa
Diff: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/diff/4bdc94aa

Branch: refs/heads/network-refactor
Commit: 4bdc94aaf3725ed780b5f2c3ed815a372455ef2c
Parents: c339c4c
Author: Sheng Yang <sh...@citrix.com>
Authored: Thu Jan 24 20:09:37 2013 -0800
Committer: Sheng Yang <sh...@citrix.com>
Committed: Wed Jan 30 23:44:37 2013 -0800

----------------------------------------------------------------------
 .../cloud/agent/api/routing/DhcpEntryCommand.java  |   37 ++-
 api/src/com/cloud/api/ApiConstants.java            |    5 +
 .../com/cloud/api/commands/CreateNetworkCmd.java   |   60 ++++-
 api/src/com/cloud/dc/Vlan.java                     |    5 +
 api/src/com/cloud/network/Network.java             |    6 +-
 api/src/com/cloud/network/NetworkModel.java        |    1 +
 api/src/com/cloud/network/NetworkProfile.java      |   14 +
 api/src/com/cloud/vm/Nic.java                      |    6 +
 api/src/com/cloud/vm/NicProfile.java               |   42 +++-
 client/tomcatconf/components.xml.in                |    1 +
 pom.xml                                            |    1 +
 .../cloud/baremetal/ExternalDhcpManagerImpl.java   |    2 +-
 .../cloud/configuration/ConfigurationManager.java  |    2 +-
 .../configuration/ConfigurationManagerImpl.java    |  227 +++++++++------
 .../configuration/DefaultComponentLibrary.java     |    2 +
 server/src/com/cloud/dc/VlanVO.java                |   47 +++-
 server/src/com/cloud/network/NetworkManager.java   |    7 +-
 .../src/com/cloud/network/NetworkManagerImpl.java  |  141 ++++++++--
 server/src/com/cloud/network/NetworkModelImpl.java |   37 ++-
 .../src/com/cloud/network/NetworkServiceImpl.java  |  138 +++++++---
 server/src/com/cloud/network/NetworkVO.java        |   24 ++
 .../src/com/cloud/network/PublicIpv6Address.java   |   56 ++++
 .../src/com/cloud/network/PublicIpv6AddressVO.java |  189 ++++++++++++
 server/src/com/cloud/network/addr/PublicIp.java    |   15 +
 .../cloud/network/dao/PublicIpv6AddressDao.java    |   23 ++
 .../network/dao/PublicIpv6AddressDaoImpl.java      |   96 ++++++
 .../com/cloud/network/guru/DirectNetworkGuru.java  |   49 +++-
 .../network/guru/DirectPodBasedNetworkGuru.java    |    2 +-
 .../network/guru/ExternalGuestNetworkGuru.java     |    2 +-
 .../com/cloud/network/guru/GuestNetworkGuru.java   |    4 +-
 .../cloud/network/guru/PodBasedNetworkGuru.java    |    2 +-
 .../com/cloud/network/guru/PublicNetworkGuru.java  |    2 +-
 .../router/VirtualNetworkApplianceManagerImpl.java |    8 +-
 .../src/com/cloud/network/vpc/VpcManagerImpl.java  |    2 +-
 server/src/com/cloud/vm/NicVO.java                 |   25 ++
 server/src/com/cloud/vm/UserVmManagerImpl.java     |    8 +-
 .../com/cloud/network/MockNetworkManagerImpl.java  |   12 +-
 .../com/cloud/network/MockNetworkModelImpl.java    |    5 +
 .../cloud/vpc/MockConfigurationManagerImpl.java    |    2 +-
 .../test/com/cloud/vpc/MockNetworkManagerImpl.java |   15 +-
 setup/db/create-schema.sql                         |   32 ++
 utils/pom.xml                                      |    5 +
 utils/src/com/cloud/utils/net/NetUtils.java        |   72 +++++
 utils/test/com/cloud/utils/net/NetUtilsTest.java   |   14 +
 44 files changed, 1235 insertions(+), 210 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/4bdc94aa/api/src/com/cloud/agent/api/routing/DhcpEntryCommand.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/agent/api/routing/DhcpEntryCommand.java b/api/src/com/cloud/agent/api/routing/DhcpEntryCommand.java
index ff38941..98cd8df 100644
--- a/api/src/com/cloud/agent/api/routing/DhcpEntryCommand.java
+++ b/api/src/com/cloud/agent/api/routing/DhcpEntryCommand.java
@@ -28,8 +28,10 @@ public class DhcpEntryCommand extends NetworkElementCommand {
     String defaultRouter;
     String staticRoutes;
     String defaultDns;
+    String vmIp6Address;
+    String ip6Gateway;
+    String duid;
 
-    
     protected DhcpEntryCommand() {
         
     }
@@ -38,15 +40,16 @@ public class DhcpEntryCommand extends NetworkElementCommand {
     public boolean executeInSequence() {
         return true;
     }
-    
-    public DhcpEntryCommand(String vmMac, String vmIpAddress, String vmName) {
+
+    public DhcpEntryCommand(String vmMac, String vmIpAddress, String vmName, String vmIp6Address) {
         this.vmMac = vmMac;
         this.vmIpAddress = vmIpAddress;
         this.vmName = vmName;
+        this.vmIp6Address = vmIp6Address;
     }
     
-    public DhcpEntryCommand(String vmMac, String vmIpAddress, String vmName, String dns, String gateway) {
-        this(vmMac, vmIpAddress, vmName);
+    public DhcpEntryCommand(String vmMac, String vmIpAddress, String vmName, String vmIp6Address, String dns, String gateway, String ip6Gateway) {
+        this(vmMac, vmIpAddress, vmName, vmIp6Address);
         this.dns = dns;
         this.gateway = gateway;
     }
@@ -102,4 +105,28 @@ public class DhcpEntryCommand extends NetworkElementCommand {
 	public void setDefaultDns(String defaultDns) {
 		this.defaultDns = defaultDns;
 	}
+
+	public String getIp6Gateway() {
+		return ip6Gateway;
+	}
+
+	public void setIp6Gateway(String ip6Gateway) {
+		this.ip6Gateway = ip6Gateway;
+	}
+
+	public String getDuid() {
+		return duid;
+	}
+
+	public void setDuid(String duid) {
+		this.duid = duid;
+	}
+
+	public String getVmIp6Address() {
+		return vmIp6Address;
+	}
+
+	public void setVmIp6Address(String ip6Address) {
+		this.vmIp6Address = ip6Address;
+	}
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/4bdc94aa/api/src/com/cloud/api/ApiConstants.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/api/ApiConstants.java b/api/src/com/cloud/api/ApiConstants.java
index 588cdc6..d10e10d 100755
--- a/api/src/com/cloud/api/ApiConstants.java
+++ b/api/src/com/cloud/api/ApiConstants.java
@@ -38,6 +38,7 @@ public class ApiConstants {
     public static final String DOMAIN_SUFFIX = "domainsuffix";
     public static final String DNS_SEARCH_ORDER = "dnssearchorder";
     public static final String CIDR = "cidr";
+    public static final String IP6CIDR = "ip6cidr";
     public static final String CIDR_LIST = "cidrlist";
     public static final String CLEANUP = "cleanup";
     public static final String CLUSTER_ID = "clusterid";
@@ -64,6 +65,7 @@ public class ApiConstants {
     public static final String EMAIL = "email";
     public static final String END_DATE = "enddate";
     public static final String END_IP = "endip";
+    public static final String END_IPV6 = "endipv6";
     public static final String END_PORT = "endport";
     public static final String ENTRY_TIME = "entrytime";
     public static final String FETCH_LATEST = "fetchlatest";
@@ -73,6 +75,7 @@ public class ApiConstants {
     public static final String FORMAT = "format";
     public static final String FOR_VIRTUAL_NETWORK = "forvirtualnetwork";
     public static final String GATEWAY = "gateway";
+    public static final String IP6GATEWAY = "ip6gateway";
     public static final String GROUP = "group";
     public static final String GROUP_ID = "groupid";
     public static final String GUEST_CIDR_ADDRESS = "guestcidraddress";
@@ -176,6 +179,7 @@ public class ApiConstants {
     public static final String SOURCE_ZONE_ID = "sourcezoneid";
     public static final String START_DATE = "startdate";
     public static final String START_IP = "startip";
+    public static final String START_IPV6 = "startipv6";
     public static final String START_PORT = "startport";
     public static final String STATE = "state";
     public static final String STATUS = "status";
@@ -421,6 +425,7 @@ public class ApiConstants {
     public static final String CONDITION_IDS = "conditionids";
     public static final String COUNTERPARAM_LIST = "counterparam";
     public static final String AUTOSCALE_USER_ID = "autoscaleuserid";
+    public static final String DUAL_STACK = "dualstack";
 
     public enum HostDetails {
         all, capacity, events, stats, min;

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/4bdc94aa/api/src/com/cloud/api/commands/CreateNetworkCmd.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/api/commands/CreateNetworkCmd.java b/api/src/com/cloud/api/commands/CreateNetworkCmd.java
index a536357..60aaf59 100644
--- a/api/src/com/cloud/api/commands/CreateNetworkCmd.java
+++ b/api/src/com/cloud/api/commands/CreateNetworkCmd.java
@@ -107,7 +107,22 @@ public class CreateNetworkCmd extends BaseCmd {
     @Parameter(name=ApiConstants.VPC_ID, type=CommandType.LONG, description="the VPC network belongs to")
     private Long vpcId;
 
+    @Parameter(name=ApiConstants.START_IPV6, type=CommandType.STRING, description="the beginning IPv6 address in the IPv6 network range")
+    private String startIpv6;
 
+    @Parameter(name=ApiConstants.END_IPV6, type=CommandType.STRING, description="the ending IPv6 address in the IPv6 network range")
+    private String endIpv6;
+
+    @Parameter(name=ApiConstants.IP6GATEWAY, type=CommandType.STRING, description="the gateway of the IPv6 network. Required " +
+            "for Shared networks and Isolated networks when it belongs to VPC")
+    private String ip6Gateway;
+    
+    @Parameter(name=ApiConstants.IP6CIDR, type=CommandType.STRING, description="the CIDR of IPv6 network, must be at least /64")
+    private String ip6Cidr;
+
+    @Parameter(name=ApiConstants.DUAL_STACK, type=CommandType.BOOLEAN, description="The network is dual-stack(IPv6 and IPv4) or not")
+    private Boolean dualStack;
+    
     /////////////////////////////////////////////////////
     /////////////////// Accessors ///////////////////////
     /////////////////////////////////////////////////////
@@ -201,7 +216,50 @@ public class CreateNetworkCmd extends BaseCmd {
         }
     }
 
-    /////////////////////////////////////////////////////
+    public String getStartIpv6() {
+        return startIpv6;
+    }
+
+    public void setStartIpv6(String startIpv6) {
+        this.startIpv6 = startIpv6;
+    }
+
+    public String getEndIpv6() {
+        return endIpv6;
+    }
+
+    public void setEndIpv6(String endIpv6) {
+        this.endIpv6 = endIpv6;
+    }
+
+    public String getIp6Gateway() {
+        return ip6Gateway;
+    }
+
+    public void setIp6Gateway(String ip6Gateway) {
+        this.ip6Gateway = ip6Gateway;
+    }
+
+    public String getIp6Cidr() {
+        return ip6Cidr;
+    }
+
+    public void setIp6Cidr(String ip6Cidr) {
+        this.ip6Cidr = ip6Cidr;
+    }
+
+    public Boolean isDualStack() {
+    	if (dualStack == null) {
+    		return false;
+    	}
+		return dualStack;
+	}
+
+	public void setDualStack(Boolean dualStack) {
+		this.dualStack = dualStack;
+	}
+
+	/////////////////////////////////////////////////////
     /////////////// API Implementation///////////////////
     /////////////////////////////////////////////////////
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/4bdc94aa/api/src/com/cloud/dc/Vlan.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/dc/Vlan.java b/api/src/com/cloud/dc/Vlan.java
index 1e1fce1..d885c0d 100644
--- a/api/src/com/cloud/dc/Vlan.java
+++ b/api/src/com/cloud/dc/Vlan.java
@@ -42,4 +42,9 @@ public interface Vlan {
 
     public Long getPhysicalNetworkId();
 
+	public String getIp6Gateway();
+
+	public String getIp6Cidr();
+
+	public String getIp6Range();
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/4bdc94aa/api/src/com/cloud/network/Network.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/network/Network.java b/api/src/com/cloud/network/Network.java
index 188ef92..fd3ddc9 100644
--- a/api/src/com/cloud/network/Network.java
+++ b/api/src/com/cloud/network/Network.java
@@ -267,7 +267,11 @@ public interface Network extends ControlledEntity {
     String getGateway();
 
     String getCidr();
-
+    
+    String getIp6Gateway();
+    
+    String getIp6Cidr();
+    
     long getDataCenterId();
 
     long getNetworkOfferingId();

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/4bdc94aa/api/src/com/cloud/network/NetworkModel.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/network/NetworkModel.java b/api/src/com/cloud/network/NetworkModel.java
index ed76c66..e43ed8e 100644
--- a/api/src/com/cloud/network/NetworkModel.java
+++ b/api/src/com/cloud/network/NetworkModel.java
@@ -247,4 +247,5 @@ public interface NetworkModel {
     
     PublicIpAddress getSourceNatIpAddressForGuestNetwork(Account owner, Network guestNetwork);
 
+	Vlan getVlanForNetwork(long networkId);
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/4bdc94aa/api/src/com/cloud/network/NetworkProfile.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/network/NetworkProfile.java b/api/src/com/cloud/network/NetworkProfile.java
index cd25d9f..1cd8030 100644
--- a/api/src/com/cloud/network/NetworkProfile.java
+++ b/api/src/com/cloud/network/NetworkProfile.java
@@ -37,6 +37,8 @@ public class NetworkProfile implements Network {
     private TrafficType trafficType;
     private String gateway;
     private String cidr;
+    private String ip6Gateway;
+    private String ip6Cidr;
     private long networkOfferingId;
     private long related;
     private String displayText;
@@ -61,6 +63,8 @@ public class NetworkProfile implements Network {
         this.trafficType = network.getTrafficType();
         this.gateway = network.getGateway();
         this.cidr = network.getCidr();
+        this.ip6Gateway = network.getIp6Gateway();
+        this.ip6Cidr = network.getIp6Cidr();
         this.networkOfferingId = network.getNetworkOfferingId();
         this.related = network.getRelated();
         this.displayText = network.getDisplayText();
@@ -217,4 +221,14 @@ public class NetworkProfile implements Network {
         return vpcId;
     }
 
+	@Override
+	public String getIp6Gateway() {
+		return ip6Gateway;
+	}
+
+	@Override
+	public String getIp6Cidr() {
+		return ip6Cidr;
+	}
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/4bdc94aa/api/src/com/cloud/vm/Nic.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/vm/Nic.java b/api/src/com/cloud/vm/Nic.java
index 3beff0a..0e7b21a 100644
--- a/api/src/com/cloud/vm/Nic.java
+++ b/api/src/com/cloud/vm/Nic.java
@@ -147,4 +147,10 @@ public interface Nic {
     VirtualMachine.Type getVmType();
 
     AddressFormat getAddressFormat();
+
+	String getIp6Gateway();
+
+	String getIp6Cidr();
+
+	String getIp6Address();
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/4bdc94aa/api/src/com/cloud/vm/NicProfile.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/vm/NicProfile.java b/api/src/com/cloud/vm/NicProfile.java
index c5ffbea..3a42392 100644
--- a/api/src/com/cloud/vm/NicProfile.java
+++ b/api/src/com/cloud/vm/NicProfile.java
@@ -36,6 +36,8 @@ public class NicProfile {
     TrafficType trafficType;
     String ip4Address;
     String ip6Address;
+    String ip6Gateway;
+    String ip6Cidr;
     String macAddress;
     URI isolationUri;
     String netmask;
@@ -49,7 +51,8 @@ public class NicProfile {
     Integer networkRate;
     boolean isSecurityGroupEnabled;
     String name;
-    String requestedIp;
+    String requestedIpv4;
+    String requestedIpv6;
 
     public String getDns1() {
         return dns1;
@@ -217,7 +220,7 @@ public class NicProfile {
         this.trafficType = network.getTrafficType();
         this.ip4Address = nic.getIp4Address();
         this.format = nic.getAddressFormat();
-        this.ip6Address = null;
+        this.ip6Address = nic.getIp6Address();
         this.macAddress = nic.getMacAddress();
         this.reservationId = nic.getReservationId();
         this.strategy = nic.getReservationStrategy();
@@ -229,6 +232,8 @@ public class NicProfile {
         this.isSecurityGroupEnabled = isSecurityGroupEnabled;
         this.vmId = nic.getInstanceId();
         this.name = name;
+        this.ip6Cidr = nic.getIp6Cidr();
+        this.ip6Gateway = nic.getIp6Gateway();
 
         if (networkRate != null) {
             this.networkRate = networkRate;
@@ -244,8 +249,9 @@ public class NicProfile {
         this.strategy = strategy;
     }
 
-    public NicProfile(String requestedIp) {
-        this.requestedIp = requestedIp;
+    public NicProfile(String requestedIpv4, String requestedIpv6) {
+        this.requestedIpv4 = requestedIpv4;
+        this.requestedIpv6 = requestedIpv6;
     }
 
     public NicProfile() {
@@ -271,8 +277,8 @@ public class NicProfile {
         this.isSecurityGroupEnabled = enabled;
     }
 
-    public String getRequestedIp() {
-        return requestedIp;
+    public String getRequestedIpv4() {
+        return requestedIpv4;
     }
 
     public void deallocate() {
@@ -300,4 +306,28 @@ public class NicProfile {
                 append(reservationId).append("-").append(ip4Address).append("-").append(broadcastUri).toString();
     }
 
+	public String getIp6Gateway() {
+		return ip6Gateway;
+	}
+
+	public void setIp6Gateway(String ip6Gateway) {
+		this.ip6Gateway = ip6Gateway;
+	}
+
+	public String getIp6Cidr() {
+		return ip6Cidr;
+	}
+
+	public void setIp6Cidr(String ip6Cidr) {
+		this.ip6Cidr = ip6Cidr;
+	}
+
+	public String getRequestedIpv6() {
+		return requestedIpv6;
+	}
+
+	public void setRequestedIpv6(String requestedIpv6) {
+		this.requestedIpv6 = requestedIpv6;
+	}
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/4bdc94aa/client/tomcatconf/components.xml.in
----------------------------------------------------------------------
diff --git a/client/tomcatconf/components.xml.in b/client/tomcatconf/components.xml.in
index f678f5d..70443c0 100755
--- a/client/tomcatconf/components.xml.in
+++ b/client/tomcatconf/components.xml.in
@@ -261,6 +261,7 @@ under the License.
         <dao name="Site2SiteCustomerGatewayDao" class="com.cloud.network.dao.Site2SiteCustomerGatewayDaoImpl" singleton="false"/>
         <dao name="Site2SiteVpnGatewayDao" class="com.cloud.network.dao.Site2SiteVpnGatewayDaoImpl" singleton="false"/>
         <dao name="Site2SiteVpnConnectionDao" class="com.cloud.network.dao.Site2SiteVpnConnectionDaoImpl" singleton="false"/>
+        <dao name="PublicIpv6AddressDao" class="com.cloud.network.dao.PublicIpv6AddressDaoImpl" singleton="false"/>
     </configuration-server>
     
     <awsapi-ec2server class="com.cloud.bridge.service.EC2MainServlet">

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/4bdc94aa/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index f374032..d93e813 100644
--- a/pom.xml
+++ b/pom.xml
@@ -85,6 +85,7 @@
     <cs.aws.sdk.version>1.3.21.1</cs.aws.sdk.version>
     <cs.lang.version>2.6</cs.lang.version>
     <cs.commons-io.version>1.4</cs.commons-io.version>
+    <cs.java-ipv6.version>0.8</cs.java-ipv6.version>
   </properties>
 
   <distributionManagement>

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/4bdc94aa/server/src/com/cloud/baremetal/ExternalDhcpManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/baremetal/ExternalDhcpManagerImpl.java b/server/src/com/cloud/baremetal/ExternalDhcpManagerImpl.java
index 0da4029..1ac3e71 100755
--- a/server/src/com/cloud/baremetal/ExternalDhcpManagerImpl.java
+++ b/server/src/com/cloud/baremetal/ExternalDhcpManagerImpl.java
@@ -208,7 +208,7 @@ public class ExternalDhcpManagerImpl implements ExternalDhcpManager, ResourceSta
 		if (dns == null) {
 			dns = nic.getDns2();
 		}
-		DhcpEntryCommand dhcpCommand = new DhcpEntryCommand(nic.getMacAddress(), nic.getIp4Address(), profile.getVirtualMachine().getHostName(), dns, nic.getGateway());
+		DhcpEntryCommand dhcpCommand = new DhcpEntryCommand(nic.getMacAddress(), nic.getIp4Address(), profile.getVirtualMachine().getHostName(), null, dns, nic.getGateway(), null);
 		String errMsg = String.format("Set dhcp entry on external DHCP %1$s failed(ip=%2$s, mac=%3$s, vmname=%4$s)",
 				h.getPrivateIpAddress(), nic.getIp4Address(), nic.getMacAddress(), profile.getVirtualMachine().getHostName());
 		//prepareBareMetalDhcpEntry(nic, dhcpCommand);

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/4bdc94aa/server/src/com/cloud/configuration/ConfigurationManager.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/configuration/ConfigurationManager.java b/server/src/com/cloud/configuration/ConfigurationManager.java
index 19e74bf..58fdeed 100644
--- a/server/src/com/cloud/configuration/ConfigurationManager.java
+++ b/server/src/com/cloud/configuration/ConfigurationManager.java
@@ -198,7 +198,7 @@ public interface ConfigurationManager extends ConfigurationService, Manager {
             boolean isDefault, Network.GuestType type, boolean systemOnly, Long serviceOfferingId, boolean conserveMode, Map<Service, Map<Capability, String>> serviceCapabilityMap,
             boolean specifyIpRanges);
 
-    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;
+    Vlan createVlanAndPublicIpRange(long zoneId, long networkId, long physicalNetworkId, boolean forVirtualNetwork, Long podId, String startIP, String endIP, String vlanGateway, String vlanNetmask, String vlanId, Account vlanOwner, String startIPv6, String endIPv6, String vlanGatewayv6, String vlanCidrv6) throws InsufficientCapacityException, ConcurrentOperationException, InvalidParameterValueException;
 
     void createDefaultSystemNetworks(long zoneId) throws ConcurrentOperationException;
 

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/4bdc94aa/server/src/com/cloud/configuration/ConfigurationManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java
index e851525..314ba54 100755
--- a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java
+++ b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java
@@ -2249,7 +2249,7 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura
         txn.start();
 
         Vlan vlan = createVlanAndPublicIpRange(zoneId, networkId, physicalNetworkId, forVirtualNetwork, podId, startIP, 
-                endIP, vlanGateway, vlanNetmask, vlanId, vlanOwner);
+                endIP, vlanGateway, vlanNetmask, vlanId, vlanOwner, null, null, null, null);
 
         if (associateIpRangeToAccount) {
             _networkMgr.associateIpAddressListToAccount(userId, vlanOwner.getId(), zoneId, vlan.getId(), null);
@@ -2275,10 +2275,22 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura
     @DB
     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) {
+            String vlanId, Account vlanOwner, String startIPv6, String endIPv6, String vlanGatewayv6, String vlanCidrv6) {
+        Network network = _networkModel.getNetwork(networkId);
         
+        boolean ipv4 = false, ipv6 = false;
         
-        Network network = _networkModel.getNetwork(networkId);
+        if (startIP != null) {
+        	ipv4 = true;
+        }
+        
+        if (startIPv6 != null) {
+        	ipv6 = true;
+        }
+        
+        if (!ipv4 && !ipv6) {
+            throw new InvalidParameterValueException("Please specify IPv4 or IPv6 address.");
+        }
         
         //Validate the zone
         DataCenterVO zone = _zoneDao.findById(zoneId);
@@ -2344,90 +2356,108 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura
             throw new InvalidParameterValueException("Vlan owner can be defined only in the zone of type " + NetworkType.Advanced);
         }
 
-        // Make sure the gateway is valid
-        if (!NetUtils.isValidIp(vlanGateway)) {
-            throw new InvalidParameterValueException("Please specify a valid gateway");
-        }
-
-        // Make sure the netmask is valid
-        if (!NetUtils.isValidIp(vlanNetmask)) {
-            throw new InvalidParameterValueException("Please specify a valid netmask");
-        }
-
-        String newVlanSubnet = NetUtils.getSubNet(vlanGateway, vlanNetmask);
-
-        // Check if the new VLAN's subnet conflicts with the guest network in
-        // the specified zone (guestCidr is null for basic zone)
-        String guestNetworkCidr = zone.getGuestNetworkCidr();
-        if (guestNetworkCidr != null) {
-            String[] cidrPair = guestNetworkCidr.split("\\/");
-            String guestIpNetwork = NetUtils.getIpRangeStartIpFromCidr(cidrPair[0], Long.parseLong(cidrPair[1]));
-            long guestCidrSize = Long.parseLong(cidrPair[1]);
-            long vlanCidrSize = NetUtils.getCidrSize(vlanNetmask);
-
-            long cidrSizeToUse = -1;
-            if (vlanCidrSize < guestCidrSize) {
-                cidrSizeToUse = vlanCidrSize;
-            } else {
-                cidrSizeToUse = guestCidrSize;
-            }
-
-            String guestSubnet = NetUtils.getCidrSubNet(guestIpNetwork, cidrSizeToUse);
+        if (ipv4) {
+        	// Make sure the gateway is valid
+        	if (!NetUtils.isValidIp(vlanGateway)) {
+        		throw new InvalidParameterValueException("Please specify a valid gateway");
+        	}
 
-            if (newVlanSubnet.equals(guestSubnet)) {
-                throw new InvalidParameterValueException("The new IP range you have specified has the same subnet as the guest network in zone: " + zone.getName()
-                        + ". Please specify a different gateway/netmask.");
-            }
+        	// Make sure the netmask is valid
+        	if (!NetUtils.isValidIp(vlanNetmask)) {
+        		throw new InvalidParameterValueException("Please specify a valid netmask");
+        	}
         }
-
-        // Check if there are any errors with the IP range
-        checkPublicIpRangeErrors(zoneId, vlanId, vlanGateway, vlanNetmask, startIP, endIP);
-
-        // Throw an exception if any of the following is true:
-        // 1. Another VLAN in the same zone has a different tag but the same
-        // subnet as the new VLAN. Make an exception for the
-        // case when both vlans are Direct.
-        // 2. Another VLAN in the same zone that has the same tag and subnet as
-        // the new VLAN has IPs that overlap with the IPs
-        // being added
-        // 3. Another VLAN in the same zone that has the same tag and subnet as
-        // the new VLAN has a different gateway than the
-        // new VLAN
-        // 4. If VLAN is untagged and Virtual, and there is existing UNTAGGED
-        // vlan with different subnet
-        List<VlanVO> vlans = _vlanDao.listByZone(zone.getId());
-        for (VlanVO vlan : vlans) {
-            String otherVlanGateway = vlan.getVlanGateway();
-            String otherVlanSubnet = NetUtils.getSubNet(vlan.getVlanGateway(), vlan.getVlanNetmask());
-            String[] otherVlanIpRange = vlan.getIpRange().split("\\-");
-            String otherVlanStartIP = otherVlanIpRange[0];
-            String otherVlanEndIP = null;
-            if (otherVlanIpRange.length > 1) {
-                otherVlanEndIP = otherVlanIpRange[1];
-            }
-
-            if (forVirtualNetwork && !vlanId.equals(vlan.getVlanTag()) && newVlanSubnet.equals(otherVlanSubnet) && !allowIpRangeOverlap(vlan, forVirtualNetwork, networkId)) {
-                throw new InvalidParameterValueException("The IP range with tag: " + vlan.getVlanTag() + " in zone " + zone.getName()
-                        + " has the same subnet. Please specify a different gateway/netmask.");
-            }
-
-            boolean vlansUntaggedAndVirtual = (vlanId.equals(Vlan.UNTAGGED) && vlanId.equals(vlan.getVlanTag()) && forVirtualNetwork && vlan.getVlanType() == VlanType.VirtualNetwork);
-
-            if (vlansUntaggedAndVirtual && !newVlanSubnet.equals(otherVlanSubnet)) {
-                throw new InvalidParameterValueException("The Untagged ip range with different subnet already exists in zone " + zone.getId());
-            }
-
-            if (vlanId.equals(vlan.getVlanTag()) && newVlanSubnet.equals(otherVlanSubnet)) {
-                if (NetUtils.ipRangesOverlap(startIP, endIP, otherVlanStartIP, otherVlanEndIP)) {
-                    throw new InvalidParameterValueException("The IP range with tag: " + vlan.getVlanTag()
-                            + " already has IPs that overlap with the new range. Please specify a different start IP/end IP.");
-                }
-
-                if (!vlanGateway.equals(otherVlanGateway)) {
-                    throw new InvalidParameterValueException("The IP range with tag: " + vlan.getVlanTag() + " has already been added with gateway " + otherVlanGateway
-                            + ". Please specify a different tag.");
-                }
-            }
+        
+        if (ipv6) {
+        	if (!NetUtils.isValidIPv6(vlanGatewayv6)) {
+        		throw new InvalidParameterValueException("Please specify a valid IPv6 gateway");
+        	}
+        	if (!NetUtils.isValidIp6Cidr(vlanCidrv6)) {
+        		throw new InvalidParameterValueException("Please specify a valid IPv6 CIDR");
+        	}
+        }
+
+        // TODO skip all vlan check for ipv6 now
+        if (ipv4) {
+        	String newVlanSubnet = NetUtils.getSubNet(vlanGateway, vlanNetmask);
+
+        	// Check if the new VLAN's subnet conflicts with the guest network in
+        	// the specified zone (guestCidr is null for basic zone)
+        	String guestNetworkCidr = zone.getGuestNetworkCidr();
+        	if (guestNetworkCidr != null) {
+        		String[] cidrPair = guestNetworkCidr.split("\\/");
+        		String guestIpNetwork = NetUtils.getIpRangeStartIpFromCidr(cidrPair[0], Long.parseLong(cidrPair[1]));
+        		long guestCidrSize = Long.parseLong(cidrPair[1]);
+        		long vlanCidrSize = NetUtils.getCidrSize(vlanNetmask);
+
+        		long cidrSizeToUse = -1;
+        		if (vlanCidrSize < guestCidrSize) {
+        			cidrSizeToUse = vlanCidrSize;
+        		} else {
+        			cidrSizeToUse = guestCidrSize;
+        		}
+
+        		String guestSubnet = NetUtils.getCidrSubNet(guestIpNetwork, cidrSizeToUse);
+
+        		if (newVlanSubnet.equals(guestSubnet)) {
+        			throw new InvalidParameterValueException("The new IP range you have specified has the same subnet as the guest network in zone: " + zone.getName()
+        					+ ". Please specify a different gateway/netmask.");
+        		}
+        	}
+
+        	// Check if there are any errors with the IP range
+        	checkPublicIpRangeErrors(zoneId, vlanId, vlanGateway, vlanNetmask, startIP, endIP);
+
+        	// Throw an exception if any of the following is true:
+        	// 1. Another VLAN in the same zone has a different tag but the same
+        	// subnet as the new VLAN. Make an exception for the
+        	// case when both vlans are Direct.
+        	// 2. Another VLAN in the same zone that has the same tag and subnet as
+        	// the new VLAN has IPs that overlap with the IPs
+        	// being added
+        	// 3. Another VLAN in the same zone that has the same tag and subnet as
+        	// the new VLAN has a different gateway than the
+        	// new VLAN
+        	// 4. If VLAN is untagged and Virtual, and there is existing UNTAGGED
+        	// vlan with different subnet
+        	List<VlanVO> vlans = _vlanDao.listByZone(zone.getId());
+        	for (VlanVO vlan : vlans) {
+        		String otherVlanGateway = vlan.getVlanGateway();
+        		// Continue if it's IPv6
+        		if (otherVlanGateway == null) {
+        			continue;
+        		}
+        		String otherVlanSubnet = NetUtils.getSubNet(vlan.getVlanGateway(), vlan.getVlanNetmask());
+        		String[] otherVlanIpRange = vlan.getIpRange().split("\\-");
+        		String otherVlanStartIP = otherVlanIpRange[0];
+        		String otherVlanEndIP = null;
+        		if (otherVlanIpRange.length > 1) {
+        			otherVlanEndIP = otherVlanIpRange[1];
+        		}
+
+        		if (forVirtualNetwork && !vlanId.equals(vlan.getVlanTag()) && newVlanSubnet.equals(otherVlanSubnet) && !allowIpRangeOverlap(vlan, forVirtualNetwork, networkId)) {
+        			throw new InvalidParameterValueException("The IP range with tag: " + vlan.getVlanTag() + " in zone " + zone.getName()
+        					+ " has the same subnet. Please specify a different gateway/netmask.");
+        		}
+
+        		boolean vlansUntaggedAndVirtual = (vlanId.equals(Vlan.UNTAGGED) && vlanId.equals(vlan.getVlanTag()) && forVirtualNetwork && vlan.getVlanType() == VlanType.VirtualNetwork);
+
+        		if (vlansUntaggedAndVirtual && !newVlanSubnet.equals(otherVlanSubnet)) {
+        			throw new InvalidParameterValueException("The Untagged ip range with different subnet already exists in zone " + zone.getId());
+        		}
+
+        		if (vlanId.equals(vlan.getVlanTag()) && newVlanSubnet.equals(otherVlanSubnet)) {
+        			if (NetUtils.ipRangesOverlap(startIP, endIP, otherVlanStartIP, otherVlanEndIP)) {
+        				throw new InvalidParameterValueException("The IP range with tag: " + vlan.getVlanTag()
+        						+ " already has IPs that overlap with the new range. Please specify a different start IP/end IP.");
+        			}
+
+        			if (!vlanGateway.equals(otherVlanGateway)) {
+        				throw new InvalidParameterValueException("The IP range with tag: " + vlan.getVlanTag() + " has already been added with gateway " + otherVlanGateway
+        						+ ". Please specify a different tag.");
+        			}
+        		}
+        	}
         }
 
         // Check if a guest VLAN is using the same tag
@@ -2449,21 +2479,36 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura
             }
         }
 
-        String ipRange = startIP;
-        if (endIP != null) {
-            ipRange += "-" + endIP;
+        String ipRange = null;
+        
+        if (ipv4) {
+        	ipRange = startIP;
+        	if (endIP != null) {
+        		ipRange += "-" + endIP;
+        	}
+        }
+        
+        String ipv6Range = null;
+        if (ipv6) {
+        	ipv6Range = startIPv6;
+        	if (endIPv6 != null) {
+        		ipv6Range += "-" + endIPv6;
+        	}
         }
 
         // Everything was fine, so persist the VLAN
         Transaction txn = Transaction.currentTxn();
         txn.start();
 
-        VlanVO vlan = new VlanVO(vlanType, vlanId, vlanGateway, vlanNetmask, zone.getId(), ipRange, networkId, physicalNetworkId);
+        VlanVO vlan = new VlanVO(vlanType, vlanId, vlanGateway, vlanNetmask, zone.getId(), ipRange, networkId, physicalNetworkId, vlanGatewayv6, vlanCidrv6, ipv6Range);
         s_logger.debug("Saving vlan range " + vlan);
         vlan = _vlanDao.persist(vlan);
 
-        if (!savePublicIPRange(startIP, endIP, zoneId, vlan.getId(), networkId, physicalNetworkId)) {
-            throw new CloudRuntimeException("Failed to save IP range. Please contact Cloud Support."); 
+        // IPv6 use a used ip map, is different from ipv4, no need to save public ip range
+        if (ipv4) {
+        	if (!savePublicIPRange(startIP, endIP, zoneId, vlan.getId(), networkId, physicalNetworkId)) {
+        		throw new CloudRuntimeException("Failed to save IPv4 range. Please contact Cloud Support."); 
+        	}
         }
 
         if (vlanOwner != null) {

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/4bdc94aa/server/src/com/cloud/configuration/DefaultComponentLibrary.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/configuration/DefaultComponentLibrary.java b/server/src/com/cloud/configuration/DefaultComponentLibrary.java
index f57c691..9de847c 100755
--- a/server/src/com/cloud/configuration/DefaultComponentLibrary.java
+++ b/server/src/com/cloud/configuration/DefaultComponentLibrary.java
@@ -104,6 +104,7 @@ import com.cloud.network.dao.PhysicalNetworkDaoImpl;
 import com.cloud.network.dao.PhysicalNetworkServiceProviderDaoImpl;
 import com.cloud.network.dao.PhysicalNetworkTrafficTypeDaoImpl;
 import com.cloud.network.dao.PortProfileDaoImpl;
+import com.cloud.network.dao.PublicIpv6AddressDaoImpl;
 import com.cloud.network.dao.RemoteAccessVpnDaoImpl;
 import com.cloud.network.dao.Site2SiteCustomerGatewayDaoImpl;
 import com.cloud.network.dao.Site2SiteVpnConnectionDaoImpl;
@@ -359,6 +360,7 @@ public class DefaultComponentLibrary extends ComponentLibraryBase implements Com
         addDao("Site2SiteVpnGatewayDao", Site2SiteVpnGatewayDaoImpl.class);
         addDao("Site2SiteCustomerGatewayDao", Site2SiteCustomerGatewayDaoImpl.class);
         addDao("Site2SiteVpnConnnectionDao", Site2SiteVpnConnectionDaoImpl.class);
+        addDao("PublicIpv6AddressDao", PublicIpv6AddressDaoImpl.class);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/4bdc94aa/server/src/com/cloud/dc/VlanVO.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/dc/VlanVO.java b/server/src/com/cloud/dc/VlanVO.java
index ff57f5e..c518439 100644
--- a/server/src/com/cloud/dc/VlanVO.java
+++ b/server/src/com/cloud/dc/VlanVO.java
@@ -47,11 +47,20 @@ public class VlanVO implements Vlan, Identity {
 	@Column(name="vlan_netmask") 
 	String vlanNetmask;
 	
-	@Column(name="data_center_id") 
+	@Column(name="ip6_gateway")
+	String ip6Gateway;
+
+	@Column(name="ip6_cidr")
+	String ip6Cidr;
+
+	@Column(name="data_center_id")
 	long dataCenterId;
 	
 	@Column(name="description") 
 	String ipRange;
+
+	@Column(name="ip6_range")
+	String ip6Range;
 	
     @Column(name="network_id")
     Long networkId;
@@ -65,14 +74,17 @@ public class VlanVO implements Vlan, Identity {
 
     @Column(name="uuid")
     String uuid;
-	
-	public VlanVO(VlanType vlanType, String vlanTag, String vlanGateway, String vlanNetmask, long dataCenterId, String ipRange, Long networkId, Long physicalNetworkId) {
+
+	public VlanVO(VlanType vlanType, String vlanTag, String vlanGateway, String vlanNetmask, long dataCenterId, String ipRange, Long networkId, Long physicalNetworkId, String ip6Gateway, String ip6Cidr, String ip6Range) {
 		this.vlanType = vlanType;
 		this.vlanTag = vlanTag;
 		this.vlanGateway = vlanGateway;
 		this.vlanNetmask = vlanNetmask;
+		this.ip6Gateway = ip6Gateway;
+		this.ip6Cidr = ip6Cidr;
 		this.dataCenterId = dataCenterId;
 		this.ipRange = ipRange;
+		this.ip6Range = ip6Range;
 		this.networkId = networkId;
 		this.uuid = UUID.randomUUID().toString();
 		this.physicalNetworkId = physicalNetworkId;
@@ -148,9 +160,36 @@ public class VlanVO implements Vlan, Identity {
     public String toString() {
         if (toString == null) {
             toString = new StringBuilder("Vlan[").append(vlanTag).append("|").append(vlanGateway).append("|").append(vlanNetmask).
-                    append("|").append(ipRange).append("|").append(networkId).append("]").toString();
+                    append("|").append(ip6Gateway).append("|").append(ip6Cidr).append("|").append(ipRange).append("|").
+                    append("|").append(ip6Range).append(networkId).append("]").toString();
         }
         return toString;
     }
     
+    @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;
+	}
+
+	@Override
+	public String getIp6Range() {
+		return ip6Range;
+	}
+
+	public void setIp6Range(String ip6Range) {
+		this.ip6Range = ip6Range;
+	}
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/4bdc94aa/server/src/com/cloud/network/NetworkManager.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/NetworkManager.java b/server/src/com/cloud/network/NetworkManager.java
index d4a9b5c..57029cc 100755
--- a/server/src/com/cloud/network/NetworkManager.java
+++ b/server/src/com/cloud/network/NetworkManager.java
@@ -120,7 +120,7 @@ public interface NetworkManager  {
 
     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) 
+            long zoneId, ACLType aclType, Boolean subdomainAccess, Long vpcId, String ip6Gateway, String ip6Cidr) 
                     throws ConcurrentOperationException, InsufficientCapacityException, ResourceAllocationException;
 
     /**
@@ -164,7 +164,7 @@ public interface NetworkManager  {
 
     void allocateDirectIp(NicProfile nic, DataCenter dc,
             VirtualMachineProfile<? extends VirtualMachine> vm,
-            Network network, String requestedIp)
+            Network network, String requestedIpv4, String requestedIpv6)
             throws InsufficientVirtualNetworkCapcityException,
             InsufficientAddressCapacityException;
 
@@ -316,4 +316,7 @@ public interface NetworkManager  {
 			Long physicalNetworkId);
 
 
+	PublicIpv6Address assignPublicIp6Address(long dcId, Long podId, Account owner,
+			VlanType type, Long networkId, String requestedIp, boolean isSystem)
+			throws InsufficientAddressCapacityException;
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/4bdc94aa/server/src/com/cloud/network/NetworkManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java
index eb20207..0005854 100755
--- a/server/src/com/cloud/network/NetworkManagerImpl.java
+++ b/server/src/com/cloud/network/NetworkManagerImpl.java
@@ -111,6 +111,7 @@ import com.cloud.network.dao.PhysicalNetworkDao;
 import com.cloud.network.dao.PhysicalNetworkServiceProviderDao;
 import com.cloud.network.dao.PhysicalNetworkTrafficTypeDao;
 import com.cloud.network.dao.PhysicalNetworkTrafficTypeVO;
+import com.cloud.network.dao.PublicIpv6AddressDao;
 import com.cloud.network.element.DhcpServiceProvider;
 import com.cloud.network.element.IpDeployer;
 import com.cloud.network.element.NetworkElement;
@@ -271,6 +272,8 @@ public class NetworkManagerImpl implements NetworkManager, Manager, Listener {
     NetworkACLManager _networkACLMgr;
     @Inject
     NetworkModel _networkModel;
+    @Inject
+    PublicIpv6AddressDao _ipv6Dao;
 
     ScheduledExecutorService _executor;
 
@@ -292,6 +295,36 @@ public class NetworkManagerImpl implements NetworkManager, Manager, Listener {
         return fetchNewPublicIp(dcId, podId, null, owner, type, networkId, false, true, requestedIp, isSystem, null);
     }
 
+    @Override
+    public PublicIpv6Address assignPublicIp6Address(long dcId, Long podId, Account owner, VlanType type, Long networkId, String requestedIp, boolean isSystem) throws InsufficientAddressCapacityException {
+    	Vlan vlan = _networkModel.getVlanForNetwork(networkId);
+    	if (vlan == null) {
+    		s_logger.debug("Cannot find related vlan or too many vlan attached to network " + networkId);
+    		return null;
+    	}
+    	String ip = NetUtils.getIp6FromRange(vlan.getIp6Range());
+    	//Check for duplicate IP
+    	if (_ipv6Dao.findByDcIdAndIp(dcId, ip) != null) {
+    		//TODO regenerate ip
+    		throw new CloudRuntimeException("Fail to get unique ipv6 address");
+    	}
+    	DataCenterVO dc = _dcDao.findById(dcId);
+        Long mac = dc.getMacAddress();
+        Long nextMac = mac + 1;
+        dc.setMacAddress(nextMac);
+        _dcDao.update(dc.getId(), dc);
+        
+    	String macAddress = NetUtils.long2Mac(NetUtils.createSequenceBasedMacAddress(mac));
+    	PublicIpv6AddressVO ipVO = new PublicIpv6AddressVO(ip, dcId, macAddress, vlan.getId());
+    	ipVO.setPhysicalNetworkId(vlan.getPhysicalNetworkId());
+    	ipVO.setSourceNetworkId(vlan.getNetworkId());
+    	ipVO.setState(PublicIpv6Address.State.Allocated);
+    	ipVO.setDomainId(owner.getDomainId());
+    	ipVO.setAccountId(owner.getAccountId());
+    	_ipv6Dao.persist(ipVO);
+    	return ipVO;
+    }
+    
     @DB
     public PublicIp fetchNewPublicIp(long dcId, Long podId, Long vlanDbId, Account owner, VlanType vlanUse, 
             Long guestNetworkId, boolean sourceNat, boolean assign, String requestedIp, boolean isSystem, Long vpcId)
@@ -1350,6 +1383,11 @@ public class NetworkManagerImpl implements NetworkManager, Manager, Listener {
         }
 
         vo.setState(Nic.State.Allocated);
+        
+        vo.setIp6Address(profile.getIp6Address());
+        vo.setIp6Gateway(profile.getIp6Gateway());
+        vo.setIp6Cidr(profile.getIp6Cidr());
+        
         return deviceId;
     }
 
@@ -1818,7 +1856,7 @@ public class NetworkManagerImpl implements NetworkManager, Manager, Listener {
     @DB
     public Network createGuestNetwork(long networkOfferingId, String name, String displayText, String gateway, 
             String cidr, String vlanId, String networkDomain, Account owner, Long domainId,
-            PhysicalNetwork pNtwk, long zoneId, ACLType aclType, Boolean subdomainAccess, Long vpcId) 
+            PhysicalNetwork pNtwk, long zoneId, ACLType aclType, Boolean subdomainAccess, Long vpcId, String ip6Gateway, String ip6Cidr)
                     throws ConcurrentOperationException, InsufficientCapacityException, ResourceAllocationException {
 
         NetworkOfferingVO ntwkOff = _networkOfferingDao.findById(networkOfferingId);
@@ -1851,9 +1889,18 @@ public class NetworkManagerImpl implements NetworkManager, Manager, Listener {
             throw ex;
         }
 
+        boolean ipv6 = false;
+        
+        if (ip6Gateway != null && ip6Cidr != null) {
+        	ipv6 = true;
+        }
         // Validate zone
         DataCenterVO zone = _dcDao.findById(zoneId);
         if (zone.getNetworkType() == NetworkType.Basic) {
+        	if (ipv6) {
+                throw new InvalidParameterValueException("IPv6 is not supported in Basic zone");
+        	}
+        	
             // In Basic zone the network should have aclType=Domain, domainId=1, subdomainAccess=true
             if (aclType == null || aclType != ACLType.Domain) {
                 throw new InvalidParameterValueException("Only AclType=Domain can be specified for network creation in Basic zone");
@@ -1896,6 +1943,9 @@ public class NetworkManagerImpl implements NetworkManager, Manager, Listener {
 
         } else if (zone.getNetworkType() == NetworkType.Advanced) {
             if (zone.isSecurityGroupEnabled()) {
+            	if (ipv6) {
+            		throw new InvalidParameterValueException("IPv6 is not supported with security group!");
+            	}
                 // Only Account specific Isolated network with sourceNat service disabled are allowed in security group
                 // enabled zone
                 boolean allowCreation = (ntwkOff.getGuestType() == GuestType.Isolated 
@@ -1975,14 +2025,14 @@ public class NetworkManagerImpl implements NetworkManager, Manager, Listener {
                 }
             }
         }
-
+        
         // In Advance zone Cidr for Shared networks and Isolated networks w/o source nat service can't be NULL - 2.2.x
         // limitation, remove after we introduce support for multiple ip ranges
         // with different Cidrs for the same Shared network
         boolean cidrRequired = zone.getNetworkType() == NetworkType.Advanced && ntwkOff.getTrafficType() == TrafficType.Guest
                 && (ntwkOff.getGuestType() == GuestType.Shared || (ntwkOff.getGuestType() == GuestType.Isolated 
                 && !_networkModel.areServicesSupportedByNetworkOffering(ntwkOff.getId(), Service.SourceNat)));
-        if (cidr == null && cidrRequired) {
+        if (cidr == null && ip6Cidr == null  && cidrRequired) {
             throw new InvalidParameterValueException("StartIp/endIp/gateway/netmask are required when create network of" +
                     " type " + Network.GuestType.Shared + " and network of type " + GuestType.Isolated + " with service "
                     + Service.SourceNat.getName() + " disabled");
@@ -1993,11 +2043,11 @@ public class NetworkManagerImpl implements NetworkManager, Manager, Listener {
             throw new InvalidParameterValueException("StartIp/endIp/gateway/netmask can't be specified for zone of type " + NetworkType.Basic);
         }
 
-        // Check if cidr is RFC1918 compliant if the network is Guest Isolated
+        // Check if cidr is RFC1918 compliant if the network is Guest Isolated for IPv4
         if (cidr != null && ntwkOff.getGuestType() == Network.GuestType.Isolated && ntwkOff.getTrafficType() == TrafficType.Guest) {
-            if (!NetUtils.validateGuestCidr(cidr)) {
-                throw new InvalidParameterValueException("Virtual Guest Cidr " + cidr + " is not RFC1918 compliant");
-            }
+        	if (!NetUtils.validateGuestCidr(cidr)) {
+        		throw new InvalidParameterValueException("Virtual Guest Cidr " + cidr + " is not RFC1918 compliant");
+        	}
         }
 
         Transaction txn = Transaction.currentTxn();
@@ -2024,7 +2074,21 @@ public class NetworkManagerImpl implements NetworkManager, Manager, Listener {
                 }
             }
         }
-
+        
+        if (ip6Cidr != null && ip6Gateway != null) {
+            userNetwork.setIp6Cidr(ip6Cidr);
+            userNetwork.setIp6Gateway(ip6Gateway);
+            if (vlanId != null) {
+                userNetwork.setBroadcastUri(URI.create("vlan://" + vlanId));
+                userNetwork.setBroadcastDomainType(BroadcastDomainType.Vlan);
+                if (!vlanId.equalsIgnoreCase(Vlan.UNTAGGED)) {
+                    userNetwork.setBroadcastDomainType(BroadcastDomainType.Vlan);
+                } else {
+                    userNetwork.setBroadcastDomainType(BroadcastDomainType.Native);
+                }
+            }
+        }
+        
         List<NetworkVO> networks = setupNetwork(owner, ntwkOff, userNetwork, plan, name, displayText, true, domainId,
                 aclType, subdomainAccess, vpcId);
 
@@ -2592,7 +2656,7 @@ public class NetworkManagerImpl implements NetworkManager, Manager, Listener {
                 guestNetwork = createGuestNetwork(requiredOfferings.get(0).getId(), owner.getAccountName() + "-network"
                         , owner.getAccountName() + "-network", null, null, null, null, owner, null, physicalNetwork, 
                         zoneId, ACLType.Account,
-                        null, null);
+                        null, null, null, null);
                 if (guestNetwork == null) {
                     s_logger.warn("Failed to create default Virtual network for the account " + accountId + "in zone " + zoneId);
                     throw new CloudRuntimeException("Failed to create a Guest Isolated Networks with SourceNAT " +
@@ -3344,27 +3408,56 @@ public class NetworkManagerImpl implements NetworkManager, Manager, Listener {
         return success;
     }
 
-    public void allocateDirectIp(NicProfile nic, DataCenter dc, VirtualMachineProfile<? extends VirtualMachine> vm, Network network, String requestedIp) throws InsufficientVirtualNetworkCapcityException,
+    public void allocateDirectIp(NicProfile nic, DataCenter dc, VirtualMachineProfile<? extends VirtualMachine> vm, Network network,
+    							 String requestedIpv4, String requestedIpv6) throws InsufficientVirtualNetworkCapcityException,
             InsufficientAddressCapacityException {
-        if (nic.getIp4Address() == null) {
-            PublicIp ip = assignPublicIpAddress(dc.getId(), null, vm.getOwner(), VlanType.DirectAttached, network.getId(), requestedIp, false);
-            nic.setIp4Address(ip.getAddress().toString());
-            nic.setGateway(ip.getGateway());
-            nic.setNetmask(ip.getNetmask());
-            nic.setIsolationUri(IsolationType.Vlan.toUri(ip.getVlanTag()));
-            nic.setBroadcastType(BroadcastDomainType.Vlan);
-            nic.setBroadcastUri(BroadcastDomainType.Vlan.toUri(ip.getVlanTag()));
-            nic.setFormat(AddressFormat.Ip4);
-            nic.setReservationId(String.valueOf(ip.getVlanTag()));
-            nic.setMacAddress(ip.getMacAddress());
-        }
+    	boolean ipv4 = false, ipv6 = false;
+    	if (network.getGateway() != null) {
+    		if (nic.getIp4Address() == null) {
+    			ipv4 = true;
+    			PublicIp ip = assignPublicIpAddress(dc.getId(), null, vm.getOwner(), VlanType.DirectAttached, network.getId(), requestedIpv4, false);
+    			nic.setIp4Address(ip.getAddress().toString());
+    			nic.setGateway(ip.getGateway());
+    			nic.setNetmask(ip.getNetmask());
+    			nic.setIsolationUri(IsolationType.Vlan.toUri(ip.getVlanTag()));
+    			nic.setBroadcastType(BroadcastDomainType.Vlan);
+    			nic.setBroadcastUri(BroadcastDomainType.Vlan.toUri(ip.getVlanTag()));
+    			nic.setFormat(AddressFormat.Ip4);
+    			nic.setReservationId(String.valueOf(ip.getVlanTag()));
+    			nic.setMacAddress(ip.getMacAddress());
+    		}
+    	}
+    	
+    	if (network.getIp6Gateway() != null) {
+    		if (nic.getIp6Address() == null) {
+    			ipv6 = true;
+    			PublicIpv6Address ip = assignPublicIp6Address(dc.getId(), null, vm.getOwner(), VlanType.DirectAttached, network.getId(), requestedIpv6, false);
+    			Vlan vlan = _networkModel.getVlanForNetwork(network.getId());
+    			if (vlan == null) {
+    				s_logger.debug("Cannot find related vlan or too many vlan attached to network " + network.getId());
+    				return;
+    			}
+    			nic.setIp6Address(ip.getAddress().toString());
+    			nic.setIp6Gateway(vlan.getIp6Gateway());
+    			nic.setIp6Cidr(vlan.getIp6Cidr());
+    			if (ipv4) {
+    				nic.setFormat(AddressFormat.Mixed);
+    			} else {
+    				nic.setIsolationUri(IsolationType.Vlan.toUri(vlan.getVlanTag()));
+    				nic.setBroadcastType(BroadcastDomainType.Vlan);
+    				nic.setBroadcastUri(BroadcastDomainType.Vlan.toUri(vlan.getVlanTag()));
+    				nic.setFormat(AddressFormat.Ip6);
+    				nic.setReservationId(String.valueOf(vlan.getVlanTag()));
+    				nic.setMacAddress(ip.getMacAddress());
+    			}
+    		}
+    	}
 
         nic.setDns1(dc.getDns1());
         nic.setDns2(dc.getDns2());
     }
 
-    
-    @Override
+	@Override
     public boolean setupDns(Network network, Provider provider) {
         boolean dnsProvided = _networkModel.isProviderSupportServiceInNetwork(network.getId(), Service.Dns, provider );
         boolean dhcpProvided =_networkModel.isProviderSupportServiceInNetwork(network.getId(), Service.Dhcp, 

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/4bdc94aa/server/src/com/cloud/network/NetworkModelImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/NetworkModelImpl.java b/server/src/com/cloud/network/NetworkModelImpl.java
index 2470989..e5f0755 100644
--- a/server/src/com/cloud/network/NetworkModelImpl.java
+++ b/server/src/com/cloud/network/NetworkModelImpl.java
@@ -36,6 +36,7 @@ import com.cloud.configuration.Config;
 import com.cloud.configuration.ConfigurationManager;
 import com.cloud.configuration.dao.ConfigurationDao;
 import com.cloud.dc.PodVlanMapVO;
+import com.cloud.dc.Vlan;
 import com.cloud.dc.Vlan.VlanType;
 import com.cloud.dc.VlanVO;
 import com.cloud.dc.dao.DataCenterDao;
@@ -65,6 +66,7 @@ import com.cloud.network.dao.PhysicalNetworkServiceProviderDao;
 import com.cloud.network.dao.PhysicalNetworkServiceProviderVO;
 import com.cloud.network.dao.PhysicalNetworkTrafficTypeDao;
 import com.cloud.network.dao.PhysicalNetworkTrafficTypeVO;
+import com.cloud.network.dao.PublicIpv6AddressDao;
 import com.cloud.network.element.NetworkElement;
 import com.cloud.network.element.UserDataServiceProvider;
 import com.cloud.network.rules.FirewallRule.Purpose;
@@ -157,7 +159,8 @@ public class NetworkModelImpl  implements NetworkModel, Manager{
     NetworkServiceMapDao _ntwkSrvcDao;
     @Inject
     PrivateIpDao _privateIpDao;
-    
+    @Inject
+    PublicIpv6AddressDao _ipv6Dao;
 
 
     private final HashMap<String, NetworkOfferingVO> _systemNetworks = new HashMap<String, NetworkOfferingVO>(5);
@@ -510,7 +513,15 @@ public class NetworkModelImpl  implements NetworkModel, Manager{
         }
         boolean hasFreeIps = true;
         if (network.getGuestType() == GuestType.Shared) {
-            hasFreeIps = _ipAddressDao.countFreeIPsInNetwork(network.getId()) > 0;
+        	if (network.getGateway() != null) {
+        		hasFreeIps = _ipAddressDao.countFreeIPsInNetwork(network.getId()) > 0;
+        	}
+        	if (!hasFreeIps) {
+        		return false;
+        	}
+        	if (network.getIp6Gateway() != null) {
+        		hasFreeIps = isIP6AddressAvailable(network);
+        	}
         } else {
             hasFreeIps = (getAvailableIps(network, null)).size() > 0;
         }
@@ -518,9 +529,27 @@ public class NetworkModelImpl  implements NetworkModel, Manager{
         return hasFreeIps;
     }
 
-   
-
     @Override
+    public Vlan getVlanForNetwork(long networkId) {
+    	List<VlanVO> vlans = _vlanDao.listVlansByNetworkId(networkId);
+    	if (vlans == null || vlans.size() > 1) {
+    		s_logger.debug("Cannot find related vlan or too many vlan attached to network " + networkId);
+    		return null;
+    	}
+    	return vlans.get(0);
+    }
+
+    private boolean isIP6AddressAvailable(Network network) {
+    	if (network.getIp6Gateway() == null) {
+    		return false;
+    	}
+    	Vlan vlan = getVlanForNetwork(network.getId());
+    	long existedCount = _ipv6Dao.countExistedIpsInNetwork(network.getId());
+    	long rangeCount = NetUtils.countIp6InRange(vlan.getIp6Range());
+		return (existedCount < rangeCount);
+	}
+
+	@Override
     public Map<Service, Map<Capability, String>> getNetworkCapabilities(long networkId) {
     
         Map<Service, Map<Capability, String>> networkCapabilities = new HashMap<Service, Map<Capability, String>>();

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/4bdc94aa/server/src/com/cloud/network/NetworkServiceImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/NetworkServiceImpl.java b/server/src/com/cloud/network/NetworkServiceImpl.java
index dc8f549..3a7dc49 100755
--- a/server/src/com/cloud/network/NetworkServiceImpl.java
+++ b/server/src/com/cloud/network/NetworkServiceImpl.java
@@ -644,6 +644,11 @@ public class NetworkServiceImpl implements  NetworkService, Manager {
         boolean isDomainSpecific = false;
         Boolean subdomainAccess = cmd.getSubdomainAccess();
         Long vpcId = cmd.getVpcId();
+        String startIPv6 = cmd.getStartIpv6();
+        String endIPv6 = cmd.getEndIpv6();
+        String ip6Gateway = cmd.getIp6Gateway();
+        String ip6Cidr = cmd.getIp6Cidr();
+        Boolean dualStack = cmd.isDualStack();
 
         // Validate network offering
         NetworkOfferingVO ntwkOff = _networkOfferingDao.findById(networkOfferingId);
@@ -761,36 +766,85 @@ public class NetworkServiceImpl implements  NetworkService, Manager {
         UserContext.current().setAccountId(owner.getAccountId());
 
         // VALIDATE IP INFO
-        // if end ip is not specified, default it to startIp
+        if (startIPv6 != null && startIP != null && (dualStack == null || dualStack == false)) {
+        	throw new InvalidParameterValueException("Cannot specify both IPv4 and IPv6 address without set dualStack = true!");
+        }
+        
+        boolean ipv4 = false, ipv6 = false;
         if (startIP != null) {
-            if (!NetUtils.isValidIp(startIP)) {
-                throw new InvalidParameterValueException("Invalid format for the startIp parameter");
-            }
-            if (endIP == null) {
-                endIP = startIP;
-            } else if (!NetUtils.isValidIp(endIP)) {
-                throw new InvalidParameterValueException("Invalid format for the endIp parameter");
-            }
+        	ipv4 = true;
         }
-
-        if (startIP != null && endIP != null) {
-            if (!(gateway != null && netmask != null)) {
-                throw new InvalidParameterValueException("gateway and netmask should be defined when startIP/endIP are passed in");
-            }
+        if (startIPv6 != null) {
+        	ipv6 = true;
         }
-
+        
         String cidr = null;
-        if (gateway != null && netmask != null) {
-            if (!NetUtils.isValidIp(gateway)) {
-                throw new InvalidParameterValueException("Invalid gateway");
-            }
-            if (!NetUtils.isValidNetmask(netmask)) {
-                throw new InvalidParameterValueException("Invalid netmask");
-            }
+        if (ipv4) {
+        	// if end ip is not specified, default it to startIp
+        	if (startIP != null) {
+        		if (!NetUtils.isValidIp(startIP)) {
+        			throw new InvalidParameterValueException("Invalid format for the startIp parameter");
+        		}
+        		if (endIP == null) {
+        			endIP = startIP;
+        		} else if (!NetUtils.isValidIp(endIP)) {
+        			throw new InvalidParameterValueException("Invalid format for the endIp parameter");
+        		}
+        	}
+
+        	if (startIP != null && endIP != null) {
+        		if (!(gateway != null && netmask != null)) {
+        			throw new InvalidParameterValueException("gateway and netmask should be defined when startIP/endIP are passed in");
+        		}
+        	}
+
+        	if (gateway != null && netmask != null) {
+        		if (!NetUtils.isValidIp(gateway)) {
+        			throw new InvalidParameterValueException("Invalid gateway");
+        		}
+        		if (!NetUtils.isValidNetmask(netmask)) {
+        			throw new InvalidParameterValueException("Invalid netmask");
+        		}
+
+        		cidr = NetUtils.ipAndNetMaskToCidr(gateway, netmask);
+        	}
 
-            cidr = NetUtils.ipAndNetMaskToCidr(gateway, netmask);
         }
-
+        
+        if (ipv6) {
+        	if (!NetUtils.isValidIPv6(startIPv6)) {
+        		throw new InvalidParameterValueException("Invalid format for the startIPv6 parameter");
+        	}
+        	if (endIPv6 == null) {
+        		endIPv6 = startIPv6;
+        	} else if (!NetUtils.isValidIPv6(endIPv6)) {
+        		throw new InvalidParameterValueException("Invalid format for the endIPv6 parameter");
+        	}
+        	
+        	if (!(ip6Gateway != null && ip6Cidr != null)) {
+        		throw new InvalidParameterValueException("ip6Gateway and ip6Cidr should be defined when startIPv6/endIPv6 are passed in");
+        	}
+        	
+        	if (!NetUtils.isValidIPv6(ip6Gateway)) {
+        		throw new InvalidParameterValueException("Invalid ip6Gateway");
+        	}
+        	if (!NetUtils.isValidIp6Cidr(ip6Cidr)) {
+        		throw new InvalidParameterValueException("Invalid ip6cidr");
+        	}
+        	
+        	int cidrSize = NetUtils.getIp6CidrSize(ip6Cidr);
+        	// Ipv6 cidr limit should be at least /64
+        	if (cidrSize < 64) {
+        		throw new InvalidParameterValueException("The cidr size of IPv6 must be bigger than 64 bits!");
+        	}
+        }
+
+        if (ipv6) {
+        	if (zone.getNetworkType() != NetworkType.Advanced || ntwkOff.getGuestType() != Network.GuestType.Shared) {
+        		throw new InvalidParameterValueException("Can only support create IPv6 network with advance shared network!");
+        	}
+        }
+        
         // Regular user can create Guest Isolated Source Nat enabled network only
         if (caller.getType() == Account.ACCOUNT_TYPE_NORMAL
                 && (ntwkOff.getTrafficType() != TrafficType.Guest || ntwkOff.getGuestType() != Network.GuestType.Isolated
@@ -804,19 +858,25 @@ public class NetworkServiceImpl implements  NetworkService, Manager {
         if (caller.getType() == Account.ACCOUNT_TYPE_NORMAL && (ntwkOff.getSpecifyVlan() || vlanId != null)) {
             throw new InvalidParameterValueException("Regular user is not allowed to specify vlanId");
         }
+        
+        if (ipv4) {
+        	// For non-root admins check cidr limit - if it's allowed by global config value
+        	if (caller.getType() != Account.ACCOUNT_TYPE_ADMIN && cidr != null) {
 
-        // For non-root admins check cidr limit - if it's allowed by global config value
-        if (caller.getType() != Account.ACCOUNT_TYPE_ADMIN && cidr != null) {
-
-            String[] cidrPair = cidr.split("\\/");
-            int cidrSize = Integer.valueOf(cidrPair[1]);
+        		String[] cidrPair = cidr.split("\\/");
+        		int cidrSize = Integer.valueOf(cidrPair[1]);
 
-            if (cidrSize < _cidrLimit) {
-                throw new InvalidParameterValueException("Cidr size can't be less than " + _cidrLimit);
-            }
+        		if (cidrSize < _cidrLimit) {
+        			throw new InvalidParameterValueException("Cidr size can't be less than " + _cidrLimit);
+        		}
+        	}
         }
 
         Collection<String> ntwkProviders = _networkMgr.finalizeServicesAndProvidersForNetwork(ntwkOff, physicalNetworkId).values();
+        if (ipv6 && providersConfiguredForExternalNetworking(ntwkProviders)) {
+        	throw new InvalidParameterValueException("Cannot support IPv6 on network offering with external devices!");
+        }
+        
         if (cidr != null && providersConfiguredForExternalNetworking(ntwkProviders)) {
             if (ntwkOff.getGuestType() == GuestType.Shared && (zone.getNetworkType() == NetworkType.Advanced) &&
                     isSharedNetworkOfferingWithServices(networkOfferingId)) {
@@ -827,7 +887,6 @@ public class NetworkServiceImpl implements  NetworkService, Manager {
             }
         }
 
-
         // Vlan is created in 2 cases - works in Advance zone only:
         // 1) GuestType is Shared
         // 2) GuestType is Isolated, but SourceNat service is disabled
@@ -835,6 +894,13 @@ public class NetworkServiceImpl implements  NetworkService, Manager {
                 && ((ntwkOff.getGuestType() == Network.GuestType.Shared)
                 || (ntwkOff.getGuestType() == GuestType.Isolated && 
                 !areServicesSupportedByNetworkOffering(ntwkOff.getId(), Service.SourceNat))));
+        
+        if (!createVlan) {
+        	// Only support advance shared network in IPv6, which means createVlan is a must
+        	if (ipv6) {
+        		createVlan = true;
+        	}
+        }
 
         // Can add vlan range only to the network which allows it
         if (createVlan && !ntwkOff.getSpecifyIpRanges()) {
@@ -880,13 +946,13 @@ public class NetworkServiceImpl implements  NetworkService, Manager {
                 throw new InvalidParameterValueException("Network offering can be used for VPC networks only");
             }
             network = _networkMgr.createGuestNetwork(networkOfferingId, name, displayText, gateway, cidr, vlanId, 
-                    networkDomain, owner, sharedDomainId, pNtwk, zoneId, aclType, subdomainAccess, vpcId);
+            		networkDomain, owner, sharedDomainId, pNtwk, zoneId, aclType, subdomainAccess, vpcId, ip6Gateway, ip6Cidr);
         }  
 
         if (caller.getType() == Account.ACCOUNT_TYPE_ADMIN && createVlan) {
             // Create vlan ip range
             _configMgr.createVlanAndPublicIpRange(pNtwk.getDataCenterId(), network.getId(), physicalNetworkId,
-                    false, null, startIP, endIP, gateway, netmask, vlanId, null);
+                    false, null, startIP, endIP, gateway, netmask, vlanId, null, startIPv6, endIPv6, ip6Gateway, ip6Cidr);
         }
 
         txn.commit();
@@ -2866,7 +2932,7 @@ public class NetworkServiceImpl implements  NetworkService, Manager {
         if (privateNetwork == null) {
             //create Guest network
             privateNetwork = _networkMgr.createGuestNetwork(ntwkOff.getId(), networkName, displayText, gateway, cidr, vlan, 
-                    null, owner, null, pNtwk, pNtwk.getDataCenterId(), ACLType.Account, null, null);
+                    null, owner, null, pNtwk, pNtwk.getDataCenterId(), ACLType.Account, null, null, null, null);
             s_logger.debug("Created private network " + privateNetwork);
         } else {
             s_logger.debug("Private network already exists: " + privateNetwork);

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/4bdc94aa/server/src/com/cloud/network/NetworkVO.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/NetworkVO.java b/server/src/com/cloud/network/NetworkVO.java
index 39dd66e..90e5f21 100644
--- a/server/src/com/cloud/network/NetworkVO.java
+++ b/server/src/com/cloud/network/NetworkVO.java
@@ -150,6 +150,12 @@ public class NetworkVO implements Network, Identity {
     @Column(name="specify_ip_ranges")
     boolean specifyIpRanges = false;
     
+    @Column(name="ip6_gateway")
+    String ip6Gateway;
+
+    @Column(name="ip6_cidr")
+    String ip6Cidr;
+
     public NetworkVO() {
     	this.uuid = UUID.randomUUID().toString();
     }
@@ -196,6 +202,8 @@ public class NetworkVO implements Network, Identity {
             state = State.Allocated;
         }
     	this.uuid = UUID.randomUUID().toString();
+    	this.ip6Gateway = that.getIp6Gateway();
+    	this.ip6Cidr = that.getIp6Cidr();
     }
 
     /**
@@ -492,4 +500,20 @@ public class NetworkVO implements Network, Identity {
     public Long getVpcId() {
         return vpcId;
     }
+
+	public String getIp6Cidr() {
+		return ip6Cidr;
+	}
+
+	public void setIp6Cidr(String ip6Cidr) {
+		this.ip6Cidr = ip6Cidr;
+	}
+
+	public String getIp6Gateway() {
+		return ip6Gateway;
+	}
+
+	public void setIp6Gateway(String ip6Gateway) {
+		this.ip6Gateway = ip6Gateway;
+	}
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/4bdc94aa/server/src/com/cloud/network/PublicIpv6Address.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/PublicIpv6Address.java b/server/src/com/cloud/network/PublicIpv6Address.java
new file mode 100644
index 0000000..58f2cee
--- /dev/null
+++ b/server/src/com/cloud/network/PublicIpv6Address.java
@@ -0,0 +1,56 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package com.cloud.network;
+
+import com.cloud.acl.ControlledEntity;
+import com.cloud.api.Identity;
+
+/**
+ * @author Sheng Yang
+ *
+ */
+public interface PublicIpv6Address extends ControlledEntity, Identity {
+    enum State {
+        Allocating, // The IP Address is being propagated to other network elements and is not ready for use yet.
+        Allocated, // The IP address is in used.
+        Releasing, // The IP address is being released for other network elements and is not ready for allocation.
+        Free // The IP address is ready to be allocated.
+    }
+
+    /**
+     * @return database id.
+     */
+    long getId();
+    
+    long getDataCenterId();
+
+    String getAddress();
+
+    long getVlanId();
+
+    State getState();
+
+    Long getNetworkId();
+    
+    Long getSourceNetworkId();
+
+    Long getPhysicalNetworkId();
+
+    void setState(PublicIpv6Address.State state);
+    
+    String getMacAddress();
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/4bdc94aa/server/src/com/cloud/network/PublicIpv6AddressVO.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/PublicIpv6AddressVO.java b/server/src/com/cloud/network/PublicIpv6AddressVO.java
new file mode 100644
index 0000000..7594fc1
--- /dev/null
+++ b/server/src/com/cloud/network/PublicIpv6AddressVO.java
@@ -0,0 +1,189 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package com.cloud.network;
+
+import java.util.Date;
+import java.util.UUID;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.Transient;
+
+import com.cloud.utils.db.GenericDao;
+
+@Entity
+@Table(name=("public_ipv6_address"))
+public class PublicIpv6AddressVO implements PublicIpv6Address {
+    @Id
+    @GeneratedValue(strategy=GenerationType.IDENTITY)
+    @Column(name="id")
+    long id;
+
+	@Id
+	@Column(name="ip_address")
+	@Enumerated(value=EnumType.STRING)
+	private String address = null;
+
+	@Column(name="data_center_id", updatable=false)
+	private long dataCenterId;
+
+	@Column(name="vlan_id")
+	private long vlanId;
+
+	@Column(name="state")
+	private State state;
+
+	@Column(name="mac_address")
+	private String macAddress;
+
+	@Column(name="source_network_id")
+    private Long sourceNetworkId;
+
+	@Column(name="network_id")
+	private Long networkId;
+
+	@Column(name="uuid")
+	private String uuid;
+
+    @Column(name="physical_network_id")
+    private Long physicalNetworkId;
+
+	@Column(name="account_id")
+	private Long accountId = null;
+
+    @Column(name="domain_id")
+    private Long domainId = null;
+	
+    @Column(name = GenericDao.CREATED_COLUMN)
+    Date created;
+	
+	protected PublicIpv6AddressVO() {
+		this.uuid = UUID.randomUUID().toString();
+	}
+
+	public PublicIpv6AddressVO(String address, long dataCenterId, String macAddress, long vlanDbId) {
+		this.address = address;
+		this.dataCenterId = dataCenterId;
+		this.vlanId = vlanDbId;
+		this.state = State.Free;
+		this.setMacAddress(macAddress);
+		this.uuid = UUID.randomUUID().toString();
+	}
+
+
+	@Override
+	public long getAccountId() {
+		return accountId;
+	}
+
+	@Override
+	public long getDomainId() {
+		return domainId;
+	}
+
+	@Override
+	public String getUuid() {
+		return uuid;
+	}
+
+	@Override
+	public long getId() {
+		return id;
+	}
+
+	@Override
+	public long getDataCenterId() {
+		return dataCenterId;
+	}
+
+	@Override
+	public String getAddress() {
+		return address;
+	}
+
+	@Override
+	public long getVlanId() {
+		return vlanId;
+	}
+
+	@Override
+	public State getState() {
+		return state;
+	}
+
+	@Override
+	public Long getNetworkId() {
+		return networkId;
+	}
+
+	@Override
+	public Long getSourceNetworkId() {
+		return sourceNetworkId;
+	}
+
+	@Override
+	public Long getPhysicalNetworkId() {
+		return physicalNetworkId;
+	}
+
+	@Override
+	public void setState(State state) {
+		this.state = state;
+	}
+
+	public String getMacAddress() {
+		return macAddress;
+	}
+
+	public void setMacAddress(String macAddress) {
+		this.macAddress = macAddress;
+	}
+
+	public void setSourceNetworkId(Long sourceNetworkId) {
+		this.sourceNetworkId = sourceNetworkId;
+	}
+
+	public void setNetworkId(Long networkId) {
+		this.networkId = networkId;
+	}
+
+	public void setPhysicalNetworkId(Long physicalNetworkId) {
+		this.physicalNetworkId = physicalNetworkId;
+	}
+
+	public void setDomainId(Long domainId) {
+		this.domainId = domainId;
+	}
+
+	public void setAccountId(Long accountId) {
+		this.accountId = accountId;
+	}
+
+	public Date getCreated() {
+		return created;
+	}
+
+	public void setCreated(Date created) {
+		this.created = created;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/4bdc94aa/server/src/com/cloud/network/addr/PublicIp.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/addr/PublicIp.java b/server/src/com/cloud/network/addr/PublicIp.java
index e1f77be..4611b70 100644
--- a/server/src/com/cloud/network/addr/PublicIp.java
+++ b/server/src/com/cloud/network/addr/PublicIp.java
@@ -200,4 +200,19 @@ public class PublicIp implements PublicIpAddress {
     public void setVpcId(Long vpcId) {
         _addr.setVpcId(vpcId);
     }
+
+	@Override
+	public String getIp6Gateway() {
+		return _vlan.getIp6Gateway();
+	}
+
+	@Override
+	public String getIp6Cidr() {
+		return _vlan.getIp6Cidr();
+	}
+
+	@Override
+	public String getIp6Range() {
+		return _vlan.getIp6Range();
+	}
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/4bdc94aa/server/src/com/cloud/network/dao/PublicIpv6AddressDao.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/dao/PublicIpv6AddressDao.java b/server/src/com/cloud/network/dao/PublicIpv6AddressDao.java
new file mode 100644
index 0000000..b8de08a
--- /dev/null
+++ b/server/src/com/cloud/network/dao/PublicIpv6AddressDao.java
@@ -0,0 +1,23 @@
+package com.cloud.network.dao;
+
+import java.util.List;
+
+import com.cloud.network.Network;
+import com.cloud.network.PublicIpv6AddressVO;
+import com.cloud.utils.db.GenericDao;
+
+public interface PublicIpv6AddressDao extends GenericDao<PublicIpv6AddressVO, Long> {
+	List<PublicIpv6AddressVO> listByAccount(long accountId);
+	
+	List<PublicIpv6AddressVO> listByVlanId(long vlanId);
+	
+	List<PublicIpv6AddressVO> listByDcId(long dcId); 
+	
+	List<PublicIpv6AddressVO> listByNetwork(long networkId);
+	
+	public PublicIpv6AddressVO findByDcIdAndIp(long dcId, String ipAddress);
+
+	List<PublicIpv6AddressVO> listByPhysicalNetworkId(long physicalNetworkId);
+
+	long countExistedIpsInNetwork(long networkId);
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/4bdc94aa/server/src/com/cloud/network/dao/PublicIpv6AddressDaoImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/dao/PublicIpv6AddressDaoImpl.java b/server/src/com/cloud/network/dao/PublicIpv6AddressDaoImpl.java
new file mode 100644
index 0000000..6883d4e
--- /dev/null
+++ b/server/src/com/cloud/network/dao/PublicIpv6AddressDaoImpl.java
@@ -0,0 +1,96 @@
+package com.cloud.network.dao;
+
+import java.util.List;
+import java.util.Map;
+
+import javax.ejb.Local;
+import javax.naming.ConfigurationException;
+
+import org.apache.log4j.Logger;
+
+import com.cloud.network.Network;
+import com.cloud.network.PublicIpv6AddressVO;
+import com.cloud.utils.Pair;
+import com.cloud.utils.db.Filter;
+import com.cloud.utils.db.GenericDaoBase;
+import com.cloud.utils.db.GenericSearchBuilder;
+import com.cloud.utils.db.SearchBuilder;
+import com.cloud.utils.db.SearchCriteria;
+import com.cloud.utils.db.SearchCriteria.Func;
+import com.cloud.utils.db.SearchCriteria.Op;
+import com.cloud.utils.db.SearchCriteria2;
+
+@Local(value=PublicIpv6AddressDao.class)
+public class PublicIpv6AddressDaoImpl extends GenericDaoBase<PublicIpv6AddressVO, Long> implements PublicIpv6AddressDao {
+    private static final Logger s_logger = Logger.getLogger(IPAddressDaoImpl.class);
+
+    protected final SearchBuilder<PublicIpv6AddressVO> AllFieldsSearch;
+    protected GenericSearchBuilder<PublicIpv6AddressVO, Long> CountFreePublicIps;
+    
+    public PublicIpv6AddressDaoImpl() {
+        AllFieldsSearch = createSearchBuilder();
+        AllFieldsSearch.and("id", AllFieldsSearch.entity().getId(), Op.EQ);
+        AllFieldsSearch.and("dataCenterId", AllFieldsSearch.entity().getDataCenterId(), Op.EQ);
+        AllFieldsSearch.and("ipAddress", AllFieldsSearch.entity().getAddress(), Op.EQ);
+        AllFieldsSearch.and("vlan", AllFieldsSearch.entity().getVlanId(), Op.EQ);
+        AllFieldsSearch.and("accountId", AllFieldsSearch.entity().getAccountId(), Op.EQ);
+        AllFieldsSearch.and("network", AllFieldsSearch.entity().getNetworkId(), Op.EQ);
+        AllFieldsSearch.and("physicalNetworkId", AllFieldsSearch.entity().getPhysicalNetworkId(), Op.EQ);
+        AllFieldsSearch.done();
+        
+        CountFreePublicIps = createSearchBuilder(Long.class);
+        CountFreePublicIps.select(null, Func.COUNT, null);
+        CountFreePublicIps.and("networkId", CountFreePublicIps.entity().getSourceNetworkId(), SearchCriteria.Op.EQ);
+        CountFreePublicIps.done();
+    }
+
+	@Override
+	public List<PublicIpv6AddressVO> listByAccount(long accountId) {
+        SearchCriteria<PublicIpv6AddressVO> sc = AllFieldsSearch.create();
+        sc.setParameters("accountId", accountId);
+        return listBy(sc);
+	}
+
+	@Override
+	public List<PublicIpv6AddressVO> listByVlanId(long vlanId) {
+        SearchCriteria<PublicIpv6AddressVO> sc = AllFieldsSearch.create();
+        sc.setParameters("vlan", vlanId);
+        return listBy(sc);
+	}
+
+	@Override
+	public List<PublicIpv6AddressVO> listByDcId(long dcId) {
+        SearchCriteria<PublicIpv6AddressVO> sc = AllFieldsSearch.create();
+        sc.setParameters("dataCenterId", dcId);
+        return listBy(sc);
+	}
+
+	@Override
+	public List<PublicIpv6AddressVO> listByNetwork(long networkId) {
+        SearchCriteria<PublicIpv6AddressVO> sc = AllFieldsSearch.create();
+        sc.setParameters("network", networkId);
+        return listBy(sc);
+	}
+
+	@Override
+	public PublicIpv6AddressVO findByDcIdAndIp(long dcId, String ipAddress) {
+        SearchCriteria<PublicIpv6AddressVO> sc = AllFieldsSearch.create();
+        sc.setParameters("dataCenterId", dcId);
+        sc.setParameters("ipAddress", ipAddress);
+        return findOneBy(sc);
+	}
+
+	@Override
+	public List<PublicIpv6AddressVO> listByPhysicalNetworkId(long physicalNetworkId) {
+        SearchCriteria<PublicIpv6AddressVO> sc = AllFieldsSearch.create();
+        sc.setParameters("physicalNetworkId", physicalNetworkId);
+        return listBy(sc);
+	}
+
+	@Override
+	public long countExistedIpsInNetwork(long networkId) {
+        SearchCriteria<Long> sc = CountFreePublicIps.create();
+        sc.setParameters("networkId", networkId);
+        return customSearch(sc, null).get(0);       
+	}
+}