[T106][ZXW-22]7520V3SCV2.01.01.02P42U09_VEC_V0.8_AP_VEC origin source commit
Change-Id: Ic6e05d89ecd62fc34f82b23dcf306c93764aec4b
diff --git a/ap/app/zte_ping/socketHelper.c b/ap/app/zte_ping/socketHelper.c
new file mode 100755
index 0000000..098004e
--- /dev/null
+++ b/ap/app/zte_ping/socketHelper.c
@@ -0,0 +1,132 @@
+
+#include "socketHelper.h"
+#include "util.h"
+
+void close_one_socket(int sock)
+{
+ int ret;
+ if (sock != INVALID_SOCKET) {
+ ret = close(sock);
+ WARN_errno(ret == SOCKET_ERROR, "close socket failed");
+ sock = INVALID_SOCKET;
+ }
+}
+
+void SockAddr_setHostname(const char* inHostname, zping_sockaddr_t *inSockAddr)
+{
+ int rc = inet_pton(AF_INET, inHostname,
+ (void*) & (((struct sockaddr_in*)inSockAddr)->sin_addr));
+ inSockAddr->sin_family = AF_INET;
+ if (rc != 1) {
+ fprintf(stderr, "invalid address: %s\n", inHostname);
+ exit(1);
+ }
+}
+
+int setsock_tcp_windowsize(int inSock, int inTCPWin, int inSend)
+{
+#ifdef SO_SNDBUF
+ int rc;
+ int newTCPWin;
+
+ assert(inSock >= 0);
+
+ if (inTCPWin > 0) {
+
+#ifdef TCP_WINSHIFT
+
+ /* UNICOS requires setting the winshift explicitly */
+ if (inTCPWin > 65535) {
+ int winShift = 0;
+ int scaledWin = inTCPWin >> 16;
+ while (scaledWin > 0) {
+ scaledWin >>= 1;
+ winShift++;
+ }
+
+ /* set TCP window shift */
+ rc = setsockopt(inSock, IPPROTO_TCP, TCP_WINSHIFT,
+ (char*) &winShift, sizeof(winShift));
+ if (rc < 0) {
+ return rc;
+ }
+
+ /* Note: you cannot verify TCP window shift, since it returns
+ * a structure and not the same integer we use to set it. (ugh) */
+ }
+#endif /* TCP_WINSHIFT */
+
+#ifdef TCP_RFC1323
+ /* On AIX, RFC 1323 extensions can be set system-wide,
+ * using the 'no' network options command. But we can also set them
+ * per-socket, so let's try just in case. */
+ if (inTCPWin > 65535) {
+ /* enable RFC 1323 */
+ int on = 1;
+ rc = setsockopt(inSock, IPPROTO_TCP, TCP_RFC1323,
+ (char*) &on, sizeof(on));
+ if (rc < 0) {
+ return rc;
+ }
+ }
+#endif /* TCP_RFC1323 */
+
+ if (!inSend) {
+ /* receive buffer -- set
+ * note: results are verified after connect() or listen(),
+ * since some OS's don't show the corrected value until then. */
+ newTCPWin = inTCPWin;
+ rc = setsockopt(inSock, SOL_SOCKET, SO_RCVBUF,
+ (char*) &newTCPWin, sizeof(newTCPWin));
+ } else {
+ /* send buffer -- set
+ * note: results are verified after connect() or listen(),
+ * since some OS's don't show the corrected value until then. */
+ newTCPWin = inTCPWin;
+ rc = setsockopt(inSock, SOL_SOCKET, SO_SNDBUF,
+ (char*) &newTCPWin, sizeof(newTCPWin));
+ }
+ if (rc < 0) {
+ return rc;
+ }
+ }
+#endif /* SO_SNDBUF */
+
+ return 0;
+} /* end setsock_tcp_windowsize */
+
+const char warn_mss_fail[] = "\
+WARNING: attempt to set TCP maxmimum segment size to %d failed.\n\
+Setting the MSS may not be implemented on this OS.\n";
+
+const char warn_mss_notset[] =
+ "WARNING: attempt to set TCP maximum segment size to %d, but got %d\n";
+
+void setsock_tcp_mss(int inSock, int inMSS)
+{
+#ifdef TCP_MAXSEG
+ int rc;
+ int newMSS;
+ int len;
+
+ assert(inSock != INVALID_SOCKET);
+
+ if (inMSS > 0) {
+ /* set */
+ newMSS = inMSS;
+ len = sizeof(newMSS);
+ rc = setsockopt(inSock, IPPROTO_TCP, TCP_MAXSEG, (char*) &newMSS, len);
+ if (rc == SOCKET_ERROR) {
+ fprintf(stderr, warn_mss_fail, newMSS);
+ return;
+ }
+
+ /* verify results */
+ rc = getsockopt(inSock, IPPROTO_TCP, TCP_MAXSEG, (char*) &newMSS, &len);
+ WARN_errno(rc == SOCKET_ERROR, "getsockopt TCP_MAXSEG");
+ if (newMSS != inMSS) {
+ fprintf(stderr, warn_mss_notset, inMSS, newMSS);
+ }
+ }
+#endif
+} /* end setsock_tcp_mss */