/* k_move_data.c */ /* * Copyright (c) 1997-2014 Wind River Systems, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include /** * * mvdreq_docont - * * @return N/A */ static void mvdreq_docont(struct k_args *Cont) { struct k_args *next; while (Cont) { next = Cont; Cont = Cont->next; SENDARGS(next); } } /** * * @brief Perform movedata request * * @return N/A */ static void mvdreq_copy(struct moved_req *ReqArgs) { memcpy(ReqArgs->destination, ReqArgs->source, OCTET_TO_SIZEOFUNIT(ReqArgs->total_size)); if (ReqArgs->action & MVDACT_SNDACK) mvdreq_docont(ReqArgs->extra.setup.continuation_send); if (ReqArgs->action & MVDACT_RCVACK) mvdreq_docont(ReqArgs->extra.setup.continuation_receive); } /** * * @brief Process a movedata request * * @return N/A */ void _k_movedata_request(struct k_args *Req) { struct moved_req *ReqArgs; ReqArgs = &(Req->args.moved_req); __ASSERT_NO_MSG(0 == (ReqArgs->total_size % SIZEOFUNIT_TO_OCTET(1))); /* must be a multiple of size_t */ __ASSERT_NO_MSG(!(ReqArgs->action & MVDACT_INVALID)); /* * If no data is to be transferred, just execute the continuation * packet, if any, and get out: */ if (0 == ReqArgs->total_size) { if (ReqArgs->action & MVDACT_SNDACK) /* Send ack continuation */ mvdreq_docont( ReqArgs->extra.setup.continuation_send); if (ReqArgs->action & MVDACT_RCVACK) /* Recv ack continuation */ mvdreq_docont( ReqArgs->extra.setup.continuation_receive); return; } mvdreq_copy(ReqArgs); }