Example #1
0
/***
 *  common reply function
 */
static void rt_icmp_send_reply(struct icmp_bxm *icmp_param, struct rtskb *skb)
{
    struct dest_route   rt;
    int                 err;


    icmp_param->head.icmph.checksum = 0;
    icmp_param->csum = 0;

    /* route back to the source address via the incoming device */
    if (rt_ip_route_output(&rt, skb->nh.iph->saddr,
			   skb->rtdev->local_ip) != 0)
	return;

    rt_socket_reference(icmp_socket);
    err = rt_ip_build_xmit(icmp_socket, rt_icmp_glue_reply_bits, icmp_param,
			   sizeof(struct icmphdr) + icmp_param->data_len,
			   &rt, MSG_DONTWAIT);
    if (err)
	    rt_socket_dereference(icmp_socket);

    rtdev_dereference(rt.rtdev);

    RTNET_ASSERT(err == 0,
		 rtdm_printk("RTnet: %s() error in xmit\n", __FUNCTION__););
Example #2
0
/***
 *  rt_udp_v4_lookup
 */
struct rtsocket *rt_udp_v4_lookup(u32 saddr, u16 sport, u32 daddr, u16 dport)
{
    unsigned long flags;
    struct rtsocket *sk;

    rtos_spin_lock_irqsave(&udp_socket_base_lock, flags);

    for (sk = udp_sockets; sk != NULL; sk = sk->next)
        if (sk->prot.inet.sport == dport) {
            rt_socket_reference(sk);
            break;
        }

    rtos_spin_unlock_irqrestore(&udp_socket_base_lock, flags);
    return sk;
}
Example #3
0
/***
 *  rt_udp_v4_lookup
 */
static inline struct rtsocket *rt_udp_v4_lookup(u32 daddr, u16 dport)
{
    unsigned long   flags;
    int             index;
    int             bit;
    int             bitmap_index;
#if BITS_PER_LONG == 32
    unsigned long   bitmap;
#elif BITS_PER_LONG == 64
    u32             bitmap;
#else
#error please include asm/types.h
#endif
    struct rtsocket *sock;


    for (bitmap_index = 0; bitmap_index < ((RT_UDP_SOCKETS + 31) / 32);
         bitmap_index++) {
        bit    = 0;
        index  = bitmap_index * 32;

        rtos_spin_lock_irqsave(&udp_socket_base_lock, flags);

        bitmap = port_bitmap[bitmap_index];
        while (bitmap != 0) {
            if (test_bit(bit, &bitmap)) {
                if ((port_registry[index].sport == dport) &&
                    ((port_registry[index].saddr == INADDR_ANY) ||
                     (port_registry[index].saddr == daddr))) {
                    sock = port_registry[index].sock;
                    rt_socket_reference(sock);

                    rtos_spin_unlock_irqrestore(&udp_socket_base_lock, flags);

                    return sock;
                }
                clear_bit(bit, &bitmap);
            }
            index++;
            bit++;
        }

        rtos_spin_unlock_irqrestore(&udp_socket_base_lock, flags);
    }

    return NULL;
}