10 #include <sys/socket.h>
13 #include <linux/if_ether.h>
14 #include <linux/if_tun.h>
15 #include <linux/if_packet.h>
20 #include "sandesh/sandesh_trace.h"
21 #include "pkt/pkt_types.h"
23 #include "../pkt0_interface.h"
25 #define TUN_INTF_CLONE_DEV "/dev/net/tun"
27 #define TAP_TRACE(obj, ...) \
29 Tap##obj::TraceMsg(PacketTraceBuf, __FILE__, __LINE__, __VA_ARGS__); \
39 LOG(ERROR,
"Packet Tap Error <" << errno <<
": " <<
40 strerror(errno) <<
"> opening tap-device"
46 memset(&ifr, 0,
sizeof(ifr));
47 ifr.ifr_flags = IFF_TAP | IFF_NO_PI;
48 strncpy(ifr.ifr_name,
name_.c_str(), IF_NAMESIZE-1);
49 if (ioctl(
tap_fd_, TUNSETIFF, (
void *)&ifr) < 0) {
50 LOG(ERROR,
"Packet Tap Error <" << errno <<
": " <<
51 strerror(errno) <<
"> creating " <<
name_
58 if (fcntl(
tap_fd_, F_SETFD, FD_CLOEXEC) < 0) {
59 LOG(ERROR,
"Packet Tap Error <" << errno <<
": " <<
60 strerror(errno) <<
"> setting fcntl on " <<
name_
65 if (ioctl(
tap_fd_, TUNSETPERSIST, 0) < 0) {
66 LOG(ERROR,
"Packet Tap Error <" << errno <<
": " <<
67 strerror(errno) <<
"> making tap interface non-persistent"
72 memset(&ifr, 0,
sizeof(ifr));
73 strncpy(ifr.ifr_name,
name_.c_str(), IF_NAMESIZE-1);
74 if (ioctl(
tap_fd_, SIOCGIFHWADDR, (
void *)&ifr) < 0) {
75 LOG(ERROR,
"Packet Tap Error <" << errno <<
": " << strerror(errno) <<
76 "> retrieving MAC address of the tap interface. BackTrace: "
80 memcpy(
mac_address_, ifr.ifr_hwaddr.sa_data, ETHER_ADDR_LEN);
83 if ((raw = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL))) == -1) {
84 LOG(ERROR,
"Packet Tap Error <" << errno <<
": " <<
85 strerror(errno) <<
"> creating socket"
90 memset(&ifr, 0,
sizeof(ifr));
91 strncpy(ifr.ifr_name,
name_.c_str(), IF_NAMESIZE-1);
92 if (ioctl(raw, SIOCGIFINDEX, (
void *)&ifr) < 0) {
93 LOG(ERROR,
"Packet Tap Error <" << errno <<
": " <<
94 strerror(errno) <<
"> getting ifindex of the tap interface"
99 struct sockaddr_ll sll;
100 memset(&sll, 0,
sizeof(
struct sockaddr_ll));
101 sll.sll_family = AF_PACKET;
102 sll.sll_ifindex = ifr.ifr_ifindex;
103 sll.sll_protocol = htons(ETH_P_ALL);
104 if (bind(raw, (
struct sockaddr *)&sll,
105 sizeof(
struct sockaddr_ll)) < 0) {
106 LOG(ERROR,
"Packet Tap Error <" << errno <<
": " <<
107 strerror(errno) <<
"> binding the socket to the tap interface"
113 memset(&ifr, 0,
sizeof(ifr));
114 strncpy(ifr.ifr_name,
name_.c_str(), IF_NAMESIZE-1);
115 if (ioctl(raw, SIOCGIFTXQLEN, (
void *)&ifr) < 0) {
116 LOG(ERROR,
"Packet Tap Error <" << errno <<
": " << strerror(errno) <<
122 if (ifr.ifr_qlen < (
int)qlen) {
124 if (ioctl(raw, SIOCSIFTXQLEN, (
void *)&ifr) < 0) {
125 LOG(ERROR,
"Packet Tap Error <" << errno <<
": "
126 << strerror(errno) <<
"> setting tx-buffer size"
132 memset(&ifr, 0,
sizeof(ifr));
133 strncpy(ifr.ifr_name,
name_.c_str(), IF_NAMESIZE-1);
134 if (ioctl(raw, SIOCGIFFLAGS, (
void *)&ifr) < 0) {
135 LOG(ERROR,
"Packet Tap Error <" << errno <<
": " <<
136 strerror(errno) <<
"> getting socket flags"
141 ifr.ifr_flags |= IFF_UP;
142 if (ioctl(raw, SIOCSIFFLAGS, (
void *)&ifr) < 0) {
143 LOG(ERROR,
"Packet Tap Error <" << errno <<
": " <<
144 strerror(errno) <<
"> setting socket flags"
150 boost::system::error_code ec;
159 buffer_list& buff_list) {
160 input_.async_write_some(buff_list,
162 boost::asio::placeholders::error,
163 boost::asio::placeholders::bytes_transferred, buff));
171 memset(&ifr, 0,
sizeof(ifr));
172 if ((raw_ = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL))) == -1) {
173 LOG(ERROR,
"Packet Tap Error <" << errno <<
": " <<
174 strerror(errno) <<
"> creating socket"
179 memset(&ifr, 0,
sizeof(ifr));
180 strncpy(ifr.ifr_name,
181 pkt_handler()->agent()->pkt_interface_name().c_str(), IF_NAMESIZE-1);
182 if (ioctl(raw_, SIOCGIFINDEX, (
void *)&ifr) < 0) {
183 LOG(ERROR,
"Packet Tap Error <" << errno <<
": " <<
184 strerror(errno) <<
"> getting ifindex of the " <<
185 "expception packet interface"
190 struct sockaddr_ll sll;
191 memset(&sll, 0,
sizeof(
struct sockaddr_ll));
192 sll.sll_family = AF_PACKET;
193 sll.sll_ifindex = ifr.ifr_ifindex;
194 sll.sll_protocol = htons(ETH_P_ALL);
195 if (bind(raw_, (
struct sockaddr *)&sll,
196 sizeof(
struct sockaddr_ll)) < 0) {
197 LOG(ERROR,
"Packet Tap Error <" << errno <<
": " <<
198 strerror(errno) <<
"> binding the socket to the tap interface"
203 memset(&ifr, 0,
sizeof(ifr));
204 strncpy(ifr.ifr_name,
name_.c_str(), IF_NAMESIZE-1);
205 if (ioctl(raw_, SIOCGIFFLAGS, (
void *)&ifr) < 0) {
206 LOG(ERROR,
"Packet Tap Error <" << errno <<
": " <<
207 strerror(errno) <<
"> getting socket flags"
212 ifr.ifr_flags |= IFF_UP;
213 if (ioctl(raw_, SIOCSIFFLAGS, (
void *)&ifr) < 0) {
214 LOG(ERROR,
"Packet Tap Error <" << errno <<
": " <<
215 strerror(errno) <<
"> setting socket flags"
221 boost::system::error_code ec;
boost::shared_ptr< PacketBuffer > PacketBufferPtr
void InitControlInterface()
void WriteHandler(const boost::system::error_code &error, std::size_t length, uint8_t *buff)
unsigned char mac_address_[ETHER_ADDR_LEN]
uint32_t pkt0_tx_buffer_count() const
#define TUN_INTF_CLONE_DEV
PktHandler * pkt_handler() const
virtual void InitControlInterface()
AgentParam * params() const
std::string AgentBackTrace(int skip=1)
boost::asio::posix::stream_descriptor input_
void SendImpl(uint8_t *buff, uint16_t buff_len, const PacketBufferPtr &pkt, buffer_list &buff_list)
#define LOG(_Level, _Msg)
void set_pkt_interface_name(const std::string &name)
virtual void InitControlInterface()