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