diff --git a/src/proxymain.c b/src/proxymain.c index 4f21237..d32afc2 100644 --- a/src/proxymain.c +++ b/src/proxymain.c @@ -1020,17 +1020,19 @@ int MODULEMAINFUNC (int argc, char** argv){ if(hashresolv(&udp_table, &defparam, &toparam, NULL)) { int i, len=0; - if(toparam->udp_nhops){ - for(i=1; i < toparam->udp_nhops; i++){ - len+=socks5_udp_build_hdr(srv.udpbuf2+len, &toparam->udp_relay[i-1]); - } - len += socks5_udp_build_hdr(srv.udpbuf2+len, &toparam->req); + if(!toparam->bandlimfunc || !(*toparam->bandlimfunc)(toparam, 0, srv.udplen)){ + if(toparam->udp_nhops){ + for(i=1; i < toparam->udp_nhops; i++){ + len+=socks5_udp_build_hdr(srv.udpbuf2+len, &toparam->udp_relay[i-1]); + } + len += socks5_udp_build_hdr(srv.udpbuf2+len, &toparam->req); + } + memcpy(srv.udpbuf2+len, srv.udpbuf, srv.udplen > UDPBUFSIZE - len?UDPBUFSIZE - len : srv.udplen); + len += srv.udplen > UDPBUFSIZE - len?UDPBUFSIZE - len : srv.udplen; + srv.so._sendto(toparam->sostate, toparam->remsock, (char *)srv.udpbuf2, len, 0, (struct sockaddr *)&toparam->sinsr, SASIZE(&toparam->sinsr)); + toparam->statscli64 += srv.udplen; + toparam->nwrites++; } - memcpy(srv.udpbuf2+len, srv.udpbuf, srv.udplen > UDPBUFSIZE - len?UDPBUFSIZE - len : srv.udplen); - len += srv.udplen > UDPBUFSIZE - len?UDPBUFSIZE - len : srv.udplen; - srv.so._sendto(toparam->sostate, toparam->remsock, (char *)srv.udpbuf2, len, 0, (struct sockaddr *)&toparam->sinsr, SASIZE(&toparam->sinsr)); - toparam->statscli64 += srv.udplen; - toparam->nwrites++; _3proxy_sem_unlock(udpinit); continue; } diff --git a/src/udppm.c b/src/udppm.c index dacdd7c..454e8d1 100644 --- a/src/udppm.c +++ b/src/udppm.c @@ -61,19 +61,21 @@ void * udppmchild(struct clientparam* param) { if(!(param->srvbuf = malloc(UDPBUFSIZE)))RETURN(11); param->srvbufsize = UDPBUFSIZE; } - if(param->udp_nhops){ - for(i=1; i < param->udp_nhops; i++){ - len+=socks5_udp_build_hdr(param->srvbuf+len, ¶m->udp_relay[i-1]); + if(!param->bandlimfunc || !(*param->bandlimfunc)(param, 0, param->srv->udplen)){ + if(param->udp_nhops){ + for(i=1; i < param->udp_nhops; i++){ + len+=socks5_udp_build_hdr(param->srvbuf+len, ¶m->udp_relay[i-1]); + } + len += socks5_udp_build_hdr(param->srvbuf+len, ¶m->req); } - len += socks5_udp_build_hdr(param->srvbuf+len, ¶m->req); + memcpy(param->srvbuf+len, param->srv->udpbuf, param->srv->udplen > UDPBUFSIZE - len?UDPBUFSIZE - len : param->srv->udplen); + len += param->srv->udplen > UDPBUFSIZE - len?UDPBUFSIZE - len : param->srv->udplen; + param->srv->so._sendto(param->sostate, param->remsock, (char *)param->srvbuf, len, 0, (struct sockaddr *)¶m->sinsr, SASIZE(¶m->sinsr)); + param->statscli64 += param->srvinbuf; + param->nwrites++; } - memcpy(param->srvbuf+len, param->srv->udpbuf, param->srv->udplen > UDPBUFSIZE - len?UDPBUFSIZE - len : param->srv->udplen); - len += param->srv->udplen > UDPBUFSIZE - len?UDPBUFSIZE - len : param->srv->udplen; - param->srv->so._sendto(param->sostate, param->remsock, (char *)param->srvbuf, len, 0, (struct sockaddr *)¶m->sinsr, SASIZE(¶m->sinsr)); _3proxy_sem_unlock(udpinit); - param->statscli64 += param->srvinbuf; param->srvinbuf = 0; - param->nwrites++; param->clisock = param->srv->srvsock; param->waitserver64 = 0x7fffffffffffffff; param->res = udpsockmap(param, conf.timeouts[STRING_L]); diff --git a/src/udpsockmap.c b/src/udpsockmap.c index f450a0e..af2c39f 100644 --- a/src/udpsockmap.c +++ b/src/udpsockmap.c @@ -124,6 +124,8 @@ int udpsockmap(struct clientparam *param, int timeo) continue; } + if(param->bandlimfunc && (*param->bandlimfunc)(param, 0, len)) continue; + if (nhops == 0) { int i; if (len < 10 || param->srvbuf[0] || param->srvbuf[1] || param->srvbuf[2]) @@ -195,6 +197,7 @@ int udpsockmap(struct clientparam *param, int timeo) } param->statssrv64 += len; param->nreads++; + if(param->bandlimfunc && (*param->bandlimfunc)(param, len, 0)) continue; sendlen = len; if (nhops == 0) { param->srvbuf[0] = param->srvbuf[1] = param->srvbuf[2] = 0;