5 #include <sys/socket.h>
7 #include <linux/netlink.h>
11 #include <sys/types.h>
14 #include <asm/types.h>
15 #include <boost/asio.hpp>
35 #include <ini_parser.h>
36 #include <vr_genetlink.h>
43 using namespace boost::asio::ip;
50 minor_devid_(minor_id),
52 table_entries_count_(0),
54 (*(ksync->agent()->event_manager())->io_service(),
90 if (!khpmem && unlink_node) {
91 const char *error_msg = vr_table_unlink(
table_path_.c_str());
93 LOG(ERROR,
"Error unmapping KSync memory: " << error_msg);
104 const char *table_str;
112 if (mmap_error_msg) {
113 LOG(ERROR,
"Error mapping KSync memory. Device: " <<
table_path_ <<
"; " << mmap_error_msg);
124 struct nl_client *cl;
128 assert((cl = nl_register_client()) != NULL);
130 assert(nl_socket(cl, AF_NETLINK, SOCK_DGRAM, NETLINK_GENERIC) > 0);
131 assert(nl_connect(cl, 0, 0, 0) == 0);
133 assert(vrouter_obtain_family_id(cl) > 0);
135 assert(nl_build_nlh(cl, cl->cl_genl_family_id, NLM_F_REQUEST) == 0);
136 assert(nl_build_genlh(cl, SANDESH_REQUEST, 0) == 0);
138 attr_len = nl_get_attr_hdr_size();
141 nl_build_attr(cl, encode_len, NL_ATTR_VR_MESSAGE_PROTOCOL);
144 if ((ret = nl_sendmsg(cl)) < 0) {
145 LOG(DEBUG,
"Error requesting Table message. Error : " << ret);
149 while ((ret = nl_recvmsg(cl)) > 0) {
167 Mmap(
true, hpmem,
true);
218 struct nl_client *cl;
222 assert((cl = nl_register_client()) != NULL);
224 assert(nl_build_nlh(cl, cl->cl_genl_family_id, NLM_F_REQUEST) == 0);
225 assert(nl_build_genlh(cl, SANDESH_REQUEST, 0) == 0);
227 attr_len = nl_get_attr_hdr_size();
229 nl_build_attr(cl, encode_len, NL_ATTR_VR_MESSAGE_PROTOCOL);
232 ksync_agent_vrouter_sock_path =
235 "dpdk_netlink" : ksync_agent_vrouter_sock_path;
237 #ifdef AGENT_VROUTER_TCP
242 boost::asio::local::stream_protocol::socket
244 boost::asio::local::stream_protocol::endpoint
245 endpoint(ksync_agent_vrouter_sock_path);
247 boost::system::error_code ec;
248 socket.connect(endpoint, ec);
253 socket.send(boost::asio::buffer(cl->cl_buf, cl->cl_buf_offset), 0, ec);
258 uint32_t len_read = 0;
259 uint32_t data_len =
sizeof(
struct nlmsghdr);
260 while (len_read < data_len) {
261 len_read = socket.read_some(boost::asio::buffer(cl->cl_buf + len_read,
262 cl->cl_buf_len), ec);
267 if (len_read >
sizeof(
struct nlmsghdr)) {
268 const struct nlmsghdr *nlh =
269 (
const struct nlmsghdr *)((cl->cl_buf));
270 data_len = nlh->nlmsg_len;
281 Mmap(
false, NULL,
false);
static const uint32_t kAuditYieldTimer
static int GetNetlinkFamilyId()
std::string cat_ksocketdir() const
static const uint32_t kAuditYieldMin
virtual void SetTableSize()
virtual int EncodeReq(nl_client *nl, uint32_t attr_len)=0
virtual void UpdateAgentHoldFlowCounter()
virtual bool IsInactiveEntry(uint32_t idx, uint8_t &gen_id)=0
void InitMem(void *hpmem)
uint32_t table_entries_count_
boost::asio::io_context * io_service()
static const int kTestFlowTableSize
static const uint32_t kAuditSweepTime
static AgentSandeshContext * GetAgentSandeshContext(uint32_t type)
std::list< AuditEntry > audit_list_
static const uint32_t kAuditYieldMax
virtual void CreateProtoAuditEntry(uint32_t index, uint8_t gen_id)=0
void Mmap(bool unlink, void *khpmem, bool kernel_mode)
const uint32_t vrouter_server_port() const
virtual int get_entry_size()=0
EventManager * event_manager() const
virtual void IncrementHoldFlowCounter()
AgentParam * params() const
#define KSYNC_AGENT_VROUTER_SOCK_PATH
static void NetlinkDecoder(char *data, SandeshContext *ctxt)
static const uint32_t kAuditTimeout
KSyncMemory(KSync *ksync, uint32_t minor_id)
static uint64_t UTCTimestampUsec()
bool Start(int time, Handler handler, ErrorHandler error_handler=NULL)
#define LOG(_Level, _Msg)
const Ip4Address vrouter_server_ip() const
virtual void DecrementHoldFlowCounter()
bool cat_is_agent_mocked() const
static bool DeleteTimer(Timer *Timer)