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 : }
|