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  }