| package main |
| |
| import ( |
| "bytes" |
| "encoding/json" |
| "fmt" |
| "git.fd.io/govpp.git/examples/bin_api/vpe" |
| ) |
| |
| type jsonVppDetails struct { |
| Program string `json:"program"` |
| Version string `json:"version"` |
| BuildDate string `json:"build_date"` |
| BuildDirectory string `json:"build_directory"` |
| } |
| |
| type jsonVppInterface struct { |
| Index uint32 `json:"if_index"` |
| Name string `json:"if_name"` |
| Tag string `json:"if_tag"` |
| MacAddress string `json:"if_mac"` |
| AdminState uint8 `json:"if_admin_state"` |
| LinkState uint8 `json:"if_link_state"` |
| LinkMTU uint16 `json:"if_link_mtu"` |
| SubDot1ad uint8 `json:"if_sub_dot1ad"` |
| SubID uint32 `json:"if_sub_id"` |
| |
| TxBytes uint64 `json:"if_tx_bytes"` |
| TxPackets uint64 `json:"if_tx_packets"` |
| TxErrors uint64 `json:"if_tx_errors"` |
| RxBytes uint64 `json:"if_rx_bytes"` |
| RxPackets uint64 `json:"if_rx_packets"` |
| RxErrors uint64 `json:"if_rx_errors"` |
| Drops uint64 `json:"if_drops"` |
| Punts uint64 `json:"if_punts"` |
| } |
| |
| type jsonVppPayload struct { |
| *jsonVppDetails `json:"vpp_details"` |
| Interfaces []*jsonVppInterface `json:"interfaces"` |
| } |
| |
| func bytesToString(b []byte) string { |
| return string(bytes.Split(b, []byte{0})[0]) |
| } |
| |
| func toJSONVppDetails(svReply *vpe.ShowVersionReply) *jsonVppDetails { |
| return &jsonVppDetails{ |
| Program: bytesToString(svReply.Program), |
| Version: bytesToString(svReply.Version), |
| BuildDate: bytesToString(svReply.BuildDate), |
| BuildDirectory: bytesToString(svReply.BuildDirectory), |
| } |
| } |
| |
| func toJSONVppInterface(vppIf *vppInterface) *jsonVppInterface { |
| return &jsonVppInterface{ |
| Index: vppIf.SwIfIndex, |
| Name: bytesToString(vppIf.InterfaceName), |
| Tag: bytesToString(vppIf.Tag), |
| MacAddress: parseMacAddress(vppIf.L2Address, vppIf.L2AddressLength), |
| AdminState: vppIf.AdminUpDown, |
| LinkState: vppIf.LinkUpDown, |
| LinkMTU: vppIf.LinkMtu, |
| SubDot1ad: vppIf.SubDot1ad, |
| SubID: vppIf.SubID, |
| TxBytes: vppIf.Stats.TxBytes, |
| TxPackets: vppIf.Stats.TxPackets, |
| TxErrors: vppIf.Stats.TxErrors, |
| RxBytes: vppIf.Stats.RxBytes, |
| RxPackets: vppIf.Stats.RxPackets, |
| RxErrors: vppIf.Stats.RxErrors, |
| Drops: vppIf.Stats.Drops, |
| Punts: vppIf.Stats.Punts, |
| } |
| } |
| |
| func toJSONVppPayload(svReply *vpe.ShowVersionReply, vppIfs []*vppInterface) *jsonVppPayload { |
| p := &jsonVppPayload{jsonVppDetails: toJSONVppDetails(svReply), Interfaces: make([]*jsonVppInterface, len(vppIfs))} |
| for index, vppIf := range vppIfs { |
| p.Interfaces[index] = toJSONVppInterface(vppIf) |
| } |
| return p |
| } |
| |
| func dumpToJSONString(v *vppConnector) (string, error) { |
| payload := toJSONVppPayload(&v.VppDetails, v.Interfaces) |
| jsonBytes, err := json.Marshal(payload) |
| if err != nil { |
| return "", fmt.Errorf("failed to dump to json: %v", err) |
| } |
| return string(jsonBytes), nil |
| } |