Beispiel #1
0
/***
 *  rt_ip_route_del_host - deletes specified host route
 */
int rt_ip_route_del_host(u32 addr, struct rtnet_device *rtdev)
{
    rtdm_lockctx_t      context;
    struct host_route   *rt;
    struct host_route   **last_ptr;
    unsigned int        key;


    key = ntohl(addr) & HOST_HASH_KEY_MASK;
    last_ptr = &host_hash_tbl[key];

    rtdm_lock_get_irqsave(&host_table_lock, context);

    rt = host_hash_tbl[key];
    while (rt != NULL) {
        if ((rt->dest_host.ip == addr) &&
            (!rtdev || (rt->dest_host.rtdev->local_ip == rtdev->local_ip))) {
            *last_ptr = rt->next;

            rt_free_host_route(rt);

            rtdm_lock_put_irqrestore(&host_table_lock, context);

            return 0;
        }

        last_ptr = &rt->next;
        rt = rt->next;
    }

    rtdm_lock_put_irqrestore(&host_table_lock, context);

    return -ENOENT;
}
Beispiel #2
0
/***
 *  rt_ip_route_del_all - deletes all routes associated with a specified device
 */
void rt_ip_route_del_all(struct rtnet_device *rtdev)
{
    unsigned long       flags;
    struct host_route   *host_rt;
    struct host_route   **last_host_ptr;
    unsigned int        key;


    for (key = 0; key < HOST_HASH_TBL_SIZE; key++) {
      host_start_over:
        last_host_ptr = &host_table[key];

        rtos_spin_lock_irqsave(&host_table_lock, flags);

        host_rt = host_table[key];
        while (host_rt != NULL) {
            if (host_rt->dest_host.rtdev == rtdev) {
                *last_host_ptr = host_rt->next;

                rt_free_host_route(host_rt);

                rtos_spin_unlock_irqrestore(&host_table_lock, flags);

                goto host_start_over;
            }

            last_host_ptr = &host_rt->next;
            host_rt = host_rt->next;
        }

        rtos_spin_unlock_irqrestore(&host_table_lock, flags);
    }
}
Beispiel #3
0
/***
 *  rt_ip_route_del_host - deletes specified host route
 */
int rt_ip_route_del_host(u32 addr)
{
    unsigned long       flags;
    struct host_route   *rt;
    struct host_route   **last_ptr;
    unsigned int        key;


    key = ntohl(addr) & HOST_HASH_KEY_MASK;
    last_ptr = &host_table[key];

    rtos_spin_lock_irqsave(&host_table_lock, flags);

    rt = host_table[key];
    while (rt != NULL) {
        if (rt->dest_host.ip == addr) {
            *last_ptr = rt->next;

            rt_free_host_route(rt);

            rtos_spin_unlock_irqrestore(&host_table_lock, flags);

            return 0;
        }

        last_ptr = &rt->next;
        rt = rt->next;
    }

    rtos_spin_unlock_irqrestore(&host_table_lock, flags);

    return -ENOENT;
}
Beispiel #4
0
/***
 *  rt_ip_route_del_all - deletes all routes associated with a specified device
 */
void rt_ip_route_del_all(struct rtnet_device *rtdev)
{
    rtdm_lockctx_t      context;
    struct host_route   *host_rt;
    struct host_route   **last_host_ptr;
    unsigned int        key;
    u32                 ip;


    for (key = 0; key < HOST_HASH_TBL_SIZE; key++) {
      host_start_over:
        last_host_ptr = &host_hash_tbl[key];

        rtdm_lock_get_irqsave(&host_table_lock, context);

        host_rt = host_hash_tbl[key];
        while (host_rt != NULL) {
            if (host_rt->dest_host.rtdev == rtdev) {
                *last_host_ptr = host_rt->next;

                rt_free_host_route(host_rt);

                rtdm_lock_put_irqrestore(&host_table_lock, context);

                goto host_start_over;
            }

            last_host_ptr = &host_rt->next;
            host_rt = host_rt->next;
        }

        rtdm_lock_put_irqrestore(&host_table_lock, context);
    }

    if ((ip = rtdev->local_ip) != 0)
        rt_ip_route_del_host(ip, rtdev);
}
Beispiel #5
0
/***
 *  rt_ip_route_add_host: add or update host route
 */
