diff options
| author | Hal Rosenstock <halr@voltaire.com> | 2005-07-27 11:45:41 -0700 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@g5.osdl.org> | 2005-07-27 16:26:14 -0700 | 
| commit | 3f75daddb4fc6b695faa4e12e76894389e913dcb (patch) | |
| tree | 33f665bd5d0c42d616196dbbc15d9925519feb50 /Documentation/infiniband | |
| parent | a977049dacdef6a9e69fb4872b42a68e93a69956 (diff) | |
| download | linux-3f75daddb4fc6b695faa4e12e76894389e913dcb.tar.bz2 | |
[PATCH] IB: User MAD ABI changes to support RMPP
User MAD ABI changes to support RMPP
Signed-off-by: Hal Rosenstock <halr@voltaire.com>
Cc: Roland Dreier <rolandd@cisco.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'Documentation/infiniband')
| -rw-r--r-- | Documentation/infiniband/user_mad.txt | 53 | 
1 files changed, 40 insertions, 13 deletions
| diff --git a/Documentation/infiniband/user_mad.txt b/Documentation/infiniband/user_mad.txt index cae0c83f1ee9..750fe5e80ebc 100644 --- a/Documentation/infiniband/user_mad.txt +++ b/Documentation/infiniband/user_mad.txt @@ -28,13 +28,37 @@ Creating MAD agents  Receiving MADs -  MADs are received using read().  The buffer passed to read() must be -  large enough to hold at least one struct ib_user_mad.  For example: - -	struct ib_user_mad mad; -	ret = read(fd, &mad, sizeof mad); -	if (ret != sizeof mad) +  MADs are received using read().  The receive side now supports +  RMPP. The buffer passed to read() must be at least one +  struct ib_user_mad + 256 bytes. For example: + +  If the buffer passed is not large enough to hold the received +  MAD (RMPP), the errno is set to ENOSPC and the length of the +  buffer needed is set in mad.length. + +  Example for normal MAD (non RMPP) reads: +	struct ib_user_mad *mad; +	mad = malloc(sizeof *mad + 256); +	ret = read(fd, mad, sizeof *mad + 256); +	if (ret != sizeof mad + 256) { +		perror("read"); +		free(mad); +	} + +  Example for RMPP reads: +	struct ib_user_mad *mad; +	mad = malloc(sizeof *mad + 256); +	ret = read(fd, mad, sizeof *mad + 256); +	if (ret == -ENOSPC)) { +		length = mad.length; +		free(mad); +		mad = malloc(sizeof *mad + length); +		ret = read(fd, mad, sizeof *mad + length); +	} +	if (ret < 0) {  		perror("read"); +		free(mad); +	}    In addition to the actual MAD contents, the other struct ib_user_mad    fields will be filled in with information on the received MAD.  For @@ -50,18 +74,21 @@ Sending MADs    MADs are sent using write().  The agent ID for sending should be    filled into the id field of the MAD, the destination LID should be -  filled into the lid field, and so on.  For example: +  filled into the lid field, and so on.  The send side does support +  RMPP so arbitrary length MAD can be sent. For example: + +	struct ib_user_mad *mad; -	struct ib_user_mad mad; +	mad = malloc(sizeof *mad + mad_length); -	/* fill in mad.data */ +	/* fill in mad->data */ -	mad.id  = my_agent;	/* req.id from agent registration */ -	mad.lid = my_dest;	/* in network byte order... */ +	mad->hdr.id  = my_agent;	/* req.id from agent registration */ +	mad->hdr.lid = my_dest;		/* in network byte order... */  	/* etc. */ -	ret = write(fd, &mad, sizeof mad); -	if (ret != sizeof mad) +	ret = write(fd, &mad, sizeof *mad + mad_length); +	if (ret != sizeof *mad + mad_length)  		perror("write");  Setting IsSM Capability Bit |