/*** * 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__););
/*** * 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; }
/*** * 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; }