regenerate protos
diff --git a/proto/control/control.pb.go b/proto/control/control.pb.go
index bb60521..62ed732 100644
--- a/proto/control/control.pb.go
+++ b/proto/control/control.pb.go
@@ -1,26 +1,14 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // source: control.proto
 
-/*
-Package connector is a generated protocol buffer package.
-
-It is generated from these files:
-	control.proto
-
-It has these top-level messages:
-	GetPortsRequest
-	SwitchPort
-	GetPortsResponse
-*/
 package connector
 
-import proto "github.com/golang/protobuf/proto"
-import fmt "fmt"
-import math "math"
-
 import (
+	fmt "fmt"
+	proto "github.com/golang/protobuf/proto"
 	context "golang.org/x/net/context"
 	grpc "google.golang.org/grpc"
+	math "math"
 )
 
 // Reference imports to suppress errors if they are not otherwise used.
@@ -49,6 +37,7 @@
 	2: "SPEED_1G",
 	3: "SPEED_10G",
 }
+
 var SwitchPort_Speed_value = map[string]int32{
 	"SPEED_INVALID": 0,
 	"SPEED_100M":    1,
@@ -59,7 +48,10 @@
 func (x SwitchPort_Speed) String() string {
 	return proto.EnumName(SwitchPort_Speed_name, int32(x))
 }
-func (SwitchPort_Speed) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{1, 0} }
+
+func (SwitchPort_Speed) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_0c5120591600887d, []int{1, 0}
+}
 
 type SwitchPort_LinkState int32
 
@@ -74,6 +66,7 @@
 	1: "LINKSTATE_DOWN",
 	2: "LINKSTATE_UP",
 }
+
 var SwitchPort_LinkState_value = map[string]int32{
 	"LINKSTATE_INVALID": 0,
 	"LINKSTATE_DOWN":    1,
@@ -83,7 +76,10 @@
 func (x SwitchPort_LinkState) String() string {
 	return proto.EnumName(SwitchPort_LinkState_name, int32(x))
 }
-func (SwitchPort_LinkState) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{1, 1} }
+
+func (SwitchPort_LinkState) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_0c5120591600887d, []int{1, 1}
+}
 
 type SwitchPort_PortMode int32
 
@@ -111,6 +107,7 @@
 	4: "PORTMODE_ROUTED",
 	5: "PORTMODE_MANGLED",
 }
+
 var SwitchPort_PortMode_value = map[string]int32{
 	"PORTMODE_INVALID":             0,
 	"PORTMODE_SWITCHPORT_UNTAGGED": 1,
@@ -123,7 +120,10 @@
 func (x SwitchPort_PortMode) String() string {
 	return proto.EnumName(SwitchPort_PortMode_name, int32(x))
 }
-func (SwitchPort_PortMode) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{1, 2} }
+
+func (SwitchPort_PortMode) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_0c5120591600887d, []int{1, 2}
+}
 
 type SwitchPort_SpanningTreeMode int32
 
@@ -140,6 +140,7 @@
 	1: "SPANNING_TREE_MODE_AUTO_PORTFAST",
 	2: "SPANNING_TREE_MODE_PORTFAST",
 }
+
 var SwitchPort_SpanningTreeMode_value = map[string]int32{
 	"SPANNING_TREE_MODE_INVALID":       0,
 	"SPANNING_TREE_MODE_AUTO_PORTFAST": 1,
@@ -149,40 +150,87 @@
 func (x SwitchPort_SpanningTreeMode) String() string {
 	return proto.EnumName(SwitchPort_SpanningTreeMode_name, int32(x))
 }
+
 func (SwitchPort_SpanningTreeMode) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor0, []int{1, 3}
+	return fileDescriptor_0c5120591600887d, []int{1, 3}
 }
 
 type GetPortsRequest struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
 }
 
