Line data Source code
1 : /*
2 : * vr_sandesh.c -- sandesh messaging protocol for datapath
3 : *
4 : * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved.
5 : * Copyright Contributors to the OpenSDN project
6 : */
7 : #include "vr_os.h"
8 : #include "vr_types.h"
9 : #include "vr_message.h"
10 : #include "vr_sandesh.h"
11 : #include "vr_packet.h"
12 : #include "vrouter.h"
13 :
14 : struct sandesh_object_md sandesh_md[] = {
15 : [VR_NULL_OBJECT_ID] = {
16 : .obj_len = sizeof(vr_response),
17 : .obj_type_string = "vr_null_object",
18 : },
19 : [VR_INTERFACE_OBJECT_ID] = {
20 : .obj_len = 4 * sizeof(vr_interface_req),
21 : .obj_get_size = vr_interface_req_get_size,
22 : .obj_type_string = "vr_interface_req",
23 : },
24 : [VR_NEXTHOP_OBJECT_ID] = {
25 : .obj_len = 4 * sizeof(vr_nexthop_req),
26 : .obj_get_size = vr_nexthop_req_get_size,
27 : .obj_type_string = "vr_nexthop_req",
28 : },
29 : [VR_ROUTE_OBJECT_ID] = {
30 : .obj_len = 4 * sizeof(vr_route_req),
31 : .obj_type_string = "vr_route_req",
32 : },
33 : [VR_MPLS_OBJECT_ID] = {
34 : .obj_len = 4 * sizeof(vr_mpls_req),
35 : .obj_type_string = "vr_mpls_req"
36 : },
37 : [VR_MIRROR_OBJECT_ID] = {
38 : .obj_len = 4 * sizeof(vr_mirror_req),
39 : .obj_type_string = "vr_mirror_req",
40 : },
41 : [VR_FLOW_OBJECT_ID] = {
42 : .obj_len = 4 * sizeof(vr_flow_req),
43 : .obj_type_string = "vr_flow_req",
44 : },
45 : [VR_VRF_ASSIGN_OBJECT_ID] = {
46 : .obj_len = 4 * sizeof(vr_vrf_assign_req),
47 : .obj_type_string = "vr_vrf_assign_req",
48 : },
49 : [VR_VRF_STATS_OBJECT_ID] = {
50 : .obj_len = 4 * sizeof(vr_vrf_stats_req),
51 : .obj_type_string = "vr_vrf_stats_req",
52 : },
53 : [VR_PKT_DROP_LOG_OBJECT_ID] = {
54 : .obj_len = 4 * sizeof(vr_pkt_drop_log_req),
55 : .obj_get_size = vr_pkt_drop_log_req_get_size,
56 : .obj_type_string = "vr_pkt_drop_log_req",
57 : },
58 : [VR_DROP_STATS_OBJECT_ID] = {
59 : .obj_len = 4 * sizeof(vr_drop_stats_req),
60 : .obj_type_string = "vr_drop_stats_req",
61 : },
62 : [VR_INFO_OBJECT_ID] = {
63 : .obj_len = (4 * sizeof(vr_info_req)),
64 : .obj_type_string = "vr_info_req",
65 : },
66 : [VR_RESPONSE_OBJECT_ID] = {
67 : .obj_len = 4 * sizeof(vr_response),
68 : .obj_type_string = "vr_response",
69 : },
70 : [VR_VXLAN_OBJECT_ID] = {
71 : .obj_len = 4 * sizeof(vr_vxlan_req),
72 : .obj_type_string = "vr_vxlan_req",
73 : },
74 : [VR_VROUTER_OPS_OBJECT_ID] = {
75 : .obj_len = 4 * sizeof(vrouter_ops),
76 : .obj_type_string = "vrouter_ops",
77 : },
78 : [VR_FLOW_TABLE_DATA_OBJECT_ID] = {
79 : .obj_len = ((4 * sizeof(vr_flow_table_data)) +
80 : (VR_FLOW_MAX_CPUS * sizeof(unsigned int))),
81 : .obj_type_string = "vr_flow_table_data",
82 : },
83 : [VR_MEM_STATS_OBJECT_ID] = {
84 : .obj_len = 4 * sizeof(vr_mem_stats_req),
85 : .obj_type_string = "vr_mem_stats_req",
86 : },
87 : [VR_QOS_MAP_OBJECT_ID] = {
88 : .obj_len = 4 * sizeof(vr_qos_map_req),
89 : .obj_get_size = vr_qos_map_req_get_size,
90 : .obj_type_string = "vr_qos_map_req",
91 : },
92 : [VR_FC_MAP_OBJECT_ID] = {
93 : .obj_len = 4 * sizeof(vr_fc_map_req),
94 : .obj_type_string = "vr_fc_map_req",
95 : },
96 : [VR_FLOW_RESPONSE_OBJECT_ID] = {
97 : .obj_len = 4 * sizeof(vr_flow_response),
98 : .obj_type_string = "vr_flow_response",
99 : },
100 : [VR_BRIDGE_TABLE_DATA_OBJECT_ID] = {
101 : .obj_len = 4 * sizeof(vr_bridge_table_data),
102 : .obj_type_string = "vr_bridge_table_data",
103 : },
104 : [VR_HPAGE_CFG_OBJECT_ID] = {
105 : .obj_len = 4 * sizeof(vr_hugepage_config),
106 : .obj_type_string = "vr_hugepage_config",
107 : },
108 : [VR_VRF_TABLE_OBJECT_ID] = {
109 : .obj_len = 4 * sizeof(vr_vrf_req),
110 : .obj_type_string = "vr_vrf_req",
111 : },
112 : };
113 :
114 : static unsigned int
115 5724 : sandesh_proto_buf_len(unsigned int object_type, void *object)
116 : {
117 5724 : if (!object && object_type != VR_RESPONSE_OBJECT_ID)
118 1994 : return 0;
119 :
120 3730 : if (sandesh_md[object_type].obj_get_size)
121 188 : return sandesh_md[object_type].obj_get_size(object);
122 :
123 3542 : return sandesh_md[object_type].obj_len;
124 : }
125 :
126 : static int
127 3021 : sandesh_proto_encode(char *buf, unsigned int len,
128 : unsigned int object_type, void *object,
129 : unsigned int message_type)
130 : {
131 3021 : int off = 0, error = 0;
132 :
133 3021 : if (object)
134 1027 : off = sandesh_encode(object,
135 1027 : sandesh_md[object_type].obj_type_string,
136 : vr_find_sandesh_info, (unsigned char *)buf, len, &error);
137 :
138 3021 : if (error)
139 0 : return -1;
140 :
141 3021 : return off;
142 : }
143 :
144 : static int
145 2704 : sandesh_proto_encode_response(char *buf, unsigned int len,
146 : unsigned int object_type, void *object, int ret)
147 : {
148 : int off, error;
149 : vr_response resp;
150 :
151 2704 : resp.h_op = SANDESH_OP_RESPONSE;
152 2704 : resp.resp_code = ret;
153 :
154 2704 : off = sandesh_encode(&resp, "vr_response", vr_find_sandesh_info,
155 : (unsigned char *)buf, len, &error);
156 2704 : if (off < 0)
157 0 : return off;
158 :
159 2704 : error = sandesh_proto_encode(buf + off, len - off,
160 : object_type, object, VR_MESSAGE_TYPE_RESPONSE);
161 2704 : if (error < 0)
162 0 : return error;
163 :
164 2704 : return off + error;
165 : }
166 :
167 : static int
168 2862 : sandesh_proto_decode(char *buf, unsigned int len,
169 : int (*cb)(void *, unsigned int, void *), void *cb_arg)
170 : {
171 2862 : int ret = 0;
172 :
173 2862 : return sandesh_decode((unsigned char *)buf, len,
174 : vr_find_sandesh_info, &ret);
175 : }
176 :
177 : static struct vr_mproto sandesh_mproto = {
178 : .mproto_type = VR_MPROTO_SANDESH,
179 : .mproto_buf_len = sandesh_proto_buf_len,
180 : .mproto_encode = sandesh_proto_encode,
181 : .mproto_encode_response = sandesh_proto_encode_response,
182 : .mproto_decode = sandesh_proto_decode,
183 : };
184 :
185 : void
186 53 : vr_sandesh_exit(void)
187 : {
188 53 : vr_message_proto_unregister(&sandesh_mproto);
189 53 : return;
190 : }
191 :
192 : int
193 53 : vr_sandesh_init(void)
194 : {
195 53 : vr_message_proto_register(&sandesh_mproto);
196 53 : return 0;
197 : }
|