OpenSDN source code
ksync_netlink.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved.
3  */
4 
5 #include <sys/types.h>
6 #include <sys/socket.h>
7 #if defined(__linux__)
8 #include <linux/netlink.h>
9 #include <linux/rtnetlink.h>
10 #include <linux/sockios.h>
11 #endif
12 
13 #include <boost/bind/bind.hpp>
14 
15 #include <base/logging.h>
16 #include <db/db.h>
17 #include <db/db_entry.h>
18 #include <db/db_table.h>
19 #include <db/db_table_partition.h>
20 
21 #include <sandesh/sandesh_trace.h>
22 
23 #include "ksync_index.h"
24 #include "ksync_entry.h"
25 #include "ksync_object.h"
26 #include "ksync_sock.h"
27 #include "ksync_types.h"
28 #include "ksync_netlink.h"
29 
30 using namespace boost::placeholders;
31 
33 // KSyncNetlinkEntry routines
36  Sync();
37  int len = MsgLen();
38  char *msg = (char *)malloc(len);
39  int msg_len = AddMsg(msg, len);
40  assert(msg_len <= len);
41  if (msg_len == 0) {
42  free(msg);
43  return true;
44  }
45  KSyncSock *sock = KSyncSock::Get(0);
46  sock->SendAsync(this, msg_len, msg, KSyncEntry::ADD_ACK);
47  return false;
48 }
49 
51  if (Sync() == false) {
52  return true;
53  }
54 
55  int len = MsgLen();
56  char *msg = (char *)malloc(len);
57  int msg_len = ChangeMsg(msg, len);
58  assert(msg_len <= len);
59  if (msg_len == 0) {
60  free(msg);
61  return true;
62  }
63  KSyncSock *sock = KSyncSock::Get(0);
64  sock->SendAsync(this, msg_len, msg, KSyncEntry::CHANGE_ACK);
65  return false;
66 }
67 
69  int len = MsgLen();
70  char *msg = (char *)malloc(len);
71  int msg_len = DeleteMsg(msg, len);
72  assert(msg_len <= len);
73  if (msg_len == 0) {
74  free(msg);
75  return true;
76  }
77  KSyncSock *sock = KSyncSock::Get(0);
78  sock->SendAsync(this, msg_len, msg, KSyncEntry::DEL_ACK);
79  return false;
80 }
81 
83 // KSyncNetlinkDBEntry routines
86  int len = MsgLen();
87  char *msg = (char *)malloc(len);
88  int msg_len = AddMsg(msg, len);
89  assert(msg_len <= len);
90  if (msg_len == 0) {
91  free(msg);
92  return true;
93  }
94  KSyncSock *sock = KSyncSock::Get(0);
95  sock->SendAsync(this, msg_len, msg, KSyncEntry::ADD_ACK);
96  return false;
97 }
98 
100  int len = MsgLen();
101  char *msg = (char *)malloc(len);
102  int msg_len = ChangeMsg(msg, len);
103  assert(msg_len <= len);
104  if (msg_len == 0) {
105  free(msg);
106  return true;
107  }
108  KSyncSock *sock = KSyncSock::Get(0);
109  sock->SendAsync(this, msg_len, msg, KSyncEntry::CHANGE_ACK);
110  return false;
111 }
112 
114  int len = MsgLen();
115  char *msg = (char *)malloc(len);
116  int msg_len = DeleteMsg(msg, len);
117  assert(msg_len <= len);
118  if (msg_len == 0) {
119  free(msg);
120  return true;
121  }
122  KSyncSock *sock = KSyncSock::Get(0);
123  sock->SendAsync(this, msg_len, msg, KSyncEntry::DEL_ACK);
124  return false;
125 }
void SendAsync(KSyncEntry *entry, int msg_len, char *msg, KSyncEntry::KSyncEvent event)
Definition: ksync_sock.cc:460
static KSyncSock * Get(DBTablePartBase *partition)
Definition: ksync_sock.cc:345