mirror of
https://github.com/adulau/aha.git
synced 2024-12-27 19:26:25 +00:00
firewire: net: better FIFO address range check and rcodes
The AR req handler should not check the generation; higher level code is the better place to handle bus generation changes. The target node ID just needs to be checked for not being the "all nodes" address; in this case don't handle the request and don't respond. Use Address_Error and Type_Error rcodes as appropriate. Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
This commit is contained in:
parent
b01b4babbf
commit
00635b8ee2
1 changed files with 14 additions and 16 deletions
|
@ -810,29 +810,27 @@ static void fwnet_receive_packet(struct fw_card *card, struct fw_request *r,
|
|||
int speed, unsigned long long offset, void *payload,
|
||||
size_t length, void *callback_data)
|
||||
{
|
||||
struct fwnet_device *dev;
|
||||
int status;
|
||||
struct fwnet_device *dev = callback_data;
|
||||
int rcode;
|
||||
|
||||
dev = callback_data;
|
||||
if (tcode != TCODE_WRITE_BLOCK_REQUEST
|
||||
|| destination != card->node_id /* <- FIXME */
|
||||
|| generation != card->generation /* <- FIXME */
|
||||
|| offset != dev->handler.offset) {
|
||||
fw_send_response(card, r, RCODE_CONFLICT_ERROR);
|
||||
if (destination == IEEE1394_ALL_NODES) {
|
||||
kfree(r);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
status = fwnet_incoming_packet(dev, payload, length,
|
||||
source, generation, false);
|
||||
if (status != 0) {
|
||||
if (offset != dev->handler.offset)
|
||||
rcode = RCODE_ADDRESS_ERROR;
|
||||
else if (tcode != TCODE_WRITE_BLOCK_REQUEST)
|
||||
rcode = RCODE_TYPE_ERROR;
|
||||
else if (fwnet_incoming_packet(dev, payload, length,
|
||||
source, generation, false) != 0) {
|
||||
fw_error("Incoming packet failure\n");
|
||||
fw_send_response(card, r, RCODE_CONFLICT_ERROR);
|
||||
rcode = RCODE_CONFLICT_ERROR;
|
||||
} else
|
||||
rcode = RCODE_COMPLETE;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
fw_send_response(card, r, RCODE_COMPLETE);
|
||||
fw_send_response(card, r, rcode);
|
||||
}
|
||||
|
||||
static void fwnet_receive_broadcast(struct fw_iso_context *context,
|
||||
|
|
Loading…
Reference in a new issue