Skip to content

Commit

Permalink
Make virtual switch use metadata (sonic-net#77)
Browse files Browse the repository at this point in the history
  • Loading branch information
kcudnik committed Oct 6, 2016
1 parent 6239368 commit 47a6c84
Show file tree
Hide file tree
Showing 35 changed files with 2,032 additions and 3,799 deletions.
96 changes: 34 additions & 62 deletions vslib/inc/sai_vs.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,33 +2,18 @@
#define __SAI_VS__

#include <mutex>
#include <unordered_map>

#include "stdint.h"
#include "stdio.h"
//#include "stdint.h"
//#include "stdio.h"

extern "C" {
#include "sai.h"
}
#include "saiserialize.h"
#include "saiattributelist.h"

#include "swss/logger.h"
#include "sai_meta.h"

extern service_method_table_t g_services;

extern uint64_t g_real_id;

typedef std::unordered_map<std::string, std::string> AttrHash;
typedef std::unordered_map<std::string, AttrHash> ObjectHash;

// first key is serialized object ID (object id, vlan, route, neighbor, fdb)
// value is hash containing attributes
// second key is serialized attribute ID for given object
// value is serialized attribute value
extern ObjectHash g_objectHash;

extern std::recursive_mutex g_recursive_mutex;
extern std::recursive_mutex g_recursive_mutex;

extern const sai_acl_api_t vs_acl_api;
extern const sai_buffer_api_t vs_buffer_api;
Expand Down Expand Up @@ -57,128 +42,115 @@ extern const sai_virtual_router_api_t vs_router_api;
extern const sai_vlan_api_t vs_vlan_api;
extern const sai_wred_api_t vs_wred_api;

extern sai_switch_notification_t vs_switch_notifications;

#define UNREFERENCED_PARAMETER(X)

void translate_rid_to_vid(
_In_ sai_object_type_t object_type,
_In_ uint32_t attr_count,
_In_ sai_attribute_t *attr_list);

// separate methods are needed for vlan to not confuse with object_id
// CREATE

sai_status_t vs_generic_create(
_In_ sai_object_type_t object_type,
_Out_ sai_object_id_t* object_id,
_In_ uint32_t attr_count,
_In_ const sai_attribute_t *attr_list);

sai_status_t vs_generic_create(
_In_ sai_object_type_t object_type,
sai_status_t vs_generic_create_fdb_entry(
_In_ const sai_fdb_entry_t *fdb_entry,
_In_ uint32_t attr_count,
_In_ const sai_attribute_t *attr_list);

sai_status_t vs_generic_create(
_In_ sai_object_type_t object_type,
sai_status_t vs_generic_create_neighbor_entry(
_In_ const sai_neighbor_entry_t* neighbor_entry,
_In_ uint32_t attr_count,
_In_ const sai_attribute_t *attr_list);

sai_status_t vs_generic_create(
_In_ sai_object_type_t object_type,
sai_status_t vs_generic_create_route_entry(
_In_ const sai_unicast_route_entry_t* unicast_route_entry,
_In_ uint32_t attr_count,
_In_ const sai_attribute_t *attr_list);

sai_status_t vs_generic_create_vlan(
_In_ sai_object_type_t object_type,
_In_ sai_vlan_id_t vlan_id);

// REMOVE

sai_status_t vs_generic_remove(
_In_ sai_object_type_t object_type,
_In_ sai_object_id_t object_id);

sai_status_t vs_generic_remove(
_In_ sai_object_type_t object_type,
sai_status_t vs_generic_remove_fdb_entry(
_In_ const sai_fdb_entry_t* fdb_entry);

sai_status_t vs_generic_remove(
_In_ sai_object_type_t object_type,
sai_status_t vs_generic_remove_neighbor_entry(
_In_ const sai_neighbor_entry_t* neighbor_entry);

sai_status_t vs_generic_remove(
_In_ sai_object_type_t object_type,
sai_status_t vs_generic_remove_route_entry(
_In_ const sai_unicast_route_entry_t* unicast_route_entry);

sai_status_t vs_generic_remove_vlan(
_In_ sai_object_type_t object_type,
_In_ sai_vlan_id_t vlan_id);

// SET

sai_status_t vs_generic_set(
_In_ sai_object_type_t object_type,
_In_ sai_object_id_t object_id,
_In_ const sai_attribute_t *attr);

sai_status_t vs_generic_set(
_In_ sai_object_type_t object_type,
sai_status_t vs_generic_set_fdb_entry(
_In_ const sai_fdb_entry_t *fdb_entry,
_In_ const sai_attribute_t *attr);

sai_status_t vs_generic_set(
_In_ sai_object_type_t object_type,
sai_status_t vs_generic_set_neighbor_entry(
_In_ const sai_neighbor_entry_t* neighbor_entry,
_In_ const sai_attribute_t *attr);

sai_status_t vs_generic_set(
_In_ sai_object_type_t object_type,
sai_status_t vs_generic_set_route_entry(
_In_ const sai_unicast_route_entry_t* unicast_route_entry,
_In_ const sai_attribute_t *attr);

sai_status_t vs_generic_set_vlan(
_In_ sai_object_type_t object_type,
_In_ sai_vlan_id_t vlan_id,
_In_ const sai_attribute_t *attr);

sai_status_t vs_generic_set_trap(
_In_ sai_hostif_trap_id_t hostif_trapid,
_In_ const sai_attribute_t *attr);

sai_status_t vs_generic_set_switch(
_In_ const sai_attribute_t *attr);

// GET

sai_status_t vs_generic_get(
_In_ sai_object_type_t object_type,
_In_ sai_object_id_t object_id,
_In_ uint32_t attr_count,
_Out_ sai_attribute_t *attr_list);

sai_status_t vs_generic_get(
_In_ sai_object_type_t object_type,
sai_status_t vs_generic_get_fdb_entry(
_In_ const sai_fdb_entry_t *fdb_entry,
_In_ uint32_t attr_count,
_Out_ sai_attribute_t *attr_list);

sai_status_t vs_generic_get(
_In_ sai_object_type_t object_type,
sai_status_t vs_generic_get_neighbor_entry(
_In_ const sai_neighbor_entry_t* neighbor_entry,
_In_ uint32_t attr_count,
_Out_ sai_attribute_t *attr_list);

sai_status_t vs_generic_get(
_In_ sai_object_type_t object_type,
sai_status_t vs_generic_get_route_entry(
_In_ const sai_unicast_route_entry_t* unicast_route_entry,
_In_ uint32_t attr_count,
_Out_ sai_attribute_t *attr_list);

sai_status_t vs_generic_get_vlan(
_In_ sai_object_type_t object_type,
_In_ sai_vlan_id_t vlan_id,
_In_ uint32_t attr_count,
_Out_ sai_attribute_t *attr_list);

// notifications
sai_status_t vs_generic_get_trap(
_In_ sai_hostif_trap_id_t hostif_trapid,
_In_ uint32_t attr_count,
_Out_ sai_attribute_t *attr_list);

void handle_notification(
_In_ const std::string &notification,
_In_ const std::string &data,
_In_ const std::vector<swss::FieldValueTuple> &values);
sai_status_t vs_generic_get_switch(
_In_ uint32_t attr_count,
_Out_ sai_attribute_t *attr_list);

#endif // __SAI_VS__
27 changes: 27 additions & 0 deletions vslib/inc/sai_vs_state.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
#ifndef __SAI_VS_STATE__
#define __SAI_VS_STATE__

#include <unordered_map>
#include <string>

#include "sai_meta.h"

#include "saiserialize.h"
#include "saiattributelist.h"

typedef std::unordered_map<std::string, std::string> AttrHash;
typedef std::unordered_map<std::string, AttrHash> ObjectHash;

// first key is serialized object ID (object id, vlan, route, neighbor, fdb, trap)
// value is hash containing attributes
// second key is serialized attribute ID for given object
// value is serialized attribute value
extern ObjectHash g_objectHash;

extern void reset_id_counter();

extern sai_object_id_t switch_object_id;

extern sai_status_t init_switch();

#endif // __SAI_VS_STATE__
140 changes: 104 additions & 36 deletions vslib/src/Makefile.am
Original file line number Diff line number Diff line change
@@ -1,8 +1,47 @@
# Makefile.am -- Process this file with automake to produce Makefile.in
WARNINGS = \
-ansi \
-Wall \
-Wcast-align \
-Wcast-qual \
-Wconversion \
-Wdisabled-optimization \
-Werror \
-Wextra \
-Wextra \
-Wfloat-equal \
-Wformat=2 \
-Wformat-nonliteral \
-Wformat-security \
-Wformat-y2k \
-Wimport \
-Winit-self \
-Winline \
-Winvalid-pch \
-Wlong-long \
-Wmissing-field-initializers \
-Wmissing-format-attribute \
-Wmissing-include-dirs \
-Wmissing-noreturn \
-Wno-aggregate-return \
-Wno-padded \
-Wno-switch-enum \
-Wno-unused-parameter \
-Wpacked \
-Wpointer-arith \
-Wredundant-decls \
-Wshadow \
-Wstack-protector \
-Wstrict-aliasing=2 \
-Wswitch \
-Wswitch-default \
-Wunreachable-code \
-Wunused \
-Wvariadic-macros \
-Wwrite-strings

AM_CPPFLAGS =
AM_CPPFLAGS += -I/usr/include/sai -I/usr/include/swss -I$(top_srcdir)/common
AM_CPPFLAGS += -I../inc
AM_CPPFLAGS += -I../inc -I../../meta $(WARNINGS)

if DEBUG
DBGFLAGS = -ggdb -D_DEBUG_
Expand All @@ -12,40 +51,69 @@ endif

lib_LTLIBRARIES = libsai.la

libsai_la_SOURCES = sai_vs_acl.cpp \
sai_vs_buffer.cpp \
sai_vs_fdb.cpp \
sai_vs_hash.cpp \
sai_vs_hostintf.cpp \
sai_vs_interfacequery.cpp \
sai_vs_lag.cpp \
sai_vs_mirror.cpp \
sai_vs_neighbor.cpp \
sai_vs_nexthop.cpp \
sai_vs_nexthopgroup.cpp \
sai_vs_policer.cpp \
sai_vs_port.cpp \
sai_vs_qosmaps.cpp \
sai_vs_queue.cpp \
sai_vs_route.cpp \
sai_vs_router.cpp \
sai_vs_routerintf.cpp \
sai_vs_samplepacket.cpp \
sai_vs_scheduler.cpp \
sai_vs_schedulergroup.cpp \
sai_vs_stp.cpp \
sai_vs_switch.cpp \
sai_vs_tunnel.cpp \
sai_vs_udf.cpp \
sai_vs_vlan.cpp \
sai_vs_wred.cpp \
sai_vs_generic_create.cpp \
sai_vs_generic_remove.cpp \
sai_vs_generic_set.cpp \
sai_vs_generic_get.cpp \
../../common/saiserialize.cpp \
../../common/saiattributelist.cpp

libsai_la_SOURCES = \
../../common/saiattributelist.cpp \
../../common/saiserialize.cpp \
../../meta/sai_meta_acl.cpp \
../../meta/sai_meta_buffer.cpp \
../../meta/sai_meta.cpp \
../../meta/sai_meta_fdb.cpp \
../../meta/sai_meta_hash.cpp \
../../meta/sai_meta_hostintf.cpp \
../../meta/sai_meta_lag.cpp \
../../meta/sai_meta_mirror.cpp \
../../meta/sai_meta_neighbor.cpp \
../../meta/sai_meta_nexthop.cpp \
../../meta/sai_meta_nexthopgroup.cpp \
../../meta/sai_meta_policer.cpp \
../../meta/sai_meta_port.cpp \
../../meta/sai_meta_qosmaps.cpp \
../../meta/sai_meta_queue.cpp \
../../meta/sai_meta_route.cpp \
../../meta/sai_meta_router.cpp \
../../meta/sai_meta_routerintf.cpp \
../../meta/sai_meta_samplepacket.cpp \
../../meta/sai_meta_sanity.cpp \
../../meta/sai_meta_scheduler.cpp \
../../meta/sai_meta_schedulergroup.cpp \
../../meta/sai_meta_stp.cpp \
../../meta/sai_meta_switch.cpp \
../../meta/sai_meta_tunnel.cpp \
../../meta/sai_meta_udf.cpp \
../../meta/sai_meta_vlan.cpp \
../../meta/sai_meta_wred.cpp \
sai_vs_acl.cpp \
sai_vs_buffer.cpp \
sai_vs_fdb.cpp \
sai_vs_generic_create.cpp \
sai_vs_generic_get.cpp \
sai_vs_generic_remove.cpp \
sai_vs_generic_set.cpp \
sai_vs_hash.cpp \
sai_vs_hostintf.cpp \
sai_vs_init.cpp \
sai_vs_interfacequery.cpp \
sai_vs_lag.cpp \
sai_vs_mirror.cpp \
sai_vs_neighbor.cpp \
sai_vs_nexthop.cpp \
sai_vs_nexthopgroup.cpp \
sai_vs_policer.cpp \
sai_vs_port.cpp \
sai_vs_qosmaps.cpp \
sai_vs_queue.cpp \
sai_vs_route.cpp \
sai_vs_router.cpp \
sai_vs_routerintf.cpp \
sai_vs_samplepacket.cpp \
sai_vs_scheduler.cpp \
sai_vs_schedulergroup.cpp \
sai_vs_stp.cpp \
sai_vs_switch.cpp \
sai_vs_tunnel.cpp \
sai_vs_udf.cpp \
sai_vs_vlan.cpp \
sai_vs_wred.cpp

libsai_la_CPPFLAGS = $(DBGFLAGS) $(AM_CPPFLAGS) $(CFLAGS_COMMON)

Expand Down
Loading

0 comments on commit 47a6c84

Please sign in to comment.