Skip to content

Commit 71993a8

Browse files
committed
(SMB) Use custom recvfrom() function to reduce overhead when small reads are made.
1 parent 19904e0 commit 71993a8

File tree

2 files changed

+36
-1
lines changed

2 files changed

+36
-1
lines changed

modules/iopcore/cdvdman/device-smb.c

+2
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ static void ps2ip_init(void);
4646
int (*plwip_close)(int s); // #6
4747
int (*plwip_connect)(int s, struct sockaddr *name, socklen_t namelen); // #7
4848
int (*plwip_recv)(int s, void *mem, int len, unsigned int flags); // #9
49+
int (*plwip_recvfrom)(int s, void *mem, int hlen, void *payload, int plen, unsigned int flags, struct sockaddr *from, socklen_t *fromlen); // #10
4950
int (*plwip_send)(int s, void *dataptr, int size, unsigned int flags); // #11
5051
int (*plwip_socket)(int domain, int type, int protocol); // #13
5152
int (*plwip_setsockopt)(int s, int level, int optname, const void *optval, socklen_t optlen); // #19
@@ -62,6 +63,7 @@ static void ps2ip_init(void)
6263
plwip_close = info.exports[6];
6364
plwip_connect = info.exports[7];
6465
plwip_recv = info.exports[9];
66+
plwip_recvfrom = info.exports[10];
6567
plwip_send = info.exports[11];
6668
plwip_socket = info.exports[13];
6769
plwip_setsockopt = info.exports[19];

modules/iopcore/cdvdman/smb.c

+34-1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
#include "smb.h"
2020
#include "cdvd_config.h"
2121

22+
#define USE_CUSTOM_RECV 1
23+
2224
//Round up the erasure amount, so that memset can erase memory word-by-word.
2325
#define ZERO_PKT_ALIGNED(hdr, hdrSize) mips_memset((hdr), 0, ((hdrSize) + 3) & ~3)
2426

@@ -39,6 +41,7 @@ int smb_io_sema = -1;
3941
extern int (*plwip_close)(int s); // #6
4042
extern int (*plwip_connect)(int s, struct sockaddr *name, socklen_t namelen); // #7
4143
extern int (*plwip_recv)(int s, void *mem, int len, unsigned int flags); // #9
44+
extern int (*plwip_recvfrom)(int s, void *mem, int hlen, void *payload, int plen, unsigned int flags, struct sockaddr *from, socklen_t *fromlen); // #10
4245
extern int (*plwip_send)(int s, void *dataptr, int size, unsigned int flags); // #11
4346
extern int (*plwip_socket)(int domain, int type, int protocol); // #13
4447
extern int (*plwip_setsockopt)(int s, int level, int optname, const void *optval, socklen_t optlen); // #19
@@ -606,7 +609,12 @@ static int smb_ReadAndX(u16 FID, u32 offsetlow, u32 offsethigh, void *readbuf, i
606609
{
607610
ReadAndXRequest_t *RR = &SMB_buf.smb.readAndXRequest;
608611
ReadAndXResponse_t *RRsp = &SMB_buf.smb.readAndXResponse;
609-
register int r, padding, DataLength;
612+
register int r, DataLength;
613+
#ifdef USE_CUSTOM_RECV
614+
int rcv_size, expected_size;
615+
#else
616+
int padding;
617+
#endif
610618

611619
ZERO_PKT_ALIGNED(RR, sizeof(ReadAndXRequest_t));
612620

@@ -624,6 +632,30 @@ static int smb_ReadAndX(u16 FID, u32 offsetlow, u32 offsethigh, void *readbuf, i
624632
RR->MaxCountHigh = (u16)(nbytes >> 16);
625633

626634
nb_SetSessionMessage(sizeof(ReadAndXRequest_t));
635+
636+
#ifdef USE_CUSTOM_RECV
637+
//Send the whole message, including the 4-byte direct transport packet header.
638+
r = SendData(main_socket, (char*)&SMB_buf, sizeof(ReadAndXRequest_t) + 4);
639+
if (r <= 0)
640+
return -1;
641+
642+
//offset 49 is the offset of the DataOffset field within the ReadAndXResponse structure.
643+
//recvfrom() is a custom function that will receive the reply.
644+
do {
645+
rcv_size = plwip_recvfrom(main_socket, &SMB_buf, 49, readbuf, nbytes, 0, NULL, NULL);
646+
if (rcv_size <= 0)
647+
return -2;
648+
} while (nb_GetPacketType() != 0); // dropping NBSS Session Keep alive
649+
650+
expected_size = nb_GetSessionMessageLength() + 4;
651+
DataLength = (int)(((u32)RRsp->DataLengthHigh << 16) | RRsp->DataLengthLow);
652+
653+
// Handle fragmented packets
654+
while (rcv_size < expected_size) {
655+
r = plwip_recvfrom(main_socket, NULL, 0, &((u8 *)readbuf)[rcv_size - RRsp->DataOffset - 4], expected_size - rcv_size, 0, NULL, NULL); // - rcv_size
656+
rcv_size += r;
657+
}
658+
#else
627659
r = GetSMBServerReply(0, NULL, sizeof(ReadAndXResponse_t));
628660
if (r <= 0)
629661
return -EIO;
@@ -648,6 +680,7 @@ static int smb_ReadAndX(u16 FID, u32 offsetlow, u32 offsethigh, void *readbuf, i
648680
if (r <= 0)
649681
return -2;
650682
}
683+
#endif
651684

652685
return DataLength;
653686
}

0 commit comments

Comments
 (0)