-// -----------------------------------
-int startNetwork (struct ngadmin *nga) {
-
- struct ifreq ifr;
- int ret;
-
-
- // create socket
- if ( (nga->sock=socket(AF_INET, SOCK_DGRAM, 0))<0 ) {
- perror("socket");
- return nga->sock;
- }
-
- memset(&ifr, 0, sizeof(struct ifreq));
- strncpy(ifr.ifr_name, nga->iface, IFNAMSIZ-1);
-
- // get the interface broadcast address
- if ( (ret=ioctl(nga->sock, SIOCGIFBRDADDR, &ifr))<0 ) {
- perror("ioctl(SIOCGIFBRDADDR)");
- close(nga->sock);
- return ret;
- }
- nga->brd=(*(struct sockaddr_in*)&ifr.ifr_addr).sin_addr;
-
- // get the interface MAC address
- if ( (ret=ioctl(nga->sock, SIOCGIFHWADDR, &ifr))<0 ) {
- perror("ioctl(SIOCGIFHWADDR)");
- close(nga->sock);
- return ret;
- }
- memcpy(&nga->localmac, ifr.ifr_hwaddr.sa_data, ETH_ALEN);
-
- // bind
- memset(&nga->local, 0, sizeof(struct sockaddr_in));
- nga->local.sin_family=AF_INET;
- nga->local.sin_port=htons(CLIENT_PORT);
-
- if ( (ret=bind(nga->sock, (struct sockaddr*)&nga->local, sizeof(struct sockaddr_in)))<0 ) {
- perror("bind");
- close(nga->sock);
- return ret;
- }
-
- // allow broadcasting
- ret=1;
- if ( (ret=setsockopt(nga->sock, SOL_SOCKET, SO_BROADCAST, &ret, sizeof(ret)))<0 ) {
- perror("setsockopt(SO_BROADCAST)");
- return ret;
- }
-
- // prevent unicast packets from being routed by setting the TTL to 1
- ret=1;
- if ( (ret=setsockopt(nga->sock, IPPROTO_IP, IP_TTL, &ret, sizeof(ret)))<0 ) {
- perror("setsockopt(IP_TTL)");
- return ret;
- }
-
-
- return 0;
-
-}
-