X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=examples%2Fsimple-client%2Fsimple_client.go;h=e3ba83d15d9a967907c8e008275bc4baba60d62e;hb=d1f24d37bd447b64e402298bb8eb2479681facf9;hp=0017eacd471806022dbaeb6d941f7a3bd7ea83ab;hpb=94620e85f0bdbb054af07ce3670fadc1f76cfdf0;p=govpp.git diff --git a/examples/simple-client/simple_client.go b/examples/simple-client/simple_client.go index 0017eac..e3ba83d 100644 --- a/examples/simple-client/simple_client.go +++ b/examples/simple-client/simple_client.go @@ -17,19 +17,23 @@ package main import ( + "context" + "encoding/json" "flag" "fmt" "log" "os" - "strings" "git.fd.io/govpp.git" "git.fd.io/govpp.git/adapter/socketclient" "git.fd.io/govpp.git/api" + interfaces "git.fd.io/govpp.git/binapi/interface" + "git.fd.io/govpp.git/binapi/interface_types" + "git.fd.io/govpp.git/binapi/ip" + "git.fd.io/govpp.git/binapi/ip_types" + "git.fd.io/govpp.git/binapi/mactime" + "git.fd.io/govpp.git/binapi/vpe" "git.fd.io/govpp.git/core" - "git.fd.io/govpp.git/examples/binapi/interfaces" - "git.fd.io/govpp.git/examples/binapi/ip" - "git.fd.io/govpp.git/examples/binapi/vpe" ) var ( @@ -80,6 +84,8 @@ func main() { ipAddressDump(ch, idx) interfaceNotifications(ch, idx) + mactimeDump(conn) + if len(Errors) > 0 { fmt.Printf("finished with %d errors\n", len(Errors)) os.Exit(1) @@ -108,13 +114,13 @@ func vppVersion(ch api.Channel) { } fmt.Printf("reply: %+v\n", reply) - fmt.Printf("VPP version: %q\n", cleanString(reply.Version)) + fmt.Printf("VPP version: %q\n", reply.Version) fmt.Println("OK") fmt.Println() } // createLoopback sends request to create loopback interface. -func createLoopback(ch api.Channel) interfaces.InterfaceIndex { +func createLoopback(ch api.Channel) interface_types.InterfaceIndex { fmt.Println("Creating loopback interface") req := &interfaces.CreateLoopback{} @@ -151,6 +157,7 @@ func interfaceDump(ch api.Channel) { } n++ fmt.Printf(" - interface #%d: %+v\n", n, msg) + marshal(msg) } fmt.Println("OK") @@ -158,20 +165,21 @@ func interfaceDump(ch api.Channel) { } // addIPAddress sends request to add IP address to interface. -func addIPAddress(ch api.Channel, index interfaces.InterfaceIndex) { +func addIPAddress(ch api.Channel, index interface_types.InterfaceIndex) { fmt.Printf("Adding IP address to interface to interface index %d\n", index) req := &interfaces.SwInterfaceAddDelAddress{ SwIfIndex: index, IsAdd: true, - Prefix: interfaces.AddressWithPrefix{ - Address: interfaces.Address{ - Af: interfaces.ADDRESS_IP4, - Un: interfaces.AddressUnionIP4(interfaces.IP4Address{10, 10, 0, uint8(index)}), + Prefix: ip_types.AddressWithPrefix{ + Address: ip_types.Address{ + Af: ip_types.ADDRESS_IP4, + Un: ip_types.AddressUnionIP4(ip_types.IP4Address{10, 10, 0, uint8(index)}), }, Len: 32, }, } + marshal(req) reply := &interfaces.SwInterfaceAddDelAddressReply{} if err := ch.SendRequest(req).ReceiveReply(reply); err != nil { @@ -184,11 +192,11 @@ func addIPAddress(ch api.Channel, index interfaces.InterfaceIndex) { fmt.Println() } -func ipAddressDump(ch api.Channel, index interfaces.InterfaceIndex) { +func ipAddressDump(ch api.Channel, index interface_types.InterfaceIndex) { fmt.Printf("Dumping IP addresses for interface index %d\n", index) req := &ip.IPAddressDump{ - SwIfIndex: ip.InterfaceIndex(index), + SwIfIndex: index, } reqCtx := ch.SendMultiRequest(req) @@ -203,6 +211,7 @@ func ipAddressDump(ch api.Channel, index interfaces.InterfaceIndex) { break } fmt.Printf(" - ip address: %+v\n", msg) + marshal(msg) } fmt.Println("OK") @@ -212,7 +221,7 @@ func ipAddressDump(ch api.Channel, index interfaces.InterfaceIndex) { // interfaceNotifications shows the usage of notification API. Note that for notifications, // you are supposed to create your own Go channel with your preferred buffer size. If the channel's // buffer is full, the notifications will not be delivered into it. -func interfaceNotifications(ch api.Channel, index interfaces.InterfaceIndex) { +func interfaceNotifications(ch api.Channel, index interface_types.InterfaceIndex) { fmt.Printf("Subscribing to notificaiton events for interface index %d\n", index) notifChan := make(chan api.Message, 100) @@ -237,14 +246,16 @@ func interfaceNotifications(ch api.Channel, index interfaces.InterfaceIndex) { // receive notifications go func() { for notif := range notifChan { - fmt.Printf("incoming event: %+v\n", notif.(*interfaces.SwInterfaceEvent)) + e := notif.(*interfaces.SwInterfaceEvent) + fmt.Printf("incoming event: %+v\n", e) + marshal(e) } }() // generate some events in VPP err = ch.SendRequest(&interfaces.SwInterfaceSetFlags{ SwIfIndex: index, - Flags: interfaces.IF_STATUS_API_FLAG_ADMIN_UP, + Flags: interface_types.IF_STATUS_API_FLAG_ADMIN_UP, }).ReceiveReply(&interfaces.SwInterfaceSetFlagsReply{}) if err != nil { logError(err, "setting interface flags") @@ -280,6 +291,53 @@ func interfaceNotifications(ch api.Channel, index interfaces.InterfaceIndex) { fmt.Println() } -func cleanString(str string) string { - return strings.Split(str, "\x00")[0] +func mactimeDump(conn api.Connection) { + fmt.Println("Sending mactime dump") + + ctx := context.Background() + + stream, err := conn.NewStream(ctx) + if err != nil { + panic(err) + } + defer stream.Close() + + if err := stream.SendMsg(&mactime.MactimeDump{}); err != nil { + logError(err, "sending mactime dump") + return + } + +Loop: + for { + msg, err := stream.RecvMsg() + if err != nil { + logError(err, "dumping mactime") + return + } + + switch msg.(type) { + case *mactime.MactimeDetails: + fmt.Printf(" - MactimeDetails: %+v\n", msg) + + case *mactime.MactimeDumpReply: + fmt.Printf(" - MactimeDumpReply: %+v\n", msg) + break Loop + + default: + logError(err, "unexpected message") + return + } + } + + fmt.Println("OK") + fmt.Println() +} + +func marshal(v interface{}) { + fmt.Printf("GO: %#v\n", v) + b, err := json.MarshalIndent(v, "", " ") + if err != nil { + panic(err) + } + fmt.Printf("JSON: %s\n", b) }