7 // -----------------------------------
8 int startNetwork (struct ngadmin *nga) {
14 memset(&nga->local, 0, sizeof(struct sockaddr_in));
15 nga->local.sin_family=AF_INET;
16 nga->local.sin_port=htons(CLIENT_PORT);
18 memset(&ifr, 0, sizeof(struct ifreq));
19 strncpy(ifr.ifr_name, nga->iface, IFNAMSIZ-1);
21 if ( (nga->sock=socket(AF_INET, SOCK_DGRAM, 0))<0 ) {
26 // get the interface IP address
27 if ( (ret=ioctl(nga->sock, SIOCGIFADDR, &ifr))<0 ) {
28 perror("ioctl(SIOCGIFADDR)");
32 //local.sin_addr=(*(struct sockaddr_in*)&ifr.ifr_addr).sin_addr; // FIXME
34 // get the interface MAC address
35 if ( (ret=ioctl(nga->sock, SIOCGIFHWADDR, &ifr))<0 ) {
36 perror("ioctl(SIOCGIFHWADDR)");
40 memcpy(&nga->localmac, ifr.ifr_hwaddr.sa_data, ETH_ALEN);
43 if ( (ret=bind(nga->sock, (struct sockaddr*)&nga->local, sizeof(struct sockaddr_in)))<0 ) {
51 if ( (ret=setsockopt(nga->sock, SOL_SOCKET, SO_BROADCAST, &ret, sizeof(ret)))<0 ) {
52 perror("setsockopt(SO_BROADCAST)");
63 // ----------------------------------
64 int stopNetwork (struct ngadmin *nga) {
66 return close(nga->sock);
72 // -------------------------------------
73 int forceInterface (struct ngadmin *nga) {
80 if ( (ret=setsockopt(nga->sock, SOL_SOCKET, SO_BINDTODEVICE, nga->iface, strlen(nga->iface)+1))<0 ) {
81 perror("setsockopt(SO_BINDTODEVICE)");
86 if ( (ret=setsockopt(nga->sock, SOL_SOCKET, SO_DONTROUTE, &ret, sizeof(ret)))<0 ) {
87 perror("setsockopt(SO_DONTROUTE)");
98 // ------------------------------------
99 int updateTimeout (struct ngadmin *nga) {
104 // specify receive timeout
105 if ( (ret=setsockopt(nga->sock, SOL_SOCKET, SO_RCVTIMEO, &nga->timeout, sizeof(struct timeval)))<0 ) {
106 perror("setsockopt(SO_RCVTIMEO)");
117 // ----------------------------------------------------------------
118 int sendNgPacket (struct ngadmin *nga, char code, const List *attr) {
124 struct sockaddr_in remote;
125 const struct swi_attr *sa=nga->current;
131 np.maxlen=sizeof(buffer);
133 initNgHeader(np.nh, code, &nga->localmac, sa==NULL ? &nullMac : &sa->mac , ++nga->seq);
136 for (ln=attr->first; ln!=NULL; ln=ln->next) {
138 addPacketAttr(&np, at->attr, at->size, at->data);
142 memset(&remote, 0, sizeof(struct sockaddr_in));
143 remote.sin_family=AF_INET;
144 remote.sin_addr.s_addr= sa==NULL || nga->keepbroad ? htonl(INADDR_BROADCAST) : sa->nc.ip.s_addr ;
145 remote.sin_port=htons(SWITCH_PORT);
147 if ( (ret=sendto(nga->sock, buffer, getPacketTotalSize(&np), 0, (struct sockaddr*)&remote, sizeof(struct sockaddr_in)))<0 ) {
158 // -----------------------------------------------------------------------------------------
159 List* recvNgPacket (struct ngadmin *nga, char code, char *error, unsigned short *attr_error) {
163 struct sockaddr_in remote;
164 socklen_t slen=sizeof(struct sockaddr_in);
165 const struct swi_attr *sa=nga->current;
171 np.maxlen=sizeof(buffer);
173 memset(&remote, 0, sizeof(struct sockaddr_in));
174 remote.sin_family=AF_INET;
176 while ( (len=recvfrom(nga->sock, buffer, sizeof(buffer), 0, (struct sockaddr*)&remote, &slen))>=0 ) {
177 if ( ntohs(remote.sin_port)==SWITCH_PORT && len>=(int)sizeof(struct ng_header) && validateNgHeader(np.nh, code, &nga->localmac, sa==NULL ? NULL : &sa->mac , nga->seq) ) {
179 l=extractPacketAttributes(&np, error, attr_error);