Hi

I'm currently implementing a multipath routing protocol based on an
existing project which is implemented partly in user-space and party as
a kernel module (aodv-uu). Netlink is used to manage routes.

If I understand this right, I have to set the RTA_MULTIPATH attribute
for the RTM_NEWROUTE message. However, no matter what I try, I can't
seem to get the arguments right (I keep getting "Invalid argument"
errors).

Here's the code I'm working with:


/* Function to add, remove and update entries in the kernel routing
 * table */
int nl_kern_route(int action, int flags, int family,
                  int index, struct in_addr *dst, struct in_addr *gw,
                  struct in_addr *nm, int metric)
{
        struct {
                struct nlmsghdr nlh;
                struct rtmsg rtm;
                char attrbuf[1024];
        } req;

        if (!dst || !gw)
                return -1;

        req.nlh.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtmsg));
        req.nlh.nlmsg_type = action;
        req.nlh.nlmsg_flags = NLM_F_REQUEST | flags;
        req.nlh.nlmsg_pid = 0;

        req.rtm.rtm_family = family;

        if (!nm)
                req.rtm.rtm_dst_len = sizeof(struct in_addr) * 8;
        else
                req.rtm.rtm_dst_len = prefix_length(AF_INET, nm);

        req.rtm.rtm_src_len = 0;
        req.rtm.rtm_tos = 0;
        req.rtm.rtm_table = RT_TABLE_MAIN;
        req.rtm.rtm_protocol = 100;
        req.rtm.rtm_scope = RT_SCOPE_LINK;
        req.rtm.rtm_type = RTN_UNICAST;
        req.rtm.rtm_flags = 0;

        addattr(&req.nlh, RTA_DST, dst, sizeof(struct in_addr));

        if (memcmp(dst, gw, sizeof(struct in_addr)) != 0) {
                req.rtm.rtm_scope = RT_SCOPE_UNIVERSE;
                addattr(&req.nlh, RTA_GATEWAY, gw, sizeof(struct in_addr));
        }

        if (index > 0)
                addattr(&req.nlh, RTA_OIF, &index, sizeof(index));

        addattr(&req.nlh, RTA_PRIORITY, &metric, sizeof(metric));

        return nl_send(&rtnl, &req.nlh);
}

with

/* Utility function  comes from iproute2. 
   Authors:     Alexey Kuznetsov, <[EMAIL PROTECTED]> */
int addattr(struct nlmsghdr *n, int type, void *data, int alen)
{
        struct rtattr *attr;
        int len = RTA_LENGTH(alen);

        attr = (struct rtattr *) (((char *) n) + NLMSG_ALIGN(n->nlmsg_len));
        attr->rta_type = type;
        attr->rta_len = len;
        memcpy(RTA_DATA(attr), data, alen);
        n->nlmsg_len = NLMSG_ALIGN(n->nlmsg_len) + len;

        return 0;
}

What I tried so far is adding addattr(&rel.nlh, RTA_MULTIPATH, ...)
right below the addattr(&req.nlh, RTA_GATEWAY, ...) line.

Could anyone maybe give me a hint on what I might be doing wrong in
general and/or, more precisely, what arguments I have to pass with
RTA_MULTIPATH?

Also, as I would like to define the multipath arlogithm to be used, I
saw that there is an attribute RTA_MP_ALGO. How do I use that one?

Btw, I'm using kernel 2.6.17.14 as the netlink API changed in 2.6.18 and
I don't feel like rewriting the whole netlink part unless absolutely
neccessary.

Thanks
-- 
Stefan Ott
http://www.desire.ch/

Attachment: signature.asc
Description: Digital signature

Reply via email to