entouched upse_memcpy(), qse_memset().
added some code for urs
This commit is contained in:
@ -85,8 +85,91 @@ void* qse_memcpy (void* dst, const void* src, qse_size_t n)
|
||||
while (n-- > 0) *d++ = *s++;
|
||||
return dst;
|
||||
|
||||
#else
|
||||
#elif defined(__GNUC__) && (defined(__x86_64) || defined(__amd64))
|
||||
|
||||
/* i don't really care about alignments for x86-64 at this moment. fix it later */
|
||||
|
||||
__asm__ volatile (
|
||||
"cld\n\t"
|
||||
"rep movsq\n"
|
||||
: /* no output */
|
||||
:"D" (dst), "S" (src), "c" (n >> 3) /* input: %rdi = d, %rsi = src, %rcx = n / 8 */
|
||||
:"memory"
|
||||
);
|
||||
|
||||
__asm__ volatile (
|
||||
"rep movsb\n"
|
||||
: /* no output */
|
||||
:"c" (n & 7) /* %rcx = n % 8, use existing %rdi and %rsi */
|
||||
:"memory", "%rdi", "%rsi"
|
||||
);
|
||||
|
||||
return dst;
|
||||
|
||||
#if 0
|
||||
qse_byte_t* d = dst;
|
||||
|
||||
__asm__ volatile (
|
||||
"cld\n\t"
|
||||
"rep movsq\n"
|
||||
: "=D" (d), "=S" (src) /* output: d = %rdi, src = %rsi */
|
||||
:"0" (d), "1" (src), "c" (n >> 3) /* input: %rdi = d, %rsi = src, %rcx = n / 8 */
|
||||
:"memory"
|
||||
);
|
||||
|
||||
__asm__ volatile (
|
||||
"rep movsb"
|
||||
: /* no output */
|
||||
:"D" (d), "S" (src), "c" (n & 7) /* input: %rdi = d, %rsi = src, %rcx = n % 8 */
|
||||
:"memory"
|
||||
);
|
||||
|
||||
return dst;
|
||||
#endif
|
||||
|
||||
#elif defined(__GNUC__) && (defined(__i386) || defined(i386))
|
||||
|
||||
/* i don't really care about alignments for x86 at this moment. fix it later */
|
||||
|
||||
__asm__ volatile (
|
||||
"cld\n\t"
|
||||
"rep movsl\n"
|
||||
: /* no output */
|
||||
:"D" (dst), "S" (src), "c" (n >> 2) /* input: %edi = d, %esi = src, %ecx = n / 8 */
|
||||
:"memory"
|
||||
);
|
||||
|
||||
__asm__ volatile (
|
||||
"rep movsb\n"
|
||||
: /* no output */
|
||||
:"c" (n & 3) /* %rcx = n % 8, use existing %edi and %esi */
|
||||
:"memory", "%edi", "%esi"
|
||||
);
|
||||
|
||||
return dst;
|
||||
|
||||
#if 0
|
||||
qse_byte_t* d = dst;
|
||||
|
||||
__asm__ volatile (
|
||||
"cld\n\t"
|
||||
"rep movsl\n"
|
||||
:"=D" (d), "=S" (src) /* output: d = %edi, src = %esi */
|
||||
:"0" (d), "1" (src), "c" (n >> 2) /* input: %edi = d, %esi = src, %ecx = n / 4 */
|
||||
:"memory"
|
||||
);
|
||||
|
||||
__asm__ volatile (
|
||||
"rep movsb\n"
|
||||
:
|
||||
:"D" (d), "S" (src), "c" (n & 3) /* input: %edi = d, %esi = src, %ecx = n % 4 */
|
||||
:"memory"
|
||||
);
|
||||
|
||||
return dst;
|
||||
#endif
|
||||
|
||||
#else
|
||||
qse_byte_t* d;
|
||||
qse_byte_t* s;
|
||||
|
||||
@ -207,8 +290,81 @@ void* qse_memset (void* dst, int val, qse_size_t n)
|
||||
while (n-- > 0) *d++ = (qse_byte_t)val;
|
||||
return dst;
|
||||
|
||||
#else
|
||||
#elif defined(__GNUC__) && (defined(__x86_64) || defined(__amd64))
|
||||
|
||||
/* i don't really care about alignments for x86-64 at this moment. fix it later */
|
||||
|
||||
qse_byte_t* d = dst;
|
||||
|
||||
__asm__ volatile ("cld\n");
|
||||
|
||||
if (n >= 8)
|
||||
{
|
||||
qse_size_t qw = (qse_byte_t)val;
|
||||
if (qw)
|
||||
{
|
||||
qw = (qw << 8) | (qse_byte_t)val;
|
||||
qw = (qw << 8) | (qse_byte_t)val;
|
||||
qw = (qw << 8) | (qse_byte_t)val;
|
||||
qw = (qw << 8) | (qse_byte_t)val;
|
||||
qw = (qw << 8) | (qse_byte_t)val;
|
||||
qw = (qw << 8) | (qse_byte_t)val;
|
||||
qw = (qw << 8) | (qse_byte_t)val;
|
||||
}
|
||||
|
||||
__asm__ volatile (
|
||||
"rep stosq\n"
|
||||
:"=D" (d) /* output: d = %rdi */
|
||||
:"0" (d), "a" (qw), "c" (n >> 3) /* input: %rdi = d, %rax = qw, %rcx = n / 8 */
|
||||
:"memory"
|
||||
);
|
||||
}
|
||||
|
||||
__asm__ volatile (
|
||||
"rep stosb\n"
|
||||
: /* no output */
|
||||
:"D" (d), "a" (val), "c" (n & 7) /* input: %rdi = d, %rax = src, %rcx = n % 8 */
|
||||
:"memory"
|
||||
);
|
||||
|
||||
return dst;
|
||||
|
||||
#elif defined(__GNUC__) && (defined(__i386) || defined(i386))
|
||||
|
||||
/* i don't really care about alignments for x86 at this moment. fix it later */
|
||||
|
||||
qse_byte_t* d = dst;
|
||||
|
||||
__asm__ volatile ("cld\n");
|
||||
|
||||
if (n >= 4)
|
||||
{
|
||||
qse_size_t dw = (qse_byte_t)val;
|
||||
if (dw)
|
||||
{
|
||||
dw = (dw << 8) | (qse_byte_t)val;
|
||||
dw = (dw << 8) | (qse_byte_t)val;
|
||||
dw = (dw << 8) | (qse_byte_t)val;
|
||||
}
|
||||
|
||||
__asm__ volatile (
|
||||
"rep stosl\n"
|
||||
:"=D" (d) /* output: d = %edi */
|
||||
:"0" (d), "a" (dw), "c" (n >> 2) /* input: %edi = d, %eax = dw, %ecx = n / 4 */
|
||||
:"memory"
|
||||
);
|
||||
}
|
||||
|
||||
__asm__ volatile (
|
||||
"rep stosb\n"
|
||||
: /* no output */
|
||||
:"D" (d), "a" (val), "c" (n & 3) /* input: %edi = d, %eax = src, %ecx = n % 4 */
|
||||
:"memory"
|
||||
);
|
||||
|
||||
return dst;
|
||||
|
||||
#else
|
||||
qse_byte_t* d;
|
||||
qse_size_t rem;
|
||||
|
||||
|
@ -36,7 +36,7 @@ struct urs_hdr_t
|
||||
qse_uint16_t seq; /* in network-byte order */
|
||||
qse_uint16_t rcode; /* response code */
|
||||
qse_uint32_t urlsum; /* checksum of url in the request */
|
||||
qse_uint16_t urllen; /* url length in network-byte order */
|
||||
qse_uint16_t pktlen; /* packet header size + url length */
|
||||
};
|
||||
|
||||
struct urs_pkt_t
|
||||
@ -59,8 +59,8 @@ struct urs_ctx_t
|
||||
urs_req_t* reqs[1024]; /* TOOD: choose the right size */
|
||||
qse_uint16_t req_count;
|
||||
|
||||
qse_uint8_t rcvbuf[URS_MAX_URL_LEN + QSE_SIZEOF(urs_pkt_t)];
|
||||
qse_uint8_t fmtbuf[URS_MAX_URL_LEN + QSE_SIZEOF(urs_pkt_t)];
|
||||
qse_uint8_t rcvbuf[QSE_SIZEOF(urs_hdr_t) + URS_MAX_URL_LEN + 1];
|
||||
qse_uint8_t fmtbuf[QSE_SIZEOF(urs_hdr_t) + URS_MAX_URL_LEN + 1];
|
||||
};
|
||||
|
||||
struct urs_req_t
|
||||
@ -95,7 +95,7 @@ static int urs_open (qse_httpd_t* httpd, qse_httpd_urs_t* urs)
|
||||
qse_nwad_t nwad;
|
||||
urs_ctx_t* dc;
|
||||
httpd_xtn_t* httpd_xtn;
|
||||
int type, proto = IPPROTO_SCTP;
|
||||
int type, proto = IPPROTO_UDP; //IPPROTO_SCTP;
|
||||
|
||||
httpd_xtn = qse_httpd_getxtn (httpd);
|
||||
|
||||
@ -147,12 +147,14 @@ static int urs_open (qse_httpd_t* httpd, qse_httpd_urs_t* urs)
|
||||
dc->urs_socket = QSE_INVALID_SCKHND;
|
||||
}
|
||||
|
||||
#if 0
|
||||
if (proto == IPPROTO_SCTP)
|
||||
{
|
||||
/* TODO: error ahndleing */
|
||||
if (qse_isvalidsckhnd(urs->handle[0].i)) listen (urs->handle[0].i, 99);
|
||||
if (qse_isvalidsckhnd(urs->handle[1].i)) listen (urs->handle[1].i, 99);
|
||||
}
|
||||
#endif
|
||||
urs->handle_count = 2;
|
||||
|
||||
urs->ctx = dc;
|
||||
@ -215,7 +217,7 @@ static int urs_recv (qse_httpd_t* httpd, qse_httpd_urs_t* urs, qse_ubi_t handle)
|
||||
socklen_t fromlen;
|
||||
|
||||
qse_uint16_t xid;
|
||||
qse_ssize_t len;
|
||||
qse_ssize_t len, url_len;
|
||||
urs_pkt_t* pkt;
|
||||
urs_req_t* req;
|
||||
|
||||
@ -229,29 +231,34 @@ printf ("URS_RECV....\n");
|
||||
/* TODO: check if fromaddr matches the dc->skad... */
|
||||
|
||||
pkt = (urs_pkt_t*)dc->rcvbuf;
|
||||
if (len >= QSE_SIZEOF(pkt->hdr) && len >= QSE_SIZEOF(pkt->hdr) + qse_ntoh16(pkt->hdr.urllen))
|
||||
if (len >= QSE_SIZEOF(urs_hdr_t))
|
||||
{
|
||||
xid = qse_ntoh16(pkt->hdr.seq) % QSE_COUNTOF(dc->reqs);
|
||||
|
||||
for (req = dc->reqs[xid]; req; req = req->next)
|
||||
pkt->hdr.pktlen = qse_ntoh16(pkt->hdr.pktlen);
|
||||
if (len == pkt->hdr.pktlen)
|
||||
{
|
||||
if (req->pkt->hdr.seq == pkt->hdr.seq && req->pkt->hdr.urlsum == pkt->hdr.urlsum)
|
||||
url_len = pkt->hdr.pktlen - QSE_SIZEOF(urs_hdr_t);
|
||||
xid = qse_ntoh16(pkt->hdr.seq) % QSE_COUNTOF(dc->reqs);
|
||||
|
||||
for (req = dc->reqs[xid]; req; req = req->next)
|
||||
{
|
||||
/* null-terminate the url for easier processing */
|
||||
pkt->url[qse_ntoh16(pkt->hdr.urllen)] = QSE_MT('\0');
|
||||
if (req->pkt->hdr.seq == pkt->hdr.seq && req->pkt->hdr.urlsum == pkt->hdr.urlsum)
|
||||
{
|
||||
/* null-terminate the url for easier processing */
|
||||
pkt->url[url_len] = QSE_MT('\0');
|
||||
|
||||
urs_remove_tmr_tmout (httpd, req);
|
||||
req->rewrite (httpd, req->pkt->url, pkt->url, req->ctx);
|
||||
urs_remove_tmr_tmout (httpd, req);
|
||||
req->rewrite (httpd, req->pkt->url, pkt->url, req->ctx);
|
||||
|
||||
/* detach the request off dc->reqs */
|
||||
if (req == dc->reqs[xid]) dc->reqs[xid] = req->next;
|
||||
else req->prev->next = req->next;
|
||||
if (req->next) req->next->prev = req->prev;
|
||||
/* detach the request off dc->reqs */
|
||||
if (req == dc->reqs[xid]) dc->reqs[xid] = req->next;
|
||||
else req->prev->next = req->next;
|
||||
if (req->next) req->next->prev = req->prev;
|
||||
|
||||
qse_httpd_freemem (httpd, req);
|
||||
dc->req_count--;
|
||||
qse_httpd_freemem (httpd, req);
|
||||
dc->req_count--;
|
||||
|
||||
break;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -362,21 +369,19 @@ static int urs_send (qse_httpd_t* httpd, qse_httpd_urs_t* urs, const qse_mchar_t
|
||||
|
||||
xid = seq % QSE_COUNTOF(dc->reqs);
|
||||
|
||||
req = qse_httpd_callocmem (httpd, QSE_SIZEOF(*req) + url_len + QSE_SIZEOF(urs_pkt_t));
|
||||
req = qse_httpd_callocmem (httpd, QSE_SIZEOF(*req) + QSE_SIZEOF(urs_hdr_t) + url_len + 1);
|
||||
if (req == QSE_NULL) goto oops;
|
||||
|
||||
req->tmr_tmout = QSE_TMR_INVALID_INDEX;
|
||||
req->seq = seq;
|
||||
req->pkt = (urs_pkt_t*)(req + 1);
|
||||
req->pktlen = QSE_SIZEOF(urs_hdr_t) + url_len;
|
||||
|
||||
req->pkt->hdr.seq = qse_hton16(seq);
|
||||
req->pkt->hdr.urllen = qse_hton16(url_len);
|
||||
req->pkt->hdr.pktlen = qse_hton16(req->pktlen);
|
||||
req->pkt->hdr.urlsum = hash_string (url);
|
||||
qse_mbscpy (req->pkt->url, url);
|
||||
|
||||
/* -1 to exclude the terminating '\0' as urs_pkt_t has url[1]. */
|
||||
req->pktlen = QSE_SIZEOF(urs_pkt_t) + url_len - 1;
|
||||
|
||||
req->rewrite = rewrite;
|
||||
req->ctx = ctx;
|
||||
|
||||
|
@ -730,10 +730,11 @@ static qse_sck_hnd_t open_udp_socket (qse_httpd_t* httpd, int domain, int type,
|
||||
|
||||
if (set_socket_nonblock (httpd, fd, 1) <= -1) goto oops;
|
||||
|
||||
|
||||
#if 1
|
||||
if (proto == IPPROTO_SCTP)
|
||||
{
|
||||
struct sctp_initmsg im;
|
||||
struct sctp_paddrparams hb;
|
||||
|
||||
QSE_MEMSET (&im, 0, QSE_SIZEOF(im));
|
||||
im.sinit_num_ostreams = 1;
|
||||
@ -741,7 +742,15 @@ static qse_sck_hnd_t open_udp_socket (qse_httpd_t* httpd, int domain, int type,
|
||||
im.sinit_max_attempts = 1;
|
||||
|
||||
if (setsockopt (fd, SOL_SCTP, SCTP_INITMSG, &im, QSE_SIZEOF(im)) <= -1) goto oops;
|
||||
|
||||
QSE_MEMSET (&hb, 0, QSE_SIZEOF(hb));
|
||||
hb.spp_flags = SPP_HB_ENABLE;
|
||||
hb.spp_hbinterval = 5000;
|
||||
hb.spp_pathmaxrxt = 1;
|
||||
|
||||
if (setsockopt (fd, SOL_SCTP, SCTP_PEER_ADDR_PARAMS, &hb, QSE_SIZEOF(hb)) <= -1) goto oops;
|
||||
}
|
||||
#endif
|
||||
|
||||
return fd;
|
||||
|
||||
|
Reference in New Issue
Block a user