/* * Grab the operation ID from an incoming cache manager call. The socket * buffer is discarded on error or if we don't yet have sufficient data. */ static int afs_deliver_cm_op_id(struct afs_call *call) { int ret; _enter("{%zu}", call->offset); ASSERTCMP(call->offset, <, 4); /* the operation ID forms the first four bytes of the request data */ ret = afs_extract_data(call, &call->tmp, 4, true); if (ret < 0) return ret; call->operation_ID = ntohl(call->tmp); afs_set_call_state(call, AFS_CALL_SV_AWAIT_OP_ID, AFS_CALL_SV_AWAIT_REQUEST); call->offset = 0; /* ask the cache manager to route the call (it'll change the call type * if successful) */ if (!afs_cm_incoming_call(call)) return -ENOTSUPP; trace_afs_cb_call(call); /* pass responsibility for the remainer of this message off to the * cache manager op */ return call->type->deliver(call); }
/* * grab the operation ID from an incoming cache manager call */ static int afs_deliver_cm_op_id(struct afs_call *call, struct sk_buff *skb, bool last) { size_t len = skb->len; void *oibuf = (void *) &call->operation_ID; _enter("{%u},{%zu},%d", call->offset, len, last); ASSERTCMP(call->offset, <, 4); /* the operation ID forms the first four bytes of the request data */ len = min_t(size_t, len, 4 - call->offset); if (skb_copy_bits(skb, 0, oibuf + call->offset, len) < 0) BUG(); if (!pskb_pull(skb, len)) BUG(); call->offset += len; if (call->offset < 4) { if (last) { _leave(" = -EBADMSG [op ID short]"); return -EBADMSG; } _leave(" = 0 [incomplete]"); return 0; } call->state = AFS_CALL_AWAIT_REQUEST; /* ask the cache manager to route the call (it'll change the call type * if successful) */ if (!afs_cm_incoming_call(call)) return -ENOTSUPP; /* pass responsibility for the remainer of this message off to the * cache manager op */ return call->type->deliver(call, skb, last); }