go.ligato.io/vpp-agent/v3@v3.5.0/examples/customize/custom_vpp_plugin/syslog/vppcalls/vpp2106/handler.go (about) 1 // Copyright (c) 2020 Cisco and/or its affiliates. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at: 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package vpp2106 16 17 import ( 18 "context" 19 "fmt" 20 "net" 21 22 govppapi "go.fd.io/govpp/api" 23 "go.ligato.io/cn-infra/v2/logging" 24 25 "go.ligato.io/vpp-agent/v3/examples/customize/custom_vpp_plugin/binapi/syslog" 26 "go.ligato.io/vpp-agent/v3/examples/customize/custom_vpp_plugin/syslog/vppcalls" 27 "go.ligato.io/vpp-agent/v3/plugins/vpp/binapi/vpp2106" 28 ) 29 30 func init() { 31 // Register this handler implementation for VPP 20.05 in the vppcalls package. 32 vppcalls.AddHandlerVersion(vpp2106.Version, syslog.AllMessages(), NewHandler) 33 } 34 35 const DefaultMaxMsgSize = 480 36 37 type Handler struct { 38 log logging.Logger 39 rpc syslog.RPCService 40 } 41 42 func NewHandler(ch govppapi.Channel, log logging.Logger) vppcalls.SyslogVppAPI { 43 return &Handler{ 44 log: log, 45 rpc: syslog.NewServiceClient(ch), 46 } 47 } 48 49 func (h *Handler) SetSender(sender vppcalls.SenderConfig) error { 50 if sender.Source.To4() == nil { 51 return fmt.Errorf("source (%v) must be IPv4 address", sender.Source) 52 } 53 if sender.Collector.To4() == nil { 54 return fmt.Errorf("collector (%v) must be IPv4 address", sender.Source) 55 } 56 57 req := &syslog.SyslogSetSender{ 58 CollectorPort: uint16(sender.Port), 59 VrfID: ^uint32(0), 60 MaxMsgSize: DefaultMaxMsgSize, 61 } 62 copy(req.SrcAddress[:], sender.Source.To4()) 63 copy(req.CollectorAddress[:], sender.Collector.To4()) 64 65 h.log.Debugf("SetSender: %+v", req) 66 67 _, err := h.rpc.SyslogSetSender(context.TODO(), req) 68 if err != nil { 69 return err 70 } 71 72 return nil 73 } 74 75 func (h *Handler) GetSender() (*vppcalls.SenderConfig, error) { 76 cfg, err := h.rpc.SyslogGetSender(context.TODO(), &syslog.SyslogGetSender{}) 77 if err != nil { 78 return nil, err 79 } 80 81 h.log.Debugf("GetSender: %+v", cfg) 82 83 var srcIP, collectorIP net.IP 84 srcIP = make(net.IP, 4) 85 collectorIP = make(net.IP, 4) 86 copy(srcIP, cfg.SrcAddress[:]) 87 copy(collectorIP, cfg.CollectorAddress[:]) 88 89 sender := &vppcalls.SenderConfig{} 90 91 // This is a workaround for disabling syslog sender 92 if cfg.CollectorPort != 1 { 93 sender.Port = int(cfg.CollectorPort) 94 if !srcIP.IsUnspecified() { 95 sender.Source = srcIP 96 } 97 if !collectorIP.IsUnspecified() { 98 sender.Collector = collectorIP 99 } 100 } 101 102 return sender, nil 103 } 104 105 func (h *Handler) DisableSender() error { 106 // VPP does not allow disabling syslog sender, so we set port to 1 as workaround 107 req := &syslog.SyslogSetSender{ 108 SrcAddress: syslog.IP4Address{0, 0, 0, 1}, 109 CollectorAddress: syslog.IP4Address{0, 0, 0, 1}, 110 CollectorPort: 1, 111 VrfID: ^uint32(0), 112 MaxMsgSize: DefaultMaxMsgSize, 113 } 114 115 h.log.Debugf("SetSender: %+v", req) 116 117 _, err := h.rpc.SyslogSetSender(context.TODO(), req) 118 if err != nil { 119 return err 120 } 121 122 return nil 123 }