-/**
- *Forward a message on all interfaces
- *
- *@return negative on error
- */
-int
-net_forward()
-{
- struct sockaddr_in *sin;
- struct sockaddr_in dst;
- struct sockaddr_in6 *sin6;
- struct sockaddr_in6 dst6;
- struct interface *ifn;
- struct ptf *tmp_ptf_list;
- int i, x;
-
- sin = NULL;
- sin6 = NULL;
-
- for (ifn = ifnet; ifn; ifn = ifn->int_next)
- {
-
- fwdsize += OLSR_HEADERSIZE;
- /* Add the Packet seqno */
- fwdmsg->v4.olsr_seqno = htons(ifn->olsr_seqnum++);
- /* Set the packetlength */
- fwdmsg->v4.olsr_packlen = htons(fwdsize);
-
- if(ipversion == AF_INET)
- {
- /* IP version 4 */
- sin = (struct sockaddr_in *)&ifn->int_broadaddr;
-
- /* Copy sin */
- dst = *sin;
- sin = &dst;
-
- /* Set user defined broadcastaddr */
- if(bcast_set)
- memcpy(&dst.sin_addr.s_addr, &bcastaddr.sin_addr, sizeof(olsr_u32_t));
-
- if (sin->sin_port == 0)
- sin->sin_port = olsr_udp_port;
- }
- else
- {
- /* IP version 6 */
- sin6 = (struct sockaddr_in6 *)&ifn->int6_multaddr;
- /* Copy sin */
- dst6 = *sin6;
- sin6 = &dst6;
- }
-
- /*
- *if the '-disp- option was given
- *we print her decimal contetnt of the packets
- */
- if(disp_pack_out)
- {
- if(ipversion == AF_INET)
- printf("FORWARDING to %s size: %d\n\t", ip_to_string((olsr_u32_t *)&sin->sin_addr.s_addr), fwdsize);
- else
- printf("FORWARDING to %s size: %d\n\t", ip6_to_string(&sin6->sin6_addr), fwdsize);
-
- x = 0;
-
- for(i = 0; i < fwdsize;i++)
- {
- if(x == 4)
- {
- x = 0;
- printf("\n\t");
- }
- x++;
- if(ipversion == AF_INET)
- printf(" %3i", (u_char) fwd_buffer[i]);
- else
- printf(" %2x", (u_char) fwd_buffer[i]);
- }
-
- printf("\n");
- }
-
-
- /*
- *Call possible packet transform functions registered by plugins
- */
- tmp_ptf_list = ptf_list;
- while(tmp_ptf_list != NULL)
- {
- tmp_ptf_list->function(fwd_buffer, &fwdsize);
- tmp_ptf_list = tmp_ptf_list->next;
- }
-
-
- if(ipversion == AF_INET)
- {
- /* IP version 4 */
- if(sendto(ifn->olsr_socket, fwd_buffer, fwdsize, MSG_DONTROUTE, (struct sockaddr *)sin, sizeof (*sin)) < 0)
- {
- perror("sendto(v4)");
- olsr_syslog(OLSR_LOG_ERR, "OLSR: forward sendto IPv4 %m");
- return -1;
- }
- }
- else
- {
- /* IP version 6 */
- if(sendto(ifn->olsr_socket, fwd_buffer, fwdsize, MSG_DONTROUTE, (struct sockaddr *)sin6, sizeof (*sin6)) < 0)
- {
- perror("sendto(v6)");
- olsr_syslog(OLSR_LOG_ERR, "OLSR: forward sendto IPv6 %m");
- fprintf(stderr, "Socket: %d interface: %d\n", ifn->olsr_socket, ifn->if_nr);
- fprintf(stderr, "To: %s (size: %d)\n", ip6_to_string(&sin6->sin6_addr), sizeof(*sin6));
- fprintf(stderr, "Outputsize: %d\n", fwdsize);
- return -1;
- }
- }
-
- }
- return 1;
-}
-