diff options
Diffstat (limited to 'include/rxrpc/message.h')
-rw-r--r-- | include/rxrpc/message.h | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/include/rxrpc/message.h b/include/rxrpc/message.h new file mode 100644 index 00000000000..3a59df6870b --- /dev/null +++ b/include/rxrpc/message.h @@ -0,0 +1,71 @@ +/* message.h: Rx message caching + * + * Copyright (C) 2002 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version + * 2 of the License, or (at your option) any later version. + */ + +#ifndef _LINUX_RXRPC_MESSAGE_H +#define _LINUX_RXRPC_MESSAGE_H + +#include <rxrpc/packet.h> + +/*****************************************************************************/ +/* + * Rx message record + */ +struct rxrpc_message +{ + atomic_t usage; + struct list_head link; /* list link */ + struct timeval stamp; /* time received or last sent */ + rxrpc_seq_t seq; /* message sequence number */ + + int state; /* the state the message is currently in */ +#define RXRPC_MSG_PREPARED 0 +#define RXRPC_MSG_SENT 1 +#define RXRPC_MSG_ACKED 2 /* provisionally ACK'd */ +#define RXRPC_MSG_DONE 3 /* definitively ACK'd (msg->seq<ack.firstPacket) */ +#define RXRPC_MSG_RECEIVED 4 +#define RXRPC_MSG_ERROR -1 + char rttdone; /* used for RTT */ + + struct rxrpc_transport *trans; /* transport received through */ + struct rxrpc_connection *conn; /* connection received over */ + struct sk_buff *pkt; /* received packet */ + off_t offset; /* offset into pkt of next byte of data */ + + struct rxrpc_header hdr; /* message header */ + + int dcount; /* data part count */ + size_t dsize; /* data size */ +#define RXRPC_MSG_MAX_IOCS 8 + struct kvec data[RXRPC_MSG_MAX_IOCS]; /* message data */ + unsigned long dfree; /* bit mask indicating kfree(data[x]) if T */ +}; + +#define rxrpc_get_message(M) do { atomic_inc(&(M)->usage); } while(0) + +extern void __rxrpc_put_message(struct rxrpc_message *msg); +static inline void rxrpc_put_message(struct rxrpc_message *msg) +{ + BUG_ON(atomic_read(&msg->usage)<=0); + if (atomic_dec_and_test(&msg->usage)) + __rxrpc_put_message(msg); +} + +extern int rxrpc_conn_newmsg(struct rxrpc_connection *conn, + struct rxrpc_call *call, + uint8_t type, + int count, + struct kvec *diov, + int alloc_flags, + struct rxrpc_message **_msg); + +extern int rxrpc_conn_sendmsg(struct rxrpc_connection *conn, struct rxrpc_message *msg); + +#endif /* _LINUX_RXRPC_MESSAGE_H */ |