int rt_ip_route_add_host(u32 addr, unsigned char *dev_addr,
                         struct rtnet_device *rtdev)
{
    rtdm_lockctx_t      context;
    struct host_route   *new_route;
    struct host_route   *rt;
    unsigned int        key;
    int                 ret = 0;


    rtdm_lock_get_irqsave(&rtdev->rtdev_lock, context);

    if ((!test_bit(PRIV_FLAG_UP, &rtdev->priv_flags) ||
        test_and_set_bit(PRIV_FLAG_ADDING_ROUTE, &rtdev->priv_flags))) {
        rtdm_lock_put_irqrestore(&rtdev->rtdev_lock, context);
        return -EBUSY;
    }

    rtdm_lock_put_irqrestore(&rtdev->rtdev_lock, context);

    if ((new_route = rt_alloc_host_route()) != NULL) {
        new_route->dest_host.ip    = addr;
        new_route->dest_host.rtdev = rtdev;
        memcpy(new_route->dest_host.dev_addr, dev_addr, rtdev->addr_len);
    }

    key = ntohl(addr) & HOST_HASH_KEY_MASK;

    rtdm_lock_get_irqsave(&host_table_lock, context);

    rt = host_hash_tbl[key];
    while (rt != NULL) {
        if ((rt->dest_host.ip == addr) &&
            (rt->dest_host.rtdev->local_ip == rtdev->local_ip)) {
            rt->dest_host.rtdev = rtdev;
            memcpy(rt->dest_host.dev_addr, dev_addr, rtdev->addr_len);

            if (new_route)
                rt_free_host_route(new_route);

            rtdm_lock_put_irqrestore(&host_table_lock, context);

            goto out;
        }

        rt = rt->next;
    }

    if (new_route) {
        new_route->next    = host_hash_tbl[key];
        host_hash_tbl[key] = new_route;

        rtdm_lock_put_irqrestore(&host_table_lock, context);
    } else {
        rtdm_lock_put_irqrestore(&host_table_lock, context);

        /*ERRMSG*/rtdm_printk("RTnet: no more host routes available\n");
        ret = -ENOBUFS;
    }

  out:
    clear_bit(PRIV_FLAG_ADDING_ROUTE, &rtdev->priv_flags);

    return ret;
}
Beispiel #6
0
/***
 *  rt_ip_route_add_host: add or update host route
 */
int rt_ip_route_add_host(u32 addr, unsigned char *dev_addr,
                         struct rtnet_device *rtdev)
{
    unsigned long       flags;
    struct host_route   *new_route;
    struct host_route   *rt;
    unsigned int        key;


    rtos_spin_lock_irqsave(&rtdev->rtdev_lock, flags);

    if ((!test_bit(PRIV_FLAG_UP, &rtdev->priv_flags) ||
        test_and_set_bit(PRIV_FLAG_ADDING_ROUTE, &rtdev->priv_flags))) {
        rtos_spin_unlock_irqrestore(&rtdev->rtdev_lock, flags);
        return -EBUSY;
    }

    rtos_spin_unlock_irqrestore(&rtdev->rtdev_lock, flags);

    if ((new_route = rt_alloc_host_route()) != NULL) {
        new_route->dest_host.ip    = addr;
        new_route->dest_host.rtdev = rtdev;
        memcpy(new_route->dest_host.dev_addr, dev_addr, rtdev->addr_len);
    }

    key = ntohl(addr) & HOST_HASH_KEY_MASK;

    rtos_spin_lock_irqsave(&host_table_lock, flags);

    rt = host_table[key];
    while (rt != NULL) {
        if (rt->dest_host.ip == addr) {
            rt->dest_host.rtdev = rtdev;
            memcpy(rt->dest_host.dev_addr, dev_addr, rtdev->addr_len);

            if (new_route)
                rt_free_host_route(new_route);

            rtos_spin_unlock_irqrestore(&host_table_lock, flags);

            goto out;
        }

        rt = rt->next;
    }

    if (new_route) {
        new_route->next = host_table[key];
        host_table[key] = new_route;

        rtos_spin_unlock_irqrestore(&host_table_lock, flags);
    } else {
        rtos_spin_unlock_irqrestore(&host_table_lock, flags);

        /*ERRMSG*/rtos_print("RTnet: no more host routes available\n");
    }

  out:
    clear_bit(PRIV_FLAG_ADDING_ROUTE, &rtdev->priv_flags);

    return 0;
}