Skip to content

Commit

Permalink
General changes for Windows
Browse files Browse the repository at this point in the history
Mixed changes related to net,vnsw/agent/{cfg,controller,diag,filter,pkt}:
1. boost::array<uint8_t, X> to IpYAddress::bytes_type where applicable.
   IpYAddress::bytes_type is std::array if c++11 and boost::array otherwise
   and on Windows we compile with c++11.
2. addr.to_bytes().c_array() to addr.to_bytes().data()
   Difference between boost::array and std::array
3. variable length arrays to dynamic allocation with smart pointers
4. s_addr to s_address, DELETE to DEL, EVENT_MAX to EVENT_MAXIMUM
   s_addr, DELETE, EVENT_MAX are reserved on Windows
5. bind to ::bind
   To avoid confusion with std::bind
6. and more various bugs

Initial changes:
  https://github.com/sagarkchitnis/windows/commits/master/controller/src
Further work and cleanup:
  https://github.com/codilime/contrail-controller/commits/windows3.1/src

Change-Id: I7b963703d6d0aefb6591bc40ab6048351bb30593
Partial-Bug: #1737177
  • Loading branch information
Michał Cłapiński committed Dec 13, 2017
1 parent e8658e8 commit 382cccd
Show file tree
Hide file tree
Showing 24 changed files with 76 additions and 74 deletions.
11 changes: 9 additions & 2 deletions src/SConscript
Expand Up @@ -44,7 +44,11 @@ include = ['#/controller/src', '#/build/include', '#src/contrail-common', '#cont

libpath = ['#/build/lib']

libs = ['boost_system', 'log4cplus', 'pthread']
libs = ['boost_system', 'log4cplus']
if sys.platform.startswith('win'):
libs.append('windowsstubs')
else:
libs.append('pthread')

common = DefaultEnvironment().Clone()

Expand All @@ -55,7 +59,10 @@ else:

common.Append(LIBPATH = libpath)
common.Prepend(LIBS = libs)
common.Append(CCFLAGS = '-Wall -Werror -Wsign-compare')

if not sys.platform.startswith('win'):
common.Append(CCFLAGS = '-Wall -Werror -Wsign-compare')

if not sys.platform.startswith('darwin'):
if platform.system().startswith('Linux'):
if not platform.linux_distribution()[0].startswith('XenServer'):
Expand Down
2 changes: 1 addition & 1 deletion src/net/address.cc
Expand Up @@ -299,7 +299,7 @@ Ip6Address Address::GetIp6SubnetAddress(const Ip6Address &prefix, uint16_t plen)
ip6[i] = htons(in_ip6[i]);
}
memcpy(bytes, ip6, sizeof(ip6));
boost::array<uint8_t, 16> to_bytes;
Ip6Address::bytes_type to_bytes;
for (int i = 0; i < 16; ++i) {
to_bytes.at(i) = bytes[i];
}
Expand Down
4 changes: 2 additions & 2 deletions src/net/address_util.cc
Expand Up @@ -91,7 +91,7 @@ IpAddress PrefixToIp6Netmask(uint32_t plen) {
return IpAddress(all_fs);
}

boost::array<uint8_t, 16> bytes;
Ip6Address::bytes_type bytes;

