| // Copyright 2020 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| // `go mod` ignores file names for the purpose of resolving |
| // dependencies, and fdio doesn't build on not-Fuchsia. |
| // +build fuchsia |
| |
| package net |
| |
| import ( |
| "context" |
| "sync" |
| "syscall/zx" |
| "syscall/zx/fdio" |
| "syscall/zx/net/stack" |
| ) |
| |
| var stackHandle struct { |
| mu struct { |
| sync.Mutex |
| h zx.Handle |
| } |
| } |
| |
| func stackClient() (stack.StackWithCtxInterface, error) { |
| stackHandle.mu.Lock() |
| defer stackHandle.mu.Unlock() |
| |
| if stackHandle.mu.h == zx.HandleInvalid { |
| local, remote, err := zx.NewChannel(0) |
| if err != nil { |
| return stack.StackWithCtxInterface{}, err |
| } |
| if err := fdio.ServiceConnect("/svc/"+stack.StackName, zx.Handle(remote)); err != nil { |
| return stack.StackWithCtxInterface{}, err |
| } |
| stackHandle.mu.h = zx.Handle(local) |
| } |
| return stack.StackWithCtxInterface{Channel: zx.Channel(stackHandle.mu.h)}, nil |
| } |
| |
| // If the ifindex is zero, interfaceTable returns mappings of all |
| // network interfaces. Otherwise it returns a mapping of a specific interface. |
| func interfaceTable(ifindex int) ([]Interface, error) { |
| c, err := stackClient() |
| if err != nil { |
| return nil, err |
| } |
| ifInfos, err := c.ListInterfaces(context.Background()) |
| if err != nil { |
| return nil, err |
| } |
| ifs := make([]Interface, 0, len(ifInfos)) |
| for _, info := range ifInfos { |
| ifs = append(ifs, Interface{ |
| // TODO(jayzhuang): fill `Flags` when they are all available in stack.InterfaceInfo. |
| Index: int(info.Id), |
| MTU: int(info.Properties.Mtu), |
| Name: info.Properties.Name, |
| HardwareAddr: info.Properties.Mac.Octets[:], |
| }) |
| } |
| return ifs, nil |
| } |
| |
| // If the ifi is nil, interfaceAddrTable returns addresses for all |
| // network interfaces. Otherwise it returns addresses for a specific interface. |
| func interfaceAddrTable(ifi *Interface) ([]Addr, error) { |
| // TODO(44532): implement |
| return nil, nil |
| } |
| |
| // interfaceMulticastAddrTable returns addresses for a specific interface. |
| func interfaceMulticastAddrTable(ifi *Interface) ([]Addr, error) { |
| // TODO(44532): implement |
| return nil, nil |
| } |