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