int index = (int) (plen / 8);
int remain_mask = plen % 8;
Expand Down Expand Up @@ -269,7 +269,7 @@ void Ip6AddressToU64Array(const Ip6Address &addr, uint64_t *arr, int size) {
if (size != 2)
return;

memcpy(b, addr.to_bytes().c_array(), sizeof(b));
memcpy(b, addr.to_bytes().data(), sizeof(b));

for (i = 0, j = 0, k = 0; i < 4; i++, j = j+4) {
ip = 0;
Expand Down
2 changes: 1 addition & 1 deletion src/net/mac_address.cc
Expand Up @@ -42,7 +42,7 @@ MacAddress::MacAddress(unsigned int a, unsigned int b, unsigned int c,

MacAddress::MacAddress(const std::string &s,
boost::system::error_code *errorp) {
this->addr_ = FromString(s, errorp);
*this = FromString(s, errorp);
}

string MacAddress::ToString() const {
Expand Down
2 changes: 1 addition & 1 deletion src/vnsw/agent/cfg/cfg_mirror.h
Expand Up @@ -69,7 +69,7 @@ struct MirrorCfgEntry {
};

struct MirrorCfgKeyCmp {
bool operator()(const MirrorCfgKey &lhs, const MirrorCfgKey &rhs) {
bool operator()(const MirrorCfgKey &lhs, const MirrorCfgKey &rhs) const {
return lhs.handle < rhs.handle;
}
};
Expand Down
28 changes: 12 additions & 16 deletions src/vnsw/agent/controller/controller_peer.cc
Expand Up @@ -181,8 +181,8 @@ void AgentXmppChannel::ReceiveEvpnUpdate(XmlPugi *pugi) {
CONTROLLER_INFO_TRACE(Trace, GetBgpPeerName(), vrf_name,
"EVPN Delete Node id:" + id);

char buff[id.length() + 1];
strcpy(buff, id.c_str());
boost::scoped_array<char> buff(new char[id.length() + 1]);
strcpy(buff.get(), id.c_str());

// retract does not have nlri. Need to decode key fields from
// retract id. Format of retract-id expected are:
Expand All @@ -200,14 +200,14 @@ void AgentXmppChannel::ReceiveEvpnUpdate(XmlPugi *pugi) {

// If id has "-", the value before "-" is treated as
// ethernet-tag
char *token = strtok_r(buff + offset, "-", &saveptr);
char *token = strtok_r(buff.get() + offset, "-", &saveptr);
if ((strlen(saveptr) != 0) && token) {
ethernet_tag = atoi(token);
offset += strlen(token) + 1;
}

// Get MAC address. Its delimited by ","
token = strtok_r(buff + offset, ",", &saveptr);
token = strtok_r(buff.get() + offset, ",", &saveptr);
if ((strlen(saveptr) == 0) || (token == NULL)) {
CONTROLLER_TRACE(Trace, GetBgpPeerName(), vrf_name,
"Error parsing MAC from retract-id: " +id);
Expand All @@ -224,7 +224,7 @@ void AgentXmppChannel::ReceiveEvpnUpdate(XmlPugi *pugi) {

offset += strlen(token) + 1;
IpAddress ip_addr;
if (ParseAddress(buff + offset, &ip_addr) < 0) {
if (ParseAddress(buff.get() + offset, &ip_addr) < 0) {
CONTROLLER_TRACE(Trace, GetBgpPeerName(), vrf_name,
"Error decoding IP address from "
"retract-id: "+id);
Expand Down Expand Up @@ -341,16 +341,14 @@ void AgentXmppChannel::ReceiveMulticastUpdate(XmlPugi *pugi) {
}

boost::system::error_code ec;
IpAddress g_addr =
IpAddress::from_string(group, ec);
IpAddress g_address = IpAddress::from_string(group, ec);
if (ec.value() != 0) {
CONTROLLER_TRACE(Trace, GetBgpPeerName(), vrf_name,
"Error parsing multicast group address");
return;
}

IpAddress s_addr =
IpAddress::from_string(source, ec);
IpAddress s_address = IpAddress::from_string(source, ec);
if (ec.value() != 0) {
CONTROLLER_TRACE(Trace, GetBgpPeerName(), vrf_name,
"Error parsing multicast source address");
Expand All @@ -360,8 +358,8 @@ void AgentXmppChannel::ReceiveMulticastUpdate(XmlPugi *pugi) {
//Retract with invalid identifier
agent_->oper_db()->multicast()->
ModifyFabricMembers(agent_->multicast_tree_builder_peer(),
vrf, g_addr.to_v4(),
s_addr.to_v4(), 0, olist,
vrf, g_address.to_v4(),
s_address.to_v4(), 0, olist,
ControllerPeerPath::kInvalidPeerIdentifier);
}
}
Expand Down Expand Up @@ -400,16 +398,14 @@ void AgentXmppChannel::ReceiveMulticastUpdate(XmlPugi *pugi) {

item = &*items_iter;

IpAddress g_addr =
IpAddress::from_string(item->entry.nlri.group, ec);
IpAddress g_address = IpAddress::from_string(item->entry.nlri.group, ec);
if (ec.value() != 0) {
CONTROLLER_TRACE(Trace, GetBgpPeerName(), vrf_name,
"Error parsing multicast group address");
return;
}

IpAddress s_addr =
IpAddress::from_string(item->entry.nlri.source, ec);
IpAddress s_address = IpAddress::from_string(item->entry.nlri.source, ec);
if (ec.value() != 0) {
CONTROLLER_TRACE(Trace, GetBgpPeerName(), vrf_name,
"Error parsing multicast source address");
Expand Down Expand Up @@ -439,7 +435,7 @@ void AgentXmppChannel::ReceiveMulticastUpdate(XmlPugi *pugi) {

agent_->oper_db()->multicast()->ModifyFabricMembers(
agent_->multicast_tree_builder_peer(),
vrf, g_addr.to_v4(), s_addr.to_v4(),
vrf, g_address.to_v4(), s_address.to_v4(),
item->entry.nlri.source_label, olist,
agent_->controller()->multicast_sequence_number());
}
Expand Down
4 changes: 2 additions & 2 deletions src/vnsw/agent/diag/diag.cc
Expand Up @@ -67,7 +67,7 @@ bool DiagEntry::TimerExpiry( uint32_t seq_no) {
DiagEntryOp *op;
RequestTimedOut(seq_no);
if (IsDone()) {
op = new DiagEntryOp(DiagEntryOp::DELETE, this);
op = new DiagEntryOp(DiagEntryOp::DEL, this);
diag_table_->Enqueue(op);
return false;
}
Expand All @@ -91,7 +91,7 @@ bool DiagTable::Process(DiagEntryOp *op) {
Add(op->de_);
break;

case DiagEntryOp::DELETE:
case DiagEntryOp::DEL:
if (op->de_->TimerCancel() == true) {
op->de_->SendSummary();
delete op->de_;
Expand Down
2 changes: 1 addition & 1 deletion src/vnsw/agent/diag/diag.h
Expand Up @@ -85,7 +85,7 @@ struct AgentDiagPktData {
struct DiagEntryOp {
enum Op {
ADD = 1,
DELETE,
DEL,
RETRY,
FORCE_DELETE
};
Expand Down
12 changes: 6 additions & 6 deletions src/vnsw/agent/diag/diag_pkt_handler.cc
Expand Up @@ -130,10 +130,10 @@ void DiagPktHandler::SendTimeExceededPacket() {
uint16_t icmp_len = pkt_info_->ip->ip_hl * 4 + 128;
if (ntohs(pkt_info_->ip->ip_len) < icmp_len)
icmp_len = ntohs(pkt_info_->ip->ip_len);
uint8_t icmp_payload[icmp_len];
memcpy(icmp_payload, pkt_info_->ip, icmp_len);
boost::scoped_array<uint8_t> icmp_payload(new uint8_t[icmp_len]);
memcpy(icmp_payload.get(), pkt_info_->ip, icmp_len);
DiagEntry::DiagKey key = -1;
if (!ParseIcmpData(icmp_payload, icmp_len, (uint16_t *)&key, true))
if (!ParseIcmpData(icmp_payload.get(), icmp_len, (uint16_t *)&key, true))
return;

char *ptr = (char *)pkt_info_->pkt;
Expand Down Expand Up @@ -173,7 +173,7 @@ void DiagPktHandler::SendTimeExceededPacket() {
memset((uint8_t *)hdr, 0, 8);
hdr->icmp_type = ICMP_TIME_EXCEEDED;
hdr->icmp_code = ICMP_EXC_TTL;
memcpy(ptr + len + 8, icmp_payload, icmp_len);
memcpy(ptr + len + 8, icmp_payload.get(), icmp_len);
IcmpChecksum((char *)hdr, 8 + icmp_len);
len += 8 + icmp_len;

Expand Down Expand Up @@ -271,7 +271,7 @@ bool DiagPktHandler::HandleTraceRouteResponse() {

DiagEntryOp *op;
if (IsDone()) {
op = new DiagEntryOp(DiagEntryOp::DELETE, entry);
op = new DiagEntryOp(DiagEntryOp::DEL, entry);
} else {
op = new DiagEntryOp(DiagEntryOp::RETRY, entry);
}
Expand Down Expand Up @@ -427,7 +427,7 @@ bool DiagPktHandler::Run() {

if (entry->GetSeqNo() == entry->GetMaxAttempts()) {
DiagEntryOp *op;
op = new DiagEntryOp(DiagEntryOp::DELETE, entry);
op = new DiagEntryOp(DiagEntryOp::DEL, entry);
entry->diag_table()->Enqueue(op);
} else {
entry->Retry();
Expand Down
1 change: 1 addition & 0 deletions src/vnsw/agent/diag/traceroute.cc
Expand Up @@ -4,6 +4,7 @@

#include <stdint.h>
#include <netinet/udp.h>
#include <netinet/tcp.h>
#include <netinet/icmp6.h>
#include "vr_defs.h"
#include "cmn/agent_cmn.h"
Expand Down
9 changes: 0 additions & 9 deletions src/vnsw/agent/filter/acl.cc
Expand Up @@ -396,15 +396,6 @@ static void AclObjectTrace(AgentLogEvent::type event, AclSpec &acl_spec)
} else if (event == AgentLogEvent::DELETE) {
ACL_TRACE(AclTrace, "Delete", UuidToString(acl_spec.acl_id), acl);
}
switch (event) {
case AgentLogEvent::ADD:
case AgentLogEvent::CHANGE:
break;
case AgentLogEvent::DELETE:
break;
default:
break;
}
}

bool AclTable::IFNodeToUuid(IFMapNode *node, boost::uuids::uuid &u) {
Expand Down
1 change: 1 addition & 0 deletions src/vnsw/agent/filter/acl.h
Expand Up @@ -15,6 +15,7 @@
#include <filter/acl_entry_match.h>
#include <filter/acl_entry_spec.h>
#include <filter/acl_entry.h>
#include <filter/packet_header.h>

struct FlowKey;

Expand Down
16 changes: 8 additions & 8 deletions src/vnsw/agent/filter/acl_entry.cc
Expand Up @@ -30,10 +30,10 @@ AclEntry::ActionList AclEntry::kEmptyActionList;
AclEntry::~AclEntry() {
// Clean up Matches
std::vector<AclEntryMatch *>::iterator it;
for (it = matches_.begin(); it != matches_.end();) {
for (it = matches_.begin(); it != matches_.end(); it++) {
delete(*it);
matches_.erase(it);
}
matches_.clear();

// Clean up Actions
ActionList::iterator ial;
Expand Down Expand Up @@ -448,12 +448,12 @@ static bool SubnetMatch(const std::vector<AclAddressInfo> &list,
const Ip6Address &ip6 = ip.to_v6();
const Ip6Address &data6 = data.to_v6();
const Ip6Address &mask6 = mask.to_v6();
boost::array<uint8_t, 16> ip6_bytes = ip6.to_bytes();
boost::array<uint8_t, 16> data6_bytes = data6.to_bytes();
boost::array<uint8_t, 16> mask6_bytes = mask6.to_bytes();
const uint32_t *ip6_words = (uint32_t *)ip6_bytes.c_array();
const uint32_t *data6_words = (uint32_t *)data6_bytes.c_array();
const uint32_t *mask6_words = (uint32_t *)mask6_bytes.c_array();
Ip6Address::bytes_type ip6_bytes = ip6.to_bytes();
Ip6Address::bytes_type data6_bytes = data6.to_bytes();
Ip6Address::bytes_type mask6_bytes = mask6.to_bytes();
const uint32_t *ip6_words = (const uint32_t *)ip6_bytes.data();
const uint32_t *data6_words = (const uint32_t *)data6_bytes.data();
const uint32_t *mask6_words = (const uint32_t *)mask6_bytes.data();
bool matched = true;
for (int i = 0; i < 4; i++) {
if ((data6_words[i] & mask6_words[i]) != ip6_words[i]) {
Expand Down
13 changes: 9 additions & 4 deletions src/vnsw/agent/pkt/flow_entry.cc
Expand Up @@ -177,7 +177,12 @@ void VmFlowRef::FreeFd() {
FlowProto *proto = flow_->flow_table()->agent()->pkt()->get_flow_proto();
proto->update_linklocal_flow_count(-1);
flow_->flow_table()->DelLinkLocalFlowInfo(fd_);
#ifdef _WIN32
closesocket(fd_);
#else
close(fd_);
#endif

fd_ = kInvalidFd;
port_ = 0;
}
Expand Down Expand Up @@ -226,12 +231,12 @@ bool VmFlowRef::AllocateFd(Agent *agent, uint8_t l3_proto) {

// allow the socket to be reused upon close
int optval = 1;
setsockopt(fd_, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval));
setsockopt(fd_, SOL_SOCKET, SO_REUSEADDR, (const char*)&optval, sizeof(optval));

struct sockaddr_in address;
memset(&address, 0, sizeof(address));
address.sin_family = AF_INET;
if (bind(fd_, (struct sockaddr*) &address, sizeof(address)) < 0) {
if (::bind(fd_, (struct sockaddr*) &address, sizeof(address)) < 0) {
FreeFd();
return false;
}
Expand Down Expand Up @@ -398,7 +403,7 @@ void SessionPolicy::ResetPolicy() {
/////////////////////////////////////////////////////////////////////////////
// FlowEventLog constructor/destructor
/////////////////////////////////////////////////////////////////////////////
FlowEventLog::FlowEventLog() : time_(0), event_(EVENT_MAX),
FlowEventLog::FlowEventLog() : time_(0), event_(EVENT_MAXIMUM),
flow_handle_(FlowEntry::kInvalidFlowHandle), flow_gen_id_(0),
ksync_entry_(NULL), hash_id_(FlowEntry::kInvalidFlowHandle), gen_id_(0),
vrouter_flow_handle_(FlowEntry::kInvalidFlowHandle), vrouter_gen_id_(0) {
Expand Down Expand Up @@ -2694,7 +2699,7 @@ bool FlowPendingAction::CanRevaluate() {
void SetActionStr(const FlowAction &action_info,
std::vector<ActionStr> &action_str_l) {
std::bitset<32> bs(action_info.action);
for (unsigned int i = 0; i <= bs.size(); i++) {
for (unsigned int i = 0; i < bs.size(); i++) {
if (bs[i]) {
ActionStr astr;
astr.action =
Expand Down
2 changes: 1 addition & 1 deletion src/vnsw/agent/pkt/flow_entry.h
Expand Up @@ -359,7 +359,7 @@ struct FlowEventLog {
FLOW_EVICT,
FLOW_HANDLE_ASSIGN,
FLOW_MSG_SKIP_EVICTED,
EVENT_MAX
EVENT_MAXIMUM
};

FlowEventLog();
Expand Down
4 changes: 2 additions & 2 deletions src/vnsw/agent/pkt/flow_mgmt.h
Expand Up @@ -7,6 +7,7 @@
#include <boost/scoped_ptr.hpp>
#include "pkt/flow_table.h"
#include "pkt/flow_mgmt_request.h"
#include "pkt/flow_mgmt_dbclient.h"
#include "pkt/flow_event.h"

////////////////////////////////////////////////////////////////////////////
Expand Down Expand Up @@ -194,7 +195,6 @@
// Forward declaration
class FlowMgmtManager;
class VrfFlowMgmtTree;
class FlowMgmtDbClient;
class HealthCheckInstanceBase;

////////////////////////////////////////////////////////////////////////////
Expand Down Expand Up @@ -314,7 +314,7 @@ class FlowMgmtKey {
};

struct FlowMgmtKeyCmp {
bool operator()(const FlowMgmtKey *l, const FlowMgmtKey *r) {
bool operator()(const FlowMgmtKey *l, const FlowMgmtKey *r) const {
return l->IsLess(r);
}
};
Expand Down
1 change: 1 addition & 0 deletions src/vnsw/agent/pkt/flow_mgmt_dbclient.cc
@@ -1,4 +1,5 @@
#include "pkt/flow_mgmt_dbclient.h"
#include "pkt/flow_mgmt.h"
#include "oper/ecmp_load_balance.h"
#include "oper/ecmp.h"

Expand Down
2 changes: 1 addition & 1 deletion src/vnsw/agent/pkt/flow_mgmt_dbclient.h
Expand Up @@ -4,7 +4,7 @@
#ifndef __AGENT_FLOW_MGMT_DBCLIENT_H__
#define __AGENT_FLOW_MGMT_DBCLIENT_H__

#include "pkt/flow_mgmt.h"
#include "pkt/flow_event.h"

class EcmpLoadBalance;
////////////////////////////////////////////////////////////////////////////
Expand Down

0 comments on commit 382cccd

Please sign in to comment.