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 2 : ServicesModule::ServicesModule(Agent *agent, const std::string &metadata_secret)
33 2 : : agent_(agent), metadata_secret_key_(metadata_secret), dhcp_proto_(NULL),
34 2 : dhcpv6_proto_(NULL), dns_proto_(NULL), arp_proto_(NULL), bfd_proto_(NULL),
35 2 : icmp_proto_(NULL), icmpv6_proto_(NULL), igmp_proto_(NULL), metadata_proxy_(NULL) {
36 2 : }
37 :
38 2 : ServicesModule::~ServicesModule() {
39 2 : }
40 :
41 2 : void ServicesModule::Init(bool run_with_vrouter) {
42 2 : EventManager *event = agent_->event_manager();
43 2 : boost::asio::io_context &io = *event->io_service();
44 :
45 2 : dhcp_proto_.reset(new DhcpProto(agent_, io, run_with_vrouter));
46 2 : agent_->SetDhcpProto(dhcp_proto_.get());
47 :
48 2 : dhcpv6_proto_.reset(new Dhcpv6Proto(agent_, io, run_with_vrouter));
49 2 : agent_->set_dhcpv6_proto(dhcpv6_proto_.get());
50 :
51 2 : dns_proto_.reset(new DnsProto(agent_, io));
52 2 : agent_->SetDnsProto(dns_proto_.get());
53 :
54 2 : arp_proto_.reset(new ArpProto(agent_, io, run_with_vrouter));
55 2 : agent_->SetArpProto(arp_proto_.get());
56 :
57 2 : bfd_proto_.reset(new BfdProto(agent_, io));
58 2 : agent_->SetBfdProto(bfd_proto_.get());
59 :
60 2 : icmp_proto_.reset(new IcmpProto(agent_, io));
61 2 : agent_->SetIcmpProto(icmp_proto_.get());
62 :
63 2 : icmpv6_proto_.reset(new Icmpv6Proto(agent_, io));
64 2 : agent_->set_icmpv6_proto(icmpv6_proto_.get());
65 :
66 2 : icmp_error_proto_.reset(new IcmpErrorProto(agent_, io));
67 2 : icmpv6_error_proto_.reset(new Icmpv6ErrorProto(agent_, io));
68 :
69 2 : igmp_proto_.reset(new IgmpProto(agent_, io));
70 2 : agent_->SetIgmpProto(igmp_proto_.get());
71 :
72 2 : metadata_proxy_.reset(new MetadataProxy(this, metadata_secret_key_));
73 2 : ReserveLocalPorts();
74 2 : }
75 :
76 2 : void ServicesModule::ConfigInit() {
77 2 : dns_proto_->ConfigInit();
78 2 : }
79 :
80 2 : void ServicesModule::IoShutdown() {
81 2 : dns_proto_->IoShutdown();
82 2 : metadata_proxy_->CloseSessions();
83 2 : }
84 :
85 2 : void ServicesModule::Shutdown() {
86 2 : dhcp_proto_->Shutdown();
87 2 : dhcp_proto_.reset(NULL);
88 2 : agent_->SetDhcpProto(NULL);
89 :
90 2 : dhcpv6_proto_->Shutdown();
91 2 : dhcpv6_proto_.reset(NULL);
92 2 : agent_->set_dhcpv6_proto(NULL);
93 :
94 2 : dns_proto_->Shutdown();
95 2 : dns_proto_.reset(NULL);
96 2 : agent_->SetDnsProto(NULL);
97 :
98 2 : arp_proto_->Shutdown();
99 2 : arp_proto_.reset(NULL);
100 2 : agent_->SetArpProto(NULL);
101 :
102 2 : bfd_proto_->Shutdown();
103 2 : bfd_proto_.reset(NULL);
104 2 : agent_->SetBfdProto(NULL);
105 :
106 2 : icmp_proto_->Shutdown();
107 2 : icmp_proto_.reset(NULL);
108 2 : agent_->SetIcmpProto(NULL);
109 :
110 2 : icmpv6_proto_->Shutdown();
111 2 : icmpv6_proto_.reset(NULL);
112 2 : agent_->set_icmpv6_proto(NULL);
113 :
114 2 : igmp_proto_->Shutdown();
115 2 : igmp_proto_.reset(NULL);
116 2 : agent_->SetIgmpProto(NULL);
117 :
118 2 : metadata_proxy_->Shutdown();
119 2 : metadata_proxy_.reset(NULL);
120 2 : }
121 :
122 6 : bool ServicesModule::AllocateFd(uint16_t port_number, uint8_t l3_proto) {
123 : int fd;
124 :
125 : // l3 proto can be TCP or UDP
126 6 : if (l3_proto == IPPROTO_TCP) {
127 0 : fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
128 : } else {
129 6 : fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
130 : }
131 :
132 6 : 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 6 : memset(&address, 0, sizeof(address));
139 6 : address.sin_family = AF_INET;
140 6 : address.sin_port = htons(port_number);
141 6 : 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 6 : reserved_port_fd_list_.push_back(fd);
149 :
150 6 : return true;
151 : }
152 2 : 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 2 : AllocateFd(MPLS_OVER_UDP_OLD_DEST_PORT, IPPROTO_UDP);
157 2 : AllocateFd(MPLS_OVER_UDP_NEW_DEST_PORT, IPPROTO_UDP);
158 2 : AllocateFd(VXLAN_UDP_DEST_PORT, IPPROTO_UDP);
159 2 : }
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 : }
|