-func (m *GetPortsRequest) Reset()                    { *m = GetPortsRequest{} }
-func (m *GetPortsRequest) String() string            { return proto.CompactTextString(m) }
-func (*GetPortsRequest) ProtoMessage()               {}
-func (*GetPortsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }
+func (m *GetPortsRequest) Reset()         { *m = GetPortsRequest{} }
+func (m *GetPortsRequest) String() string { return proto.CompactTextString(m) }
+func (*GetPortsRequest) ProtoMessage()    {}
+func (*GetPortsRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_0c5120591600887d, []int{0}
+}
+
+func (m *GetPortsRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetPortsRequest.Unmarshal(m, b)
+}
+func (m *GetPortsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetPortsRequest.Marshal(b, m, deterministic)
+}
+func (m *GetPortsRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetPortsRequest.Merge(m, src)
+}
+func (m *GetPortsRequest) XXX_Size() int {
+	return xxx_messageInfo_GetPortsRequest.Size(m)
+}
+func (m *GetPortsRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetPortsRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetPortsRequest proto.InternalMessageInfo
 
 type SwitchPort struct {
-	Name      string               `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
-	Speed     SwitchPort_Speed     `protobuf:"varint,2,opt,name=speed,enum=connector.SwitchPort_Speed" json:"speed,omitempty"`
-	LinkState SwitchPort_LinkState `protobuf:"varint,3,opt,name=link_state,json=linkState,enum=connector.SwitchPort_LinkState" json:"link_state,omitempty"`
-	PortMode  SwitchPort_PortMode  `protobuf:"varint,4,opt,name=port_mode,json=portMode,enum=connector.SwitchPort_PortMode" json:"port_mode,omitempty"`
+	Name      string               `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	Speed     SwitchPort_Speed     `protobuf:"varint,2,opt,name=speed,proto3,enum=connector.SwitchPort_Speed" json:"speed,omitempty"`
+	LinkState SwitchPort_LinkState `protobuf:"varint,3,opt,name=link_state,json=linkState,proto3,enum=connector.SwitchPort_LinkState" json:"link_state,omitempty"`
+	PortMode  SwitchPort_PortMode  `protobuf:"varint,4,opt,name=port_mode,json=portMode,proto3,enum=connector.SwitchPort_PortMode" json:"port_mode,omitempty"`
 	// For PORTMODE_SWITCHPORT_UNTAGGED and PORTMODE_SWITCHPORT_GENERIC, the
 	// VLAN ID that this interface is natively bridged to.
-	VlanNative int32 `protobuf:"varint,5,opt,name=vlan_native,json=vlanNative" json:"vlan_native,omitempty"`
+	VlanNative int32 `protobuf:"varint,5,opt,name=vlan_native,json=vlanNative,proto3" json:"vlan_native,omitempty"`
 	// For PORTMODE_SWITCHPORT_TAGGED and PORTMODE_SWITCHPORT_GENERIC, the VLAN
 	// IDs that the interface is bridged to using 802.1q tags.
-	VlanTagged []int32 `protobuf:"varint,6,rep,packed,name=vlan_tagged,json=vlanTagged" json:"vlan_tagged,omitempty"`
+	VlanTagged []int32 `protobuf:"varint,6,rep,packed,name=vlan_tagged,json=vlanTagged,proto3" json:"vlan_tagged,omitempty"`
 	// For PORTMODE_ROUTED
-	Prefixes []string `protobuf:"bytes,7,rep,name=prefixes" json:"prefixes,omitempty"`
+	Prefixes []string `protobuf:"bytes,7,rep,name=prefixes,proto3" json:"prefixes,omitempty"`
 	// Interface MTU
-	Mtu              int32                       `protobuf:"varint,8,opt,name=mtu" json:"mtu,omitempty"`
-	SpanningTreeMode SwitchPort_SpanningTreeMode `protobuf:"varint,9,opt,name=spanning_tree_mode,json=spanningTreeMode,enum=connector.SwitchPort_SpanningTreeMode" json:"spanning_tree_mode,omitempty"`
+	Mtu                  int32                       `protobuf:"varint,8,opt,name=mtu,proto3" json:"mtu,omitempty"`
+	SpanningTreeMode     SwitchPort_SpanningTreeMode `protobuf:"varint,9,opt,name=spanning_tree_mode,json=spanningTreeMode,proto3,enum=connector.SwitchPort_SpanningTreeMode" json:"spanning_tree_mode,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                    `json:"-"`
+	XXX_unrecognized     []byte                      `json:"-"`
+	XXX_sizecache        int32                       `json:"-"`
 }
 
-func (m *SwitchPort) Reset()                    { *m = SwitchPort{} }
-func (m *SwitchPort) String() string            { return proto.CompactTextString(m) }
-func (*SwitchPort) ProtoMessage()               {}
-func (*SwitchPort) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} }
+func (m *SwitchPort) Reset()         { *m = SwitchPort{} }
+func (m *SwitchPort) String() string { return proto.CompactTextString(m) }
+func (*SwitchPort) ProtoMessage()    {}
+func (*SwitchPort) Descriptor() ([]byte, []int) {
+	return fileDescriptor_0c5120591600887d, []int{1}
+}
+
+func (m *SwitchPort) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_SwitchPort.Unmarshal(m, b)
+}
+func (m *SwitchPort) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_SwitchPort.Marshal(b, m, deterministic)
+}
+func (m *SwitchPort) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_SwitchPort.Merge(m, src)
+}
+func (m *SwitchPort) XXX_Size() int {
+	return xxx_messageInfo_SwitchPort.Size(m)
+}
+func (m *SwitchPort) XXX_DiscardUnknown() {
+	xxx_messageInfo_SwitchPort.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_SwitchPort proto.InternalMessageInfo
 
 func (m *SwitchPort) GetName() string {
 	if m != nil {
@@ -248,13 +296,36 @@
 }
 
 type GetPortsResponse struct {
-	Ports []*SwitchPort `protobuf:"bytes,1,rep,name=ports" json:"ports,omitempty"`
+	Ports                []*SwitchPort `protobuf:"bytes,1,rep,name=ports,proto3" json:"ports,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
+	XXX_unrecognized     []byte        `json:"-"`
+	XXX_sizecache        int32         `json:"-"`
 }
 
-func (m *GetPortsResponse) Reset()                    { *m = GetPortsResponse{} }
-func (m *GetPortsResponse) String() string            { return proto.CompactTextString(m) }
-func (*GetPortsResponse) ProtoMessage()               {}
-func (*GetPortsResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} }
+func (m *GetPortsResponse) Reset()         { *m = GetPortsResponse{} }
+func (m *GetPortsResponse) String() string { return proto.CompactTextString(m) }
+func (*GetPortsResponse) ProtoMessage()    {}
+func (*GetPortsResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_0c5120591600887d, []int{2}
+}
+
+func (m *GetPortsResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetPortsResponse.Unmarshal(m, b)
+}
+func (m *GetPortsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetPortsResponse.Marshal(b, m, deterministic)
+}
+func (m *GetPortsResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetPortsResponse.Merge(m, src)
+}
+func (m *GetPortsResponse) XXX_Size() int {
+	return xxx_messageInfo_GetPortsResponse.Size(m)
+}
+func (m *GetPortsResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetPortsResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetPortsResponse proto.InternalMessageInfo
 
 func (m *GetPortsResponse) GetPorts() []*SwitchPort {
 	if m != nil {
@@ -264,90 +335,18 @@
 }
 
 func init() {
-	proto.RegisterType((*GetPortsRequest)(nil), "connector.GetPortsRequest")
-	proto.RegisterType((*SwitchPort)(nil), "connector.SwitchPort")
-	proto.RegisterType((*GetPortsResponse)(nil), "connector.GetPortsResponse")
 	proto.RegisterEnum("connector.SwitchPort_Speed", SwitchPort_Speed_name, SwitchPort_Speed_value)
 	proto.RegisterEnum("connector.SwitchPort_LinkState", SwitchPort_LinkState_name, SwitchPort_LinkState_value)
 	proto.RegisterEnum("connector.SwitchPort_PortMode", SwitchPort_PortMode_name, SwitchPort_PortMode_value)
 	proto.RegisterEnum("connector.SwitchPort_SpanningTreeMode", SwitchPort_SpanningTreeMode_name, SwitchPort_SpanningTreeMode_value)
+	proto.RegisterType((*GetPortsRequest)(nil), "connector.GetPortsRequest")
+	proto.RegisterType((*SwitchPort)(nil), "connector.SwitchPort")
+	proto.RegisterType((*GetPortsResponse)(nil), "connector.GetPortsResponse")
 }
 
-// Reference imports to suppress errors if they are not otherwise used.
-var _ context.Context
-var _ grpc.ClientConn
+func init() { proto.RegisterFile("control.proto", fileDescriptor_0c5120591600887d) }
 
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the grpc package it is being compiled against.
-const _ = grpc.SupportPackageIsVersion4
-
-// Client API for SwitchControl service
-
-type SwitchControlClient interface {
-	GetPorts(ctx context.Context, in *GetPortsRequest, opts ...grpc.CallOption) (*GetPortsResponse, error)
-}
-
-type switchControlClient struct {
-	cc *grpc.ClientConn
-}
-
-func NewSwitchControlClient(cc *grpc.ClientConn) SwitchControlClient {
-	return &switchControlClient{cc}
-}
-
-func (c *switchControlClient) GetPorts(ctx context.Context, in *GetPortsRequest, opts ...grpc.CallOption) (*GetPortsResponse, error) {
-	out := new(GetPortsResponse)
-	err := grpc.Invoke(ctx, "/connector.SwitchControl/GetPorts", in, out, c.cc, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-
-// Server API for SwitchControl service
-
-type SwitchControlServer interface {
-	GetPorts(context.Context, *GetPortsRequest) (*GetPortsResponse, error)
-}
-
-func RegisterSwitchControlServer(s *grpc.Server, srv SwitchControlServer) {
-	s.RegisterService(&_SwitchControl_serviceDesc, srv)
-}
-
-func _SwitchControl_GetPorts_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(GetPortsRequest)
-	if err := dec(in); err != nil {
-		return nil, err
-	}
-	if interceptor == nil {
-		return srv.(SwitchControlServer).GetPorts(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: "/connector.SwitchControl/GetPorts",
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(SwitchControlServer).GetPorts(ctx, req.(*GetPortsRequest))
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
-var _SwitchControl_serviceDesc = grpc.ServiceDesc{
-	ServiceName: "connector.SwitchControl",
-	HandlerType: (*SwitchControlServer)(nil),
-	Methods: []grpc.MethodDesc{
-		{
-			MethodName: "GetPorts",
-			Handler:    _SwitchControl_GetPorts_Handler,
-		},
-	},
-	Streams:  []grpc.StreamDesc{},
-	Metadata: "control.proto",
-}
-
-func init() { proto.RegisterFile("control.proto", fileDescriptor0) }
-
-var fileDescriptor0 = []byte{
+var fileDescriptor_0c5120591600887d = []byte{
 	// 561 bytes of a gzipped FileDescriptorProto
 	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x54, 0xd1, 0x6e, 0x9b, 0x4a,
 	0x10, 0xbd, 0x98, 0x38, 0x17, 0x26, 0x71, 0xb2, 0x99, 0x36, 0x12, 0x72, 0xaa, 0x04, 0xa1, 0xaa,
@@ -386,3 +385,75 @@
 	0xf5, 0x26, 0xbc, 0xf9, 0x13, 0x00, 0x00, 0xff, 0xff, 0xae, 0x71, 0xa0, 0x75, 0x24, 0x04, 0x00,
 	0x00,
 }
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConn
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion4
+
+// SwitchControlClient is the client API for SwitchControl service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type SwitchControlClient interface {
+	GetPorts(ctx context.Context, in *GetPortsRequest, opts ...grpc.CallOption) (*GetPortsResponse, error)
+}
+
+type switchControlClient struct {
+	cc *grpc.ClientConn
+}
+
+func NewSwitchControlClient(cc *grpc.ClientConn) SwitchControlClient {
+	return &switchControlClient{cc}
+}
+
+func (c *switchControlClient) GetPorts(ctx context.Context, in *GetPortsRequest, opts ...grpc.CallOption) (*GetPortsResponse, error) {
+	out := new(GetPortsResponse)
+	err := c.cc.Invoke(ctx, "/connector.SwitchControl/GetPorts", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// SwitchControlServer is the server API for SwitchControl service.
+type SwitchControlServer interface {
+	GetPorts(context.Context, *GetPortsRequest) (*GetPortsResponse, error)
+}
+
+func RegisterSwitchControlServer(s *grpc.Server, srv SwitchControlServer) {
+	s.RegisterService(&_SwitchControl_serviceDesc, srv)
+}
+
+func _SwitchControl_GetPorts_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetPortsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SwitchControlServer).GetPorts(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/connector.SwitchControl/GetPorts",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SwitchControlServer).GetPorts(ctx, req.(*GetPortsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _SwitchControl_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "connector.SwitchControl",
+	HandlerType: (*SwitchControlServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetPorts",
+			Handler:    _SwitchControl_GetPorts_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "control.proto",
+}