[netstack] Remove package netiface

NET-1223 #done

Change-Id: Ieb632a2f7083ccfb689e12a06bdb75aed974f5d5
diff --git a/src/connectivity/network/netstack/fuchsia_net_stack.go b/src/connectivity/network/netstack/fuchsia_net_stack.go
index 8e7fa5e..c254edf 100644
--- a/src/connectivity/network/netstack/fuchsia_net_stack.go
+++ b/src/connectivity/network/netstack/fuchsia_net_stack.go
@@ -72,7 +72,7 @@
 			Mtu:                  uint32(ifs.endpoint.MTU()),
 			AdministrativeStatus: administrativeStatus,
 			PhysicalStatus:       physicalStatus,
-			Features:             ifs.mu.nic.Features,
+			Features:             ifs.features,
 			Addresses:            addrs,
 		},
 	}
diff --git a/src/connectivity/network/netstack/netiface/netiface.go b/src/connectivity/network/netstack/netiface/netiface.go
deleted file mode 100644
index 4b0aca9..0000000
--- a/src/connectivity/network/netstack/netiface/netiface.go
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package netiface
-
-import (
-	"netstack/routes"
-
-	"github.com/google/netstack/tcpip"
-)
-
-// TODO(NET-1223):This should be moved into netstack.go.
-type NIC struct {
-	IsDynamicAddr bool
-	Name          string
-	Features      uint32
-	Metric        routes.Metric // used as a default for routes that use this NIC
-	DNSServers    []tcpip.Address
-}
diff --git a/src/connectivity/network/netstack/netstack.go b/src/connectivity/network/netstack/netstack.go
index 3db5f82..c3879bc 100644
--- a/src/connectivity/network/netstack/netstack.go
+++ b/src/connectivity/network/netstack/netstack.go
@@ -18,7 +18,6 @@
 	"netstack/link"
 	"netstack/link/bridge"
 	"netstack/link/eth"
-	"netstack/netiface"
 	"netstack/routes"
 	"netstack/util"
 
@@ -84,12 +83,17 @@
 	ns    *Netstack
 	eth   link.Controller
 	nicid tcpip.NICID
