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