Line data Source code
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 : 32 : /////////////////////////////////////////////////////////////////////////////// 33 : // KSyncNetlinkEntry routines 34 : /////////////////////////////////////////////////////////////////////////////// 35 44 : bool KSyncNetlinkEntry::Add() { 36 44 : Sync(); 37 44 : int len = MsgLen(); 38 44 : char *msg = (char *)malloc(len); 39 44 : int msg_len = AddMsg(msg, len); 40 44 : assert(msg_len <= len); 41 44 : if (msg_len == 0) { 42 0 : free(msg); 43 0 : return true; 44 : } 45 44 : KSyncSock *sock = KSyncSock::Get(0); 46 44 : sock->SendAsync(this, msg_len, msg, KSyncEntry::ADD_ACK); 47 44 : return false; 48 : } 49 : 50 78 : bool KSyncNetlinkEntry::Change() { 51 78 : if (Sync() == false) { 52 22 : return true; 53 : } 54 : 55 56 : int len = MsgLen(); 56 56 : char *msg = (char *)malloc(len); 57 56 : int msg_len = ChangeMsg(msg, len); 58 56 : assert(msg_len <= len); 59 56 : if (msg_len == 0) { 60 0 : free(msg); 61 0 : return true; 62 : } 63 56 : KSyncSock *sock = KSyncSock::Get(0); 64 56 : sock->SendAsync(this, msg_len, msg, KSyncEntry::CHANGE_ACK); 65 56 : return false; 66 : } 67 : 68 44 : bool KSyncNetlinkEntry::Delete() { 69 44 : int len = MsgLen(); 70 44 : char *msg = (char *)malloc(len); 71 44 : int msg_len = DeleteMsg(msg, len); 72 44 : assert(msg_len <= len); 73 44 : if (msg_len == 0) { 74 0 : free(msg); 75 0 : return true; 76 : } 77 44 : KSyncSock *sock = KSyncSock::Get(0); 78 44 : sock->SendAsync(this, msg_len, msg, KSyncEntry::DEL_ACK); 79 44 : return false; 80 : } 81 : 82 : /////////////////////////////////////////////////////////////////////////////// 83 : // KSyncNetlinkDBEntry routines 84 : /////////////////////////////////////////////////////////////////////////////// 85 345 : bool KSyncNetlinkDBEntry::Add() { 86 345 : int len = MsgLen(); 87 345 : char *msg = (char *)malloc(len); 88 345 : int msg_len = AddMsg(msg, len); 89 345 : assert(msg_len <= len); 90 345 : if (msg_len == 0) { 91 2 : free(msg); 92 2 : return true; 93 : } 94 343 : KSyncSock *sock = KSyncSock::Get(0); 95 343 : sock->SendAsync(this, msg_len, msg, KSyncEntry::ADD_ACK); 96 343 : return false; 97 : } 98 : 99 107 : bool KSyncNetlinkDBEntry::Change() { 100 107 : int len = MsgLen(); 101 107 : char *msg = (char *)malloc(len); 102 107 : int msg_len = ChangeMsg(msg, len); 103 107 : assert(msg_len <= len); 104 107 : if (msg_len == 0) { 105 2 : free(msg); 106 2 : return true; 107 : } 108 105 : KSyncSock *sock = KSyncSock::Get(0); 109 105 : sock->SendAsync(this, msg_len, msg, KSyncEntry::CHANGE_ACK); 110 105 : return false; 111 : } 112 : 113 345 : bool KSyncNetlinkDBEntry::Delete() { 114 345 : int len = MsgLen(); 115 345 : char *msg = (char *)malloc(len); 116 345 : int msg_len = DeleteMsg(msg, len); 117 345 : assert(msg_len <= len); 118 345 : if (msg_len == 0) { 119 0 : free(msg); 120 0 : return true; 121 : } 122 345 : KSyncSock *sock = KSyncSock::Get(0); 123 345 : sock->SendAsync(this, msg_len, msg, KSyncEntry::DEL_ACK); 124 345 : return false; 125 : }