-	mu    struct {
+	// features can include any value that's valid in fuchsia.hardware.ethernet.Info.features.
+	features uint32
+	mu       struct {
 		sync.Mutex
-		state link.State
-		// TODO(NET-1223): remove and replace with refs to stack via ns
-		nic  *netiface.NIC
-		dhcp struct {
+		state          link.State
+		hasDynamicAddr bool
+		name           string
+		// metric is used by default for routes that originate from this NIC.
+		metric     routes.Metric
+		dnsServers []tcpip.Address
+		dhcp       struct {
 			*dhcp.Client
 			// running must not be nil.
 			running func() bool
@@ -176,7 +180,7 @@
 
 		enabled := ifs.mu.state == link.StateStarted
 		if metricTracksInterface {
-			metric = ifs.mu.nic.Metric
+			metric = ifs.mu.metric
 		}
 
 		ns.mu.routeTable.AddRoute(r, metric, metricTracksInterface, dynamic, enabled)
@@ -350,28 +354,28 @@
 
 func (ifs *ifState) updateMetric(metric routes.Metric) {
 	ifs.mu.Lock()
-	ifs.mu.nic.Metric = metric
+	ifs.mu.metric = metric
 	ifs.mu.Unlock()
 }
 
 func (ifs *ifState) dhcpAcquired(oldAddr, newAddr tcpip.Address, config dhcp.Config) {
 	if oldAddr != "" && oldAddr != newAddr {
-		syslog.Infof("NIC %s: DHCP IP %s expired", ifs.mu.nic.Name, oldAddr)
+		syslog.Infof("NIC %s: DHCP IP %s expired", ifs.mu.name, oldAddr)
 	}
 	if config.Error != nil {
 		syslog.Errorf("%v", config.Error)
 		return
 	}
 	if newAddr == "" {
-		syslog.Errorf("NIC %s: DHCP could not acquire address", ifs.mu.nic.Name)
+		syslog.Errorf("NIC %s: DHCP could not acquire address", ifs.mu.name)
 		return
 	}
-	syslog.Infof("NIC %s: DHCP acquired IP %s for %s", ifs.mu.nic.Name, newAddr, config.LeaseLength)
-	syslog.Infof("NIC %s: Adding DNS servers: %v", ifs.mu.nic.Name, config.DNS)
+	syslog.Infof("NIC %s: DHCP acquired IP %s for %s", ifs.mu.name, newAddr, config.LeaseLength)
+	syslog.Infof("NIC %s: Adding DNS servers: %v", ifs.mu.name, config.DNS)
 
 	ifs.mu.Lock()
-	ifs.mu.nic.IsDynamicAddr = true
-	ifs.mu.nic.DNSServers = config.DNS
+	ifs.mu.hasDynamicAddr = true
+	ifs.mu.dnsServers = config.DNS
 	ifs.mu.Unlock()
 
 	// Add a default route and a route for the local subnet.
@@ -409,7 +413,7 @@
 	if c := ifs.mu.dhcp.Client; c != nil {
 		c.Run(ctx)
 	} else {
-		panic(fmt.Sprintf("nil DHCP client on interface %s", ifs.mu.nic.Name))
+		panic(fmt.Sprintf("nil DHCP client on interface %s", ifs.mu.name))
 	}
 }
 
@@ -427,16 +431,16 @@
 		delete(ifs.ns.mu.ifStates, ifs.nicid)
 		fallthrough
 	case link.StateDown:
-		syslog.Infof("NIC %s: stopped", ifs.mu.nic.Name)
+		syslog.Infof("NIC %s: stopped", ifs.mu.name)
 		ifs.mu.dhcp.cancel()
 
 		// TODO(crawshaw): more cleanup to be done here:
 		// 	- remove link endpoint
 		//	- reclaim NICID?
 
-		if ifs.mu.nic.IsDynamicAddr || s == link.StateClosed {
+		if ifs.mu.hasDynamicAddr || s == link.StateClosed {
 			syslog.Infof("removing IP from NIC %d", ifs.nicid)
-			ifs.mu.nic.DNSServers = nil
+			ifs.mu.dnsServers = nil
 		}
 
 		if s == link.StateClosed {
@@ -448,7 +452,7 @@
 		}
 
 	case link.StateStarted:
-		syslog.Infof("NIC %s: starting", ifs.mu.nic.Name)
+		syslog.Infof("NIC %s: starting", ifs.mu.name)
 		// Re-enable static routes out this interface.
 		ifs.ns.UpdateRoutesByInterfaceLocked(ifs.nicid, routes.ActionEnableStatic)
 		if ifs.mu.dhcp.enabled {
@@ -483,20 +487,20 @@
 	refs := make([]*[]tcpip.Address, 0, len(ns.mu.ifStates))
 	for _, ifs := range ns.mu.ifStates {
 		ifs.mu.Lock()
-		refs = append(refs, &ifs.mu.nic.DNSServers)
+		refs = append(refs, &ifs.mu.dnsServers)
 		ifs.mu.Unlock()
 	}
 	return refs
 }
 
-func (ns *Netstack) getDNSServers() []tcpip.Address {
+func (ns *Netstack) getdnsServers() []tcpip.Address {
 	defaultServers := ns.dnsClient.GetDefaultServers()
 	uniqServers := make(map[tcpip.Address]struct{})
 
 	ns.mu.Lock()
 	for _, ifs := range ns.mu.ifStates {
 		ifs.mu.Lock()
-		for _, server := range ifs.mu.nic.DNSServers {
+		for _, server := range ifs.mu.dnsServers {
 			uniqServers[server] = struct{}{}
 		}
 		ifs.mu.Unlock()
@@ -544,16 +548,13 @@
 func (ns *Netstack) addLoopback() error {
 	ifs, err := ns.addEndpoint(func(tcpip.NICID) string {
 		return "lo"
-	}, stack.FindLinkEndpoint(loopback.New()), link.NewLoopbackController(), false, defaultInterfaceMetric)
+	}, stack.FindLinkEndpoint(loopback.New()), link.NewLoopbackController(), false, defaultInterfaceMetric, ethernet.InfoFeatureLoopback)
 	if err != nil {
 		return err
 	}
 
 	ifs.mu.Lock()
-	ifs.mu.nic.Features = ethernet.InfoFeatureLoopback
-	ifs.mu.nic.Metric = defaultInterfaceMetric
 	ifs.mu.state = link.StateStarted
-
 	nicid := ifs.nicid
 	ifs.mu.Unlock()
 
@@ -604,7 +605,7 @@
 	b := bridge.New(links)
 	return ns.addEndpoint(func(nicid tcpip.NICID) string {
 		return fmt.Sprintf("br%d", nicid)
-	}, b, b, false, defaultInterfaceMetric)
+	}, b, b, false, defaultInterfaceMetric, 0)
 }
 
 func (ns *Netstack) addEth(topological_path string, config netstack.InterfaceConfig, device ethernet.Device) (*ifState, error) {
@@ -613,19 +614,12 @@
 		return nil, err
 	}
 
-	ifs, err := ns.addEndpoint(func(nicid tcpip.NICID) string {
+	return ns.addEndpoint(func(nicid tcpip.NICID) string {
 		if len(config.Name) == 0 {
 			return fmt.Sprintf("eth%d", nicid)
 		}
 		return config.Name
-	}, eth.NewLinkEndpoint(client), client, true, routes.Metric(config.Metric))
-	if err != nil {
-		return nil, err
-	}
-	ifs.mu.Lock()
-	ifs.mu.nic.Features = client.Info.Features
-	ifs.mu.Unlock()
-	return ifs, nil
+	}, eth.NewLinkEndpoint(client), client, true, routes.Metric(config.Metric), client.Info.Features)
 }
 
 func (ns *Netstack) addEndpoint(
@@ -634,15 +628,15 @@
 	controller link.Controller,
 	doFilter bool,
 	metric routes.Metric,
+	features uint32,
 ) (*ifState, error) {
 	ifs := &ifState{
-		ns:  ns,
-		eth: controller,
+		ns:       ns,
+		eth:      controller,
+		features: features,
 	}
 	ifs.mu.state = link.StateUnknown
-	ifs.mu.nic = &netiface.NIC{
-		Metric: metric,
-	}
+	ifs.mu.metric = metric
 	ifs.mu.dhcp.running = func() bool { return false }
 	ifs.mu.dhcp.cancel = func() {}
 
@@ -674,11 +668,11 @@
 	syslog.Infof("NIC %s added [sniff = %t]", name, ns.sniff)
 
 	if err := ns.mu.stack.CreateNIC(ifs.nicid, linkID); err != nil {
-		return nil, fmt.Errorf("NIC %s: could not create NIC: %v", ifs.mu.nic.Name, err)
+		return nil, fmt.Errorf("NIC %s: could not create NIC: %v", ifs.mu.name, err)
 	}
 	if ep.Capabilities()&stack.CapabilityResolutionRequired > 0 {
 		if err := ns.mu.stack.AddAddress(ifs.nicid, arp.ProtocolNumber, arp.ProtocolAddress); err != nil {
-			return nil, fmt.Errorf("NIC %s: adding arp address failed: %v", ifs.mu.nic.Name, err)
+			return nil, fmt.Errorf("NIC %s: adding arp address failed: %v", ifs.mu.name, err)
 		}
 	}
 
@@ -688,11 +682,11 @@
 	if linkAddr := ep.LinkAddress(); len(linkAddr) > 0 {
 		lladdr := header.LinkLocalAddr(linkAddr)
 		if err := ns.mu.stack.AddAddress(ifs.nicid, ipv6.ProtocolNumber, lladdr); err != nil {
-			return nil, fmt.Errorf("NIC %s: adding link-local IPv6 %v failed: %v", ifs.mu.nic.Name, lladdr, err)
+			return nil, fmt.Errorf("NIC %s: adding link-local IPv6 %v failed: %v", ifs.mu.name, lladdr, err)
 		}
 		snaddr := header.SolicitedNodeAddr(lladdr)
 		if err := ns.mu.stack.AddAddress(ifs.nicid, ipv6.ProtocolNumber, snaddr); err != nil {
-			return nil, fmt.Errorf("NIC %s: adding solicited-node IPv6 %v (link-local IPv6 %v) failed: %v", ifs.mu.nic.Name, snaddr, lladdr, err)
+			return nil, fmt.Errorf("NIC %s: adding solicited-node IPv6 %v (link-local IPv6 %v) failed: %v", ifs.mu.name, snaddr, lladdr, err)
 		}
 
 		ifs.mu.dhcp.Client = dhcp.NewClient(ns.mu.stack, ifs.nicid, linkAddr, ifs.dhcpAcquired)
@@ -700,7 +694,7 @@
 		syslog.Infof("NIC %s: link-local IPv6: %v", name, lladdr)
 	}
 
-	ifs.mu.nic.Name = name
+	ifs.mu.name = name
 
 	return ifs, nil
 }
diff --git a/src/connectivity/network/netstack/netstack_service.go b/src/connectivity/network/netstack/netstack_service.go
index 32348b9..68e2fdb 100644
--- a/src/connectivity/network/netstack/netstack_service.go
+++ b/src/connectivity/network/netstack/netstack_service.go
@@ -119,9 +119,9 @@
 	return netstack.NetInterface2{
 		Id:        uint32(ifs.nicid),
 		Flags:     flags,
-		Features:  ifs.mu.nic.Features,
-		Metric:    uint32(ifs.mu.nic.Metric),
-		Name:      ifs.mu.nic.Name,
+		Features:  ifs.features,
+		Metric:    uint32(ifs.mu.metric),
+		Name:      ifs.mu.name,
 		Addr:      fidlconv.ToNetIpAddress(addr),
 		Netmask:   fidlconv.ToNetIpAddress(tcpip.Address(mask)),
 		Broadaddr: fidlconv.ToNetIpAddress(tcpip.Address(broadaddr)),
diff --git a/src/connectivity/network/netstack/netstack_test.go b/src/connectivity/network/netstack/netstack_test.go
index 8d8a7e0..c9a48d3 100644
--- a/src/connectivity/network/netstack/netstack_test.go
+++ b/src/connectivity/network/netstack/netstack_test.go
@@ -43,8 +43,8 @@
 		t.Fatal(err)
 	}
 	ifs.mu.Lock()
-	if ifs.mu.nic.Name != testDeviceName {
-		t.Errorf("ifs.mu.nic.Name = %v, want %v", ifs.mu.nic.Name, testDeviceName)
+	if ifs.mu.name != testDeviceName {
+		t.Errorf("ifs.mu.name = %v, want %v", ifs.mu.name, testDeviceName)
 	}
 	ifs.mu.Unlock()
 }
@@ -165,7 +165,7 @@
 	if err != nil {
 		t.Fatal(err)
 	}
-	if ifs1.mu.nic.Name == ifs2.mu.nic.Name {
+	if ifs1.mu.name == ifs2.mu.name {
 		t.Fatalf("got (%+v).Name == (%+v).Name, want non-equal", ifs1, ifs2)
 	}
 }