LCOV - code coverage report
Current view: top level - vnsw/agent/services - services_init.cc (source / functions) Hit Total Coverage
Test: OpenSDN C/C++ coverage (all TARGET_SET jobs) Lines: 81 93 87.1 %
Date: 2026-11-09 02:10:49 Functions: 8 9 88.9 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /*
       2             :  * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved.
       3             :  * Copyright Contributors to the OpenSDN project
       4             :  */
       5             : 
       6             : #include <oper/mirror_table.h>
       7             : #include <io/event_manager.h>
       8             : #include <cmn/agent_cmn.h>
       9             : #include "sandesh/sandesh_types.h"
      10             : #include "sandesh/sandesh.h"
      11             : #include "sandesh/sandesh_trace.h"
      12             : #include "services/services_init.h"
      13             : #include "services/dhcp_proto.h"
      14             : #include "services/dhcpv6_proto.h"
      15             : #include "services/dns_proto.h"
      16             : #include "services/arp_proto.h"
      17             : #include "services/icmp_proto.h"
      18             : #include "services/icmpv6_proto.h"
      19             : #include "services/bfd_proto.h"
      20             : #include "services/igmp_proto.h"
      21             : #include "services/metadata_proxy.h"
      22             : #include "init/agent_param.h"
      23             : 
      24             : 
      25             : SandeshTraceBufferPtr DhcpTraceBuf(SandeshTraceBufferCreate("Dhcp", 1000));
      26             : SandeshTraceBufferPtr Dhcpv6TraceBuf(SandeshTraceBufferCreate("Dhcpv6", 1000));
      27             : SandeshTraceBufferPtr Icmpv6TraceBuf(SandeshTraceBufferCreate("Icmpv6", 500));
      28             : SandeshTraceBufferPtr ArpTraceBuf(SandeshTraceBufferCreate("Arp", 1000));
      29             : SandeshTraceBufferPtr MetadataTraceBuf(SandeshTraceBufferCreate("Metadata", 500));
      30             : SandeshTraceBufferPtr BfdTraceBuf(SandeshTraceBufferCreate("Bfd", 500));
      31             : SandeshTraceBufferPtr IgmpTraceBuf(SandeshTraceBufferCreate("Igmp", 500));
      32             : 
      33           2 : ServicesModule::ServicesModule(Agent *agent, const std::string &metadata_secret)
      34           2 :     : agent_(agent), metadata_secret_key_(metadata_secret), dhcp_proto_(NULL),
      35           2 :       dhcpv6_proto_(NULL), dns_proto_(NULL), arp_proto_(NULL), bfd_proto_(NULL),
      36           2 :       icmp_proto_(NULL), icmpv6_proto_(NULL), igmp_proto_(NULL), metadata_proxy_(NULL) {
      37           2 : }
      38             : 
      39           2 : ServicesModule::~ServicesModule() {
      40           2 : }
      41             : 
      42           2 : void ServicesModule::Init(bool run_with_vrouter) {
      43           2 :     EventManager *event = agent_->event_manager();
      44           2 :     boost::asio::io_context &io = *event->io_service();
      45             : 
      46           2 :     dhcp_proto_.reset(new DhcpProto(agent_, io, run_with_vrouter));
      47           2 :     agent_->SetDhcpProto(dhcp_proto_.get());
      48             : 
      49           2 :     dhcpv6_proto_.reset(new Dhcpv6Proto(agent_, io, run_with_vrouter));
      50           2 :     agent_->set_dhcpv6_proto(dhcpv6_proto_.get());
      51             : 
      52           2 :     dns_proto_.reset(new DnsProto(agent_, io));
      53           2 :     agent_->SetDnsProto(dns_proto_.get());
      54             : 
      55           2 :     arp_proto_.reset(new ArpProto(agent_, io, run_with_vrouter));
      56           2 :     agent_->SetArpProto(arp_proto_.get());
      57             : 
      58           2 :     bfd_proto_.reset(new BfdProto(agent_, io));
      59           2 :     agent_->SetBfdProto(bfd_proto_.get());
      60             : 
      61           2 :     icmp_proto_.reset(new IcmpProto(agent_, io));
      62           2 :     agent_->SetIcmpProto(icmp_proto_.get());
      63             : 
      64           2 :     icmpv6_proto_.reset(new Icmpv6Proto(agent_, io));
      65           2 :     agent_->set_icmpv6_proto(icmpv6_proto_.get());
      66             : 
      67           2 :     icmp_error_proto_.reset(new IcmpErrorProto(agent_, io));
      68           2 :     icmpv6_error_proto_.reset(new Icmpv6ErrorProto(agent_, io));
      69             : 
      70           2 :     igmp_proto_.reset(new IgmpProto(agent_, io));
      71           2 :     agent_->SetIgmpProto(igmp_proto_.get());
      72             : 
      73           2 :     metadata_proxy_.reset(new MetadataProxy(this, metadata_secret_key_));
      74           2 :     ReserveLocalPorts();
      75           2 : }
      76             : 
      77           2 : void ServicesModule::ConfigInit() {
      78           2 :     dns_proto_->ConfigInit();
      79           2 : }
      80             : 
      81           2 : void ServicesModule::IoShutdown() {
      82           2 :     dns_proto_->IoShutdown();
      83           2 :     metadata_proxy_->CloseSessions();
      84           2 : }
      85             : 
      86           2 : void ServicesModule::Shutdown() {
      87           2 :     dhcp_proto_->Shutdown();
      88           2 :     dhcp_proto_.reset(NULL);
      89           2 :     agent_->SetDhcpProto(NULL);
      90             : 
      91           2 :     dhcpv6_proto_->Shutdown();
      92           2 :     dhcpv6_proto_.reset(NULL);
      93           2 :     agent_->set_dhcpv6_proto(NULL);
      94             : 
      95           2 :     dns_proto_->Shutdown();
      96           2 :     dns_proto_.reset(NULL);
      97           2 :     agent_->SetDnsProto(NULL);
      98             : 
      99           2 :     arp_proto_->Shutdown();
     100           2 :     arp_proto_.reset(NULL);
     101           2 :     agent_->SetArpProto(NULL);
     102             : 
     103           2 :     bfd_proto_->Shutdown();
     104           2 :     bfd_proto_.reset(NULL);
     105           2 :     agent_->SetBfdProto(NULL);
     106             : 
     107           2 :     icmp_proto_->Shutdown();
     108           2 :     icmp_proto_.reset(NULL);
     109           2 :     agent_->SetIcmpProto(NULL);
     110             : 
     111           2 :     icmpv6_proto_->Shutdown();
     112           2 :     icmpv6_proto_.reset(NULL);
     113           2 :     agent_->set_icmpv6_proto(NULL);
     114             : 
     115           2 :     igmp_proto_->Shutdown();
     116           2 :     igmp_proto_.reset(NULL);
     117           2 :     agent_->SetIgmpProto(NULL);
     118             : 
     119           2 :     metadata_proxy_->Shutdown();
     120           2 :     metadata_proxy_.reset(NULL);
     121           2 : }
     122             : 
     123           6 : bool ServicesModule::AllocateFd(uint16_t port_number, uint8_t l3_proto) {
     124             :     int fd;
     125             : 
     126             :     // l3 proto can be TCP or UDP
     127           6 :     if (l3_proto == IPPROTO_TCP) {
     128           0 :         fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
     129             :     } else {
     130           6 :         fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
     131             :     }
     132             : 
     133           6 :     if (fd < 0) {
     134           0 :         LOG(ERROR, "Failed to create socket, errno:" << strerror(errno));
     135           0 :         return false;
     136             :     }
     137             :     
     138             :     struct sockaddr_in address;
     139           6 :     memset(&address, 0, sizeof(address));
     140           6 :     address.sin_family = AF_INET;
     141           6 :     address.sin_port = htons(port_number);
     142           6 :     if (::bind(fd, (struct sockaddr*) &address, sizeof(address)) < 0) {
     143           0 :         LOG(ERROR, "failed to bind socket to port: " << port_number
     144             :                 << "errno: " << strerror(errno));
     145           0 :         close(fd);
     146           0 :         return false;
     147             :     }
     148             : 
     149           6 :     reserved_port_fd_list_.push_back(fd);
     150             : 
     151           6 :     return true;
     152             : }
     153           2 : void ServicesModule::ReserveLocalPorts() {
     154             : 
     155             :     //reserve UDP dest ports used for tunneling protocos
     156             :     //so that these port numbers are not used for link local services.
     157           2 :     AllocateFd(MPLS_OVER_UDP_OLD_DEST_PORT, IPPROTO_UDP);
     158           2 :     AllocateFd(MPLS_OVER_UDP_NEW_DEST_PORT, IPPROTO_UDP);
     159           2 :     AllocateFd(VXLAN_UDP_DEST_PORT, IPPROTO_UDP);
     160           2 : }
     161             : 
     162           0 : void ServicesModule::FreeLocalPortBindings() {
     163           0 :     std::vector<int>::const_iterator it = reserved_port_fd_list_.begin();
     164           0 :     while ( it != reserved_port_fd_list_.end()) {
     165             :         // close socket
     166           0 :         close(*it);
     167           0 :         it++;
     168             :     }
     169           0 : }

Generated by: LCOV version 1.14