Setting gateway with rtnetlink fails for eth1

From: Scott Derrick (scott_at_tnstaafl.net)
Date: 07/28/04

  • Next message: Nix: "Re: e2fsck bombing because new kernel incompatible despite correct setting"
    Date: Wed, 28 Jul 2004 10:38:32 -0600
    
    

    I'm trying to set the gateway on a multiNIC machine. The code below works
    fine for eth0 but does nothing for eth1 or eth2

    the parameter gate == IP in dotted notatio, the parameter device == "eth0",
    "eth1" or "eth2"

    I'm using the decimal equivelant of eth"0" for the RTA_OIF, so eth0 would
    be decimal 0, eth1 woudl be decimal 1, etc..

    what am I doing wrong that would allow this to work fine for eth0 but not
    the other NIC's. I can use the route program and add or delete gateways to
    al theNIC's.

    thanks, Scott

    *****************code follows*******************

    const char *envLinux :: ip_gateway ( const char *gate, const char *device )
    {
     ////////////////////////////////////////////////////////////////////////
     //
     // OVERLOAD IConfigIP
     //
     // PURPOSE
     // - Sets/retreives the current IP gateway address.
     //
     // PARAMETERS
     // - addr specifies the new gateway address (set to NULL to retrieve)
     //
     // RETURN VALUE
     // Ptr. to current gateway address
     //
     ////////////////////////////////////////////////////////////////////////
     int inet_sock = -1, ret;
     IException *ex = NULL;
     char GATEWAY[9];
     struct in_addr tempAddr;
     int ind = 0;

     struct{
      struct nlmsghdr netlink_header;
      struct rtmsg rt_message;
      char buffer[1024];
     }request;

     try
     {
      ind = atoi(device + 3);

      if(!strcmp(gate, "0.0.0.0") == 0) // add a gateway
      {
       inet_sock = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
       if (inet_sock == -1)
       {
        printf( "ip_gateway : Unable to create a socket" );
        fflush(stdout);
        return 0;
       }

       memset(&request, 0, sizeof(request));
       request.netlink_header.nlmsg_len =NLMSG_LENGTH(sizeof(struct rtmsg));
       request.netlink_header.nlmsg_flags = NLM_F_REQUEST | NLM_F_CREATE;
       request.netlink_header.nlmsg_type = RTM_NEWROUTE;
       request.rt_message.rtm_family = AF_INET;
       request.rt_message.rtm_table = RT_TABLE_MAIN;

       request.rt_message.rtm_protocol = RTPROT_BOOT;
       request.rt_message.rtm_scope = RT_SCOPE_UNIVERSE;
       request.rt_message.rtm_type = RTN_UNICAST;

       if(inet_aton(gate, &tempAddr))
         addattr_l(&request.netlink_header, sizeof(request),
           RTA_GATEWAY, (void*)&(tempAddr.s_addr), 4);

       if(inet_aton("0.0.0.0", &tempAddr))
        addattr_l(&request.netlink_header, sizeof(request),
          RTA_DST, (void*)&(tempAddr.s_addr), 4);

       addattr32(&request.netlink_header, sizeof(request), RTA_OIF, ind);

       struct sockaddr_nl nladdr;
       struct iovec iov ={(void*)&request,request.netlink_header.nlmsg_len};
       struct msghdr msg = {
        (void*)&nladdr,
        sizeof(nladdr),
        &iov,
        1,
        NULL,
        0,
        0};
       qq
       memset(&nladdr, 0, sizeof(nladdr));
       nladdr.nl_family = AF_NETLINK;
       nladdr.nl_pid = 0;
       nladdr.nl_groups = 0;

       ret = sendmsg(inet_sock, &msg, 0);

       if (ret < 1)
       {
        printf("ip_gateway: send returned %d error %d\n", ret, errno);
        fflush(stdout);
       }
      } // if
     } // try
     catch ( IException *_ex )
     {
      ex = _ex;
     } // catch

     // Clean up
     if (inet_sock != -1) close ( inet_sock );
     if (ex != NULL) throw ex;
     else
      printf ( "%s: Gateway : %s on %s\n", name, tempstr, device );

     return tempstr;
    } // ip_gateway


  • Next message: Nix: "Re: e2fsck bombing because new kernel incompatible despite correct setting"

    Relevant Pages

    • rtnetlink, setting gateway for eth1 fails
      ... I'm trying to set the gateway on a multiNIC machine. ... fine for eth0 but does nothing for eth1 or eth2 ... I'm using the decimal equivelant of eth"0" for the RTA_OIF, so eth0 would ... struct nlmsghdr netlink_header; ...
      (comp.os.linux.networking)
    • rtnetlink, Setting gateway on eth1 fails
      ... I'm trying to set the gateway on a multiNIC machine. ... fine for eth0 but does nothing for eth1 or eth2 ... I'm using the decimal equivelant of eth"0" for the RTA_OIF, so eth0 would ... struct nlmsghdr netlink_header; ...
      (comp.os.linux.development.apps)
    • rtnetlink, setting gateway on eth1 fails
      ... I'm trying to set the gateway on a multiNIC machine. ... fine for eth0 but does nothing for eth1 or eth2 ... I'm using the decimal equivelant of eth"0" for the RTA_OIF, so eth0 would ... struct nlmsghdr netlink_header; ...
      (comp.os.linux.embedded)
    • remove
      ... Routing problem - was FC9 Linux gateways, VPN working, IP ... Local gateway can talk to remote server. ... ppp0 192.168.127.2/32 P-to-P 192.168.127.1 ...
      (Fedora)
    • Re: ndiswrapper & SuSe 9.1 in Latitude D600
      ... >> another machine in my network if I give the ip address. ... > 2.Made sure to input the router as gateway. ... disable the wireless interface and just use the eth0 (eth0 is always ... Someone mentioned that if a dhcpcd process is already running the ...
      (alt.os.linux.suse)