7 // -----------------------------------
8 int startNetwork (struct ngadmin *nga) {
14 nga->local.sin_family=AF_INET;
15 nga->remote=nga->local;
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 updateTimeout (struct ngadmin *nga) {
78 // specify receive timeout
79 if ( (ret=setsockopt(nga->sock, SOL_SOCKET, SO_RCVTIMEO, &nga->timeout, sizeof(struct timeval)))<0 ) {
80 perror("setsockopt(SO_RCVTIMEO)");
91 // --------------------------------------------------------------------------------------------------------------------------
92 int sendNgPacket (struct ngadmin *nga, char code, const struct ether_addr *switch_mac, unsigned int seqnum, const List *attr) {
103 np.maxlen=sizeof(buffer);
105 initNgHeader(np.nh, code, &nga->localmac, switch_mac, seqnum);
108 for (ln=attr->first; ln!=NULL; ln=ln->next) {
110 addPacketAttr(&np, at->attr, at->size, at->data);
115 nga->remote.sin_addr.s_addr=htonl(INADDR_BROADCAST);
116 nga->remote.sin_port=htons(SWITCH_PORT);
117 if ( (ret=sendto(nga->sock, buffer, getPacketTotalSize(&np), 0, (struct sockaddr*)&nga->remote, sizeof(struct sockaddr_in)))<0 ) {
128 // ---------------------------------------------------------------------------------------------------------------------------------------------------
129 List* recvNgPacket (struct ngadmin *nga, char code, char *error, unsigned short *attr_error, const struct ether_addr *switch_mac, unsigned int seqnum) {
133 socklen_t slen=sizeof(struct sockaddr_in);
139 np.maxlen=sizeof(buffer);
141 while ( (len=recvfrom(nga->sock, buffer, sizeof(buffer), 0, (struct sockaddr*)&nga->remote, &slen))>=0 ) {
142 if ( len>=(int)sizeof(struct ng_header) && validateNgHeader(np.nh, code, &nga->localmac, switch_mac, seqnum) ) {
144 l=extractPacketAttributes(&np, error, attr_error);