Add DriverOpts for routers
diff --git a/openstack/networking/v2/extensions/layer3/routers/requests.go b/openstack/networking/v2/extensions/layer3/routers/requests.go
index 8b6e73d..a5f2644 100644
--- a/openstack/networking/v2/extensions/layer3/routers/requests.go
+++ b/openstack/networking/v2/extensions/layer3/routers/requests.go
@@ -18,6 +18,7 @@
 	AdminStateUp *bool  `q:"admin_state_up"`
 	Status       string `q:"status"`
 	TenantID     string `q:"tenant_id"`
+	RouterType   string `q:"router_type"`
 	Limit        int    `q:"limit"`
 	Marker       string `q:"marker"`
 	SortKey      string `q:"sort_key"`
@@ -47,6 +48,7 @@
 	Name         string
 	AdminStateUp *bool
 	TenantID     string
+	DriverOpts   map[string]string
 	GatewayInfo  *GatewayInfo
 }
 
@@ -59,27 +61,37 @@
 // an external network (it is external if its `router:external' field is set to
 // true).
 func Create(c *gophercloud.ServiceClient, opts CreateOpts) CreateResult {
-	type router struct {
-		Name         *string      `json:"name,omitempty"`
-		AdminStateUp *bool        `json:"admin_state_up,omitempty"`
-		TenantID     *string      `json:"tenant_id,omitempty"`
-		GatewayInfo  *GatewayInfo `json:"external_gateway_info,omitempty"`
-	}
 
 	type request struct {
-		Router router `json:"router"`
+		Router map[string]interface{} `json:"router"`
 	}
 
-	reqBody := request{Router: router{
-		Name:         gophercloud.MaybeString(opts.Name),
-		AdminStateUp: opts.AdminStateUp,
-		TenantID:     gophercloud.MaybeString(opts.TenantID),
-	}}
+	routerMap := make(map[string]interface{})
+
+	if gophercloud.MaybeString(opts.Name) != nil {
+		routerMap["name"] = opts.Name
+	}
+
+	if opts.AdminStateUp != nil {
+		routerMap["admin_state_up"] = opts.AdminStateUp
+	}
+
+	if gophercloud.MaybeString(opts.TenantID) != nil {
+		routerMap["tenant_id"] = opts.TenantID
+	}
 
 	if opts.GatewayInfo != nil {
-		reqBody.Router.GatewayInfo = opts.GatewayInfo
+		routerMap["external_gateway_info"] = opts.GatewayInfo
 	}
 
+	if opts.DriverOpts != nil {
+		for k, v := range opts.DriverOpts {
+			routerMap[k] = v
+		}
+	}
+
+	reqBody := request{Router: routerMap}
+
 	var res CreateResult
 	_, res.Err = c.Post(rootURL(c), reqBody, &res.Body, nil)
 	return res
diff --git a/openstack/networking/v2/extensions/layer3/routers/requests_test.go b/openstack/networking/v2/extensions/layer3/routers/requests_test.go
index 1981733..1bb0745 100644
--- a/openstack/networking/v2/extensions/layer3/routers/requests_test.go
+++ b/openstack/networking/v2/extensions/layer3/routers/requests_test.go
@@ -37,6 +37,7 @@
             "name": "second_routers",
             "admin_state_up": true,
             "tenant_id": "6b96ff0cb17a4b859e1e575d221683d3",
+						"router_type": "shared",
             "id": "7177abc4-5ae9-4bb7-b0d4-89e94a4abf3b"
         },
         {
@@ -47,6 +48,7 @@
             "name": "router1",
             "admin_state_up": true,
             "tenant_id": "33a40233088643acb66ff6eb0ebea679",
+						"router_type": "shared",
             "id": "a9254bdb-2613-4a13-ac4c-adc581fba50d"
         }
     ]
@@ -72,6 +74,7 @@
 				Name:         "second_routers",
 				ID:           "7177abc4-5ae9-4bb7-b0d4-89e94a4abf3b",
 				TenantID:     "6b96ff0cb17a4b859e1e575d221683d3",
+				RouterType:   "shared",
 			},
 			Router{
 				Status:       "ACTIVE",
@@ -80,6 +83,7 @@
 				Name:         "router1",
 				ID:           "a9254bdb-2613-4a13-ac4c-adc581fba50d",
 				TenantID:     "33a40233088643acb66ff6eb0ebea679",
+				RouterType:   "shared",
 			},
 		}
 
@@ -127,6 +131,7 @@
         "name": "foo_router",
         "admin_state_up": false,
         "tenant_id": "6b96ff0cb17a4b859e1e575d221683d3",
+				"router_type": "shared",
         "id": "8604a0de-7f6b-409a-a47c-a1cc7bc77b2e"
     }
 }
@@ -176,6 +181,7 @@
         "name": "router1",
         "admin_state_up": true,
         "tenant_id": "d6554fe62e2f41efbb6e026fad5c1542",
+				"router_type": "shared",
         "id": "a07eea83-7710-4860-931b-5fe220fae533"
     }
 }
@@ -233,6 +239,7 @@
         "name": "new_name",
         "admin_state_up": true,
         "tenant_id": "6b96ff0cb17a4b859e1e575d221683d3",
+				"router_type": "shared",
         "id": "8604a0de-7f6b-409a-a47c-a1cc7bc77b2e",
         "routes": [
             {
@@ -287,6 +294,7 @@
         "name": "name",
         "admin_state_up": true,
         "tenant_id": "6b96ff0cb17a4b859e1e575d221683d3",
+				"router_type": "shared",
         "id": "8604a0de-7f6b-409a-a47c-a1cc7bc77b2e",
         "routes": []
     }
diff --git a/openstack/networking/v2/extensions/layer3/routers/results.go b/openstack/networking/v2/extensions/layer3/routers/results.go
index 5e297ab..b65a8bc 100644
--- a/openstack/networking/v2/extensions/layer3/routers/results.go
+++ b/openstack/networking/v2/extensions/layer3/routers/results.go
@@ -45,6 +45,9 @@
 	// other than its own.
 	TenantID string `json:"tenant_id" mapstructure:"tenant_id"`
 
+	// Whether router is Exclusive or Shared.
+	RouterType string `json:"router_type" mapstructure:"router_type"`
+
 	Routes []Route `json:"routes" mapstructure:"routes"`
 }