OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
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.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 
31 // KSyncNetlinkEntry routines
34  Sync();
35  int len = MsgLen();
36  char *msg = (char *)malloc(len);
37  int msg_len = AddMsg(msg, len);
38  assert(msg_len <= len);
39  if (msg_len == 0) {
40  free(msg);
41  return true;
42  }
43  KSyncSock *sock = KSyncSock::Get(0);
44  sock->SendAsync(this, msg_len, msg, KSyncEntry::ADD_ACK);
45  return false;
46 }
47 
49  if (Sync() == false) {
50  return true;
51  }
52 
53  int len = MsgLen();
54  char *msg = (char *)malloc(len);
55  int msg_len = ChangeMsg(msg, len);
56  assert(msg_len <= len);
57  if (msg_len == 0) {
58  free(msg);
59  return true;
60  }
61  KSyncSock *sock = KSyncSock::Get(0);
62  sock->SendAsync(this, msg_len, msg, KSyncEntry::CHANGE_ACK);
63  return false;
64 }
65 
67  int len = MsgLen();
68  char *msg = (char *)malloc(len);
69  int msg_len = DeleteMsg(msg, len);
70  assert(msg_len <= len);
71  if (msg_len == 0) {
72  free(msg);
73  return true;
74  }
75  KSyncSock *sock = KSyncSock::Get(0);
76  sock->SendAsync(this, msg_len, msg, KSyncEntry::DEL_ACK);
77  return false;
78 }
79 
81 // KSyncNetlinkDBEntry routines
84  int len = MsgLen();
85  char *msg = (char *)malloc(len);
86  int msg_len = AddMsg(msg, len);
87  assert(msg_len <= len);
88  if (msg_len == 0) {
89  free(msg);
90  return true;
91  }
92  KSyncSock *sock = KSyncSock::Get(0);
93  sock->SendAsync(this, msg_len, msg, KSyncEntry::ADD_ACK);
94  return false;
95 }
96 
98  int len = MsgLen();
99  char *msg = (char *)malloc(len);
100  int msg_len = ChangeMsg(msg, len);
101  assert(msg_len <= len);
102  if (msg_len == 0) {
103  free(msg);
104  return true;
105  }
106  KSyncSock *sock = KSyncSock::Get(0);
107  sock->SendAsync(this, msg_len, msg, KSyncEntry::CHANGE_ACK);
108  return false;
109 }
110 
112  int len = MsgLen();
113  char *msg = (char *)malloc(len);
114  int msg_len = DeleteMsg(msg, len);
115  assert(msg_len <= len);
116  if (msg_len == 0) {
117  free(msg);
118  return true;
119  }
120  KSyncSock *sock = KSyncSock::Get(0);
121  sock->SendAsync(this, msg_len, msg, KSyncEntry::DEL_ACK);
122  return false;
123 }
virtual bool Sync()=0
void SendAsync(KSyncEntry *entry, int msg_len, char *msg, KSyncEntry::KSyncEvent event)
Definition: ksync_sock.cc:455
virtual int DeleteMsg(char *msg, int len)=0
virtual int DeleteMsg(char *msg, int len)=0
virtual int ChangeMsg(char *msg, int len)=0
static KSyncSock * Get(DBTablePartBase *partition)
Definition: ksync_sock.cc:340
virtual int MsgLen()
Definition: ksync_netlink.h:33
virtual int MsgLen()
Definition: ksync_netlink.h:64
virtual int ChangeMsg(char *msgi, int len)=0
virtual int AddMsg(char *msg, int len)=0
virtual int AddMsg(char *msg, int len)=0