- return -1;
- }
- if (setsockopt(ret, SOL_SOCKET, SO_BROADCAST,
- (char *)&one, sizeof(one)) == -1)
- fprintf(stderr,
- "setsockopt failed: %s\n",
- strerror (errno));
- if (setsockopt(ret, IPPROTO_IP, IP_HDRINCL,
- (char *)&one, sizeof(one)) == -1)
- fprintf(stderr,
- "setsockopt failed: %s\n",
- strerror (errno));
+ return INVALID_SOCKET;
+ }
+
+ if (0 != setsockopt(rawsock,
+ SOL_SOCKET,
+ SO_BROADCAST,
+ (char*)&bOptVal, bOptLen))
+ {
+ fprintf(stderr,
+ "Error setting SO_BROADCAST to ON: %s\n",
+ strerror (errno));
+ closesocket(rawsock);
+ return INVALID_SOCKET;
+ }
+ if (0 != setsockopt(rawsock,
+ IPPROTO_IP,
+ IP_HDRINCL,
+ (char*)&bOptVal, bOptLen))
+ {
+ fprintf(stderr,
+ "Error setting IP_HDRINCL to ON: %s\n",
+ strerror (errno));
+ closesocket(rawsock);
+ return INVALID_SOCKET;
+ }
+ return rawsock;
+}
+
+
+/**
+ * Create a UDP socket for writing.
+ *
+ * @param my_ip source address (our ip address)
+ * @return INVALID_SOCKET on error
+ */
+static SOCKET
+make_udp_socket (const struct in_addr *my_ip)
+{
+ SOCKET ret;
+ struct sockaddr_in addr;
+
+ ret = socket (AF_INET, SOCK_DGRAM, 0);
+ if (INVALID_SOCKET == ret)
+ {
+ fprintf (stderr,
+ "Error opening UDP socket: %s\n",
+ strerror (errno));
+ return INVALID_SOCKET;
+ }
+ memset (&addr, 0, sizeof (addr));
+ addr.sin_family = AF_INET;
+ addr.sin_addr = *my_ip;
+ addr.sin_port = htons (NAT_TRAV_PORT);
+ if (0 != bind (ret,
+ (struct sockaddr *)&addr,
+ sizeof(addr)))
+ {
+ fprintf (stderr,
+ "Error binding UDP socket to port %u: %s\n",
+ NAT_TRAV_PORT,
+ strerror (errno));
+ /* likely problematic, but not certain, try to continue */
+ }