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

Generated by: LCOV version 1.14