Line data Source code
1 : /* 2 : * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved. 3 : */ 4 : 5 : #include "kstate.h" 6 : #include "vrf_assign_kstate.h" 7 : 8 0 : VrfAssignKState::VrfAssignKState(KVrfAssignResp *obj, 9 : const std::string &resp_ctx, 10 0 : vr_vrf_assign_req &req, int id) : 11 0 : KState(resp_ctx, obj) { 12 : 13 0 : req.set_h_op(sandesh_op::DUMP); 14 0 : req.set_var_vif_index(id); 15 0 : req.set_var_marker(-1); 16 0 : } 17 : 18 0 : void VrfAssignKState::SendNextRequest() { 19 0 : VrfAssignContext *ctx = boost::any_cast<VrfAssignContext *>(more_context_); 20 0 : vr_vrf_assign_req req; 21 : 22 0 : req.set_h_op(sandesh_op::DUMP); 23 0 : req.set_var_vif_index(ctx->vif_index_); 24 0 : req.set_var_vlan_id(ctx->marker_); 25 0 : req.set_var_marker(ctx->marker_); 26 0 : EncodeAndSend(req); 27 0 : } 28 : 29 0 : void VrfAssignKState::Handler() { 30 0 : KVrfAssignResp *resp = static_cast<KVrfAssignResp *>(response_object_); 31 0 : if (resp) { 32 0 : if (MoreData()) { 33 : /* There are more labels in Kernel. We need to query them from 34 : * Kernel and send it to Sandesh. 35 : */ 36 0 : SendResponse(); 37 0 : SendNextRequest(); 38 : } else { 39 0 : resp->set_context(response_context_); 40 0 : resp->Response(); 41 0 : if (!more_context_.empty()) { 42 : VrfAssignContext *ctx = 43 0 : boost::any_cast<VrfAssignContext *>(more_context_); 44 0 : if (ctx) { 45 0 : delete ctx; 46 0 : more_context_ = boost::any(); 47 : } 48 : } 49 : } 50 : } 51 0 : } 52 : 53 0 : void VrfAssignKState::SendResponse() { 54 0 : KVrfAssignResp *resp = static_cast<KVrfAssignResp *>(response_object_); 55 0 : resp->set_context(response_context_); 56 0 : resp->set_more(true); 57 0 : resp->Response(); 58 : 59 0 : response_object_ = new KVrfAssignResp(); 60 0 : }