Lines Matching refs:intrfc
117 struct ipx_interface *intrfc = ipx_sk(sk)->intrfc; in ipx_remove_socket() local
119 if (!intrfc) in ipx_remove_socket()
122 ipxitf_hold(intrfc); in ipx_remove_socket()
123 spin_lock_bh(&intrfc->if_sklist_lock); in ipx_remove_socket()
125 spin_unlock_bh(&intrfc->if_sklist_lock); in ipx_remove_socket()
126 ipxitf_put(intrfc); in ipx_remove_socket()
201 static void ipxitf_insert_socket(struct ipx_interface *intrfc, struct sock *sk) in ipxitf_insert_socket() argument
203 ipxitf_hold(intrfc); in ipxitf_insert_socket()
204 spin_lock_bh(&intrfc->if_sklist_lock); in ipxitf_insert_socket()
205 ipx_sk(sk)->intrfc = intrfc; in ipxitf_insert_socket()
206 sk_add_node(sk, &intrfc->if_sklist); in ipxitf_insert_socket()
207 spin_unlock_bh(&intrfc->if_sklist_lock); in ipxitf_insert_socket()
208 ipxitf_put(intrfc); in ipxitf_insert_socket()
212 static struct sock *__ipxitf_find_socket(struct ipx_interface *intrfc, in __ipxitf_find_socket() argument
217 sk_for_each(s, &intrfc->if_sklist) in __ipxitf_find_socket()
226 static struct sock *ipxitf_find_socket(struct ipx_interface *intrfc, in ipxitf_find_socket() argument
231 spin_lock_bh(&intrfc->if_sklist_lock); in ipxitf_find_socket()
232 s = __ipxitf_find_socket(intrfc, port); in ipxitf_find_socket()
235 spin_unlock_bh(&intrfc->if_sklist_lock); in ipxitf_find_socket()
241 static struct sock *ipxitf_find_internal_socket(struct ipx_interface *intrfc, in ipxitf_find_internal_socket() argument
247 ipxitf_hold(intrfc); in ipxitf_find_internal_socket()
248 spin_lock_bh(&intrfc->if_sklist_lock); in ipxitf_find_internal_socket()
250 sk_for_each(s, &intrfc->if_sklist) { in ipxitf_find_internal_socket()
259 spin_unlock_bh(&intrfc->if_sklist_lock); in ipxitf_find_internal_socket()
260 ipxitf_put(intrfc); in ipxitf_find_internal_socket()
265 static void __ipxitf_down(struct ipx_interface *intrfc) in __ipxitf_down() argument
271 ipxrtr_del_routes(intrfc); in __ipxitf_down()
273 spin_lock_bh(&intrfc->if_sklist_lock); in __ipxitf_down()
275 sk_for_each_safe(s, t, &intrfc->if_sklist) { in __ipxitf_down()
280 ipxs->intrfc = NULL; in __ipxitf_down()
285 INIT_HLIST_HEAD(&intrfc->if_sklist); in __ipxitf_down()
286 spin_unlock_bh(&intrfc->if_sklist_lock); in __ipxitf_down()
289 list_del(&intrfc->node); in __ipxitf_down()
292 if (intrfc == ipx_primary_net) in __ipxitf_down()
294 if (intrfc == ipx_internal_net) in __ipxitf_down()
297 if (intrfc->if_dev) in __ipxitf_down()
298 dev_put(intrfc->if_dev); in __ipxitf_down()
299 kfree(intrfc); in __ipxitf_down()
302 void ipxitf_down(struct ipx_interface *intrfc) in ipxitf_down() argument
305 __ipxitf_down(intrfc); in ipxitf_down()
309 static void __ipxitf_put(struct ipx_interface *intrfc) in __ipxitf_put() argument
311 if (atomic_dec_and_test(&intrfc->refcnt)) in __ipxitf_put()
312 __ipxitf_down(intrfc); in __ipxitf_put()
364 static int ipxitf_demux_socket(struct ipx_interface *intrfc, in ipxitf_demux_socket() argument
373 spin_lock_bh(&intrfc->if_sklist_lock); in ipxitf_demux_socket()
375 sk_for_each(s, &intrfc->if_sklist) { in ipxitf_demux_socket()
396 if (intrfc != ipx_internal_net) in ipxitf_demux_socket()
407 spin_unlock_bh(&intrfc->if_sklist_lock); in ipxitf_demux_socket()
411 static struct sock *ncp_connection_hack(struct ipx_interface *intrfc, in ncp_connection_hack() argument
434 spin_lock_bh(&intrfc->if_sklist_lock); in ncp_connection_hack()
435 sk_for_each(sk, &intrfc->if_sklist) in ncp_connection_hack()
442 spin_unlock_bh(&intrfc->if_sklist_lock); in ncp_connection_hack()
447 static int ipxitf_demux_socket(struct ipx_interface *intrfc, in ipxitf_demux_socket() argument
455 if (intrfc == ipx_primary_net && ntohs(ipx->ipx_dest.sock) == 0x451) in ipxitf_demux_socket()
456 sock1 = ncp_connection_hack(intrfc, ipx); in ipxitf_demux_socket()
459 sock1 = ipxitf_find_socket(intrfc, ipx->ipx_dest.sock); in ipxitf_demux_socket()
469 if (ipx_primary_net && intrfc != ipx_primary_net) { in ipxitf_demux_socket()
534 static struct sk_buff *ipxitf_adjust_skbuff(struct ipx_interface *intrfc, in ipxitf_adjust_skbuff() argument
539 int out_offset = intrfc->if_ipx_offset; in ipxitf_adjust_skbuff()
562 int ipxitf_send(struct ipx_interface *intrfc, struct sk_buff *skb, char *node) in ipxitf_send() argument
565 struct net_device *dev = intrfc->if_dev; in ipxitf_send()
566 struct datalink_proto *dl = intrfc->if_dlink; in ipxitf_send()
600 if (ipx->ipx_dest.net == intrfc->if_netnum) { in ipxitf_send()
605 if (intrfc == ipx_internal_net || in ipxitf_send()
606 !memcmp(intrfc->if_node, node, IPX_NODE_LEN)) { in ipxitf_send()
611 return ipxitf_demux_socket(intrfc, skb, 0); in ipxitf_send()
618 ipxitf_demux_socket(intrfc, skb, send_to_wire); in ipxitf_send()
629 if (ipx->ipx_source.net != intrfc->if_netnum) { in ipxitf_send()
654 skb = ipxitf_adjust_skbuff(intrfc, skb); in ipxitf_send()
668 static int ipxitf_add_local_route(struct ipx_interface *intrfc) in ipxitf_add_local_route() argument
670 return ipxrtr_add_route(intrfc->if_netnum, intrfc, NULL); in ipxitf_add_local_route()
673 static void ipxitf_discover_netnum(struct ipx_interface *intrfc,
675 static int ipxitf_pprop(struct ipx_interface *intrfc, struct sk_buff *skb);
677 static int ipxitf_rcv(struct ipx_interface *intrfc, struct sk_buff *skb) in ipxitf_rcv() argument
682 ipxitf_hold(intrfc); in ipxitf_rcv()
685 if (!intrfc->if_netnum) /* net number of intrfc not known yet */ in ipxitf_rcv()
686 ipxitf_discover_netnum(intrfc, skb); in ipxitf_rcv()
690 rc = ipxitf_pprop(intrfc, skb); in ipxitf_rcv()
697 IPX_SKB_CB(skb)->ipx_dest_net = intrfc->if_netnum; in ipxitf_rcv()
699 IPX_SKB_CB(skb)->ipx_source_net = intrfc->if_netnum; in ipxitf_rcv()
704 intrfc->if_netnum != IPX_SKB_CB(skb)->ipx_dest_net) { in ipxitf_rcv()
718 !memcmp(intrfc->if_node, ipx->ipx_dest.node, IPX_NODE_LEN)) { in ipxitf_rcv()
719 rc = ipxitf_demux_socket(intrfc, skb, 0); in ipxitf_rcv()
727 ipxitf_put(intrfc); in ipxitf_rcv()
731 static void ipxitf_discover_netnum(struct ipx_interface *intrfc, in ipxitf_discover_netnum() argument
744 intrfc->if_netnum = cb->ipx_source_net; in ipxitf_discover_netnum()
745 ipxitf_add_local_route(intrfc); in ipxitf_discover_netnum()
752 ipx_device_name(intrfc), in ipxitf_discover_netnum()
753 ipx_frame_name(intrfc->if_dlink_type)); in ipxitf_discover_netnum()
783 static int ipxitf_pprop(struct ipx_interface *intrfc, struct sk_buff *skb) in ipxitf_pprop() argument
814 if (*l++ == intrfc->if_netnum) in ipxitf_pprop()
821 IPX_SKB_CB(skb)->last_hop.netnum = intrfc->if_netnum; in ipxitf_pprop()
830 if (ifcs == intrfc) in ipxitf_pprop()
852 static void ipxitf_insert(struct ipx_interface *intrfc) in ipxitf_insert() argument
855 list_add_tail(&intrfc->node, &ipx_interfaces); in ipxitf_insert()
859 ipx_primary_net = intrfc; in ipxitf_insert()
868 struct ipx_interface *intrfc = kmalloc(sizeof(*intrfc), GFP_ATOMIC); in ipxitf_alloc() local
870 if (intrfc) { in ipxitf_alloc()
871 intrfc->if_dev = dev; in ipxitf_alloc()
872 intrfc->if_netnum = netnum; in ipxitf_alloc()
873 intrfc->if_dlink_type = dlink_type; in ipxitf_alloc()
874 intrfc->if_dlink = dlink; in ipxitf_alloc()
875 intrfc->if_internal = internal; in ipxitf_alloc()
876 intrfc->if_ipx_offset = ipx_offset; in ipxitf_alloc()
877 intrfc->if_sknum = IPX_MIN_EPHEMERAL_SOCKET; in ipxitf_alloc()
878 INIT_HLIST_HEAD(&intrfc->if_sklist); in ipxitf_alloc()
879 atomic_set(&intrfc->refcnt, 1); in ipxitf_alloc()
880 spin_lock_init(&intrfc->if_sklist_lock); in ipxitf_alloc()
883 return intrfc; in ipxitf_alloc()
888 struct ipx_interface *intrfc; in ipxitf_create_internal() local
899 intrfc = ipxitf_find_using_net(idef->ipx_network); in ipxitf_create_internal()
901 if (intrfc) { in ipxitf_create_internal()
902 ipxitf_put(intrfc); in ipxitf_create_internal()
905 intrfc = ipxitf_alloc(NULL, idef->ipx_network, 0, NULL, 1, 0); in ipxitf_create_internal()
907 if (!intrfc) in ipxitf_create_internal()
909 memcpy((char *)&(intrfc->if_node), idef->ipx_node, IPX_NODE_LEN); in ipxitf_create_internal()
910 ipx_internal_net = ipx_primary_net = intrfc; in ipxitf_create_internal()
911 ipxitf_hold(intrfc); in ipxitf_create_internal()
912 ipxitf_insert(intrfc); in ipxitf_create_internal()
914 rc = ipxitf_add_local_route(intrfc); in ipxitf_create_internal()
915 ipxitf_put(intrfc); in ipxitf_create_internal()
939 struct ipx_interface *intrfc; in ipxitf_create() local
951 intrfc = ipxitf_find_using_net(idef->ipx_network); in ipxitf_create()
953 if (idef->ipx_network && intrfc) { in ipxitf_create()
954 ipxitf_put(intrfc); in ipxitf_create()
958 if (intrfc) in ipxitf_create()
959 ipxitf_put(intrfc); in ipxitf_create()
1001 intrfc = ipxitf_find_using_phys(dev, dlink_type); in ipxitf_create()
1002 if (!intrfc) { in ipxitf_create()
1004 intrfc = ipxitf_alloc(dev, idef->ipx_network, dlink_type, in ipxitf_create()
1008 if (!intrfc) in ipxitf_create()
1012 ipx_primary_net = intrfc; in ipxitf_create()
1015 memset(intrfc->if_node, 0, IPX_NODE_LEN); in ipxitf_create()
1016 memcpy(intrfc->if_node + IPX_NODE_LEN - dev->addr_len, in ipxitf_create()
1019 memcpy(intrfc->if_node, idef->ipx_node, IPX_NODE_LEN); in ipxitf_create()
1020 ipxitf_hold(intrfc); in ipxitf_create()
1021 ipxitf_insert(intrfc); in ipxitf_create()
1027 if (!intrfc->if_netnum) in ipxitf_create()
1030 rc = ipxitf_add_local_route(intrfc); in ipxitf_create()
1032 ipxitf_put(intrfc); in ipxitf_create()
1044 struct ipx_interface *intrfc; in ipxitf_delete() local
1067 intrfc = __ipxitf_find_using_phys(dev, dlink_type); in ipxitf_delete()
1069 if (!intrfc) in ipxitf_delete()
1071 __ipxitf_put(intrfc); in ipxitf_delete()
1082 struct ipx_interface *intrfc = NULL; in ipxitf_auto_create() local
1100 intrfc = ipxitf_alloc(dev, 0, dlink_type, datalink, 0, in ipxitf_auto_create()
1103 if (intrfc) { in ipxitf_auto_create()
1104 memset(intrfc->if_node, 0, IPX_NODE_LEN); in ipxitf_auto_create()
1105 memcpy((char *)&(intrfc->if_node[IPX_NODE_LEN-dev->addr_len]), in ipxitf_auto_create()
1107 spin_lock_init(&intrfc->if_sklist_lock); in ipxitf_auto_create()
1108 atomic_set(&intrfc->refcnt, 1); in ipxitf_auto_create()
1109 ipxitf_insert(intrfc); in ipxitf_auto_create()
1114 return intrfc; in ipxitf_auto_create()
1257 const char *ipx_device_name(struct ipx_interface *intrfc) in ipx_device_name() argument
1259 return intrfc->if_internal ? "Internal" : in ipx_device_name()
1260 intrfc->if_dev ? intrfc->if_dev->name : "Unknown"; in ipx_device_name()
1387 static __be16 ipx_first_free_socketnum(struct ipx_interface *intrfc) in ipx_first_free_socketnum() argument
1389 unsigned short socketNum = intrfc->if_sknum; in ipx_first_free_socketnum()
1391 spin_lock_bh(&intrfc->if_sklist_lock); in ipx_first_free_socketnum()
1396 while (__ipxitf_find_socket(intrfc, htons(socketNum))) in ipx_first_free_socketnum()
1402 spin_unlock_bh(&intrfc->if_sklist_lock); in ipx_first_free_socketnum()
1403 intrfc->if_sknum = socketNum; in ipx_first_free_socketnum()
1413 struct ipx_interface *intrfc; in __ipx_bind() local
1420 intrfc = ipxitf_find_using_net(addr->sipx_network); in __ipx_bind()
1422 if (!intrfc) in __ipx_bind()
1426 addr->sipx_port = ipx_first_free_socketnum(intrfc); in __ipx_bind()
1441 if (intrfc == ipx_internal_net) { in __ipx_bind()
1451 memcpy(ipxs->node, intrfc->if_node, IPX_NODE_LEN); in __ipx_bind()
1456 if (ipxitf_find_internal_socket(intrfc, ipxs->node, in __ipx_bind()
1469 memcpy(ipxs->node, intrfc->if_node, IPX_NODE_LEN); in __ipx_bind()
1472 if (ipxitf_find_socket(intrfc, addr->sipx_port)) { in __ipx_bind()
1486 if (ipxitf_find_socket(intrfc, addr->sipx_port)) { in __ipx_bind()
1494 ipxitf_insert_socket(intrfc, sk); in __ipx_bind()
1499 ipxitf_put(intrfc); in __ipx_bind()
1542 if (!ipxs->intrfc) in ipx_connect()
1544 memcpy(uaddr.sipx_node, ipxs->intrfc->if_node, in ipx_connect()
1602 if (ipxs->intrfc) { in ipx_getname()
1603 sipx.sipx_network = ipxs->intrfc->if_netnum; in ipx_getname()
1607 memcpy(sipx.sipx_node, ipxs->intrfc->if_node, in ipx_getname()
1633 struct ipx_interface *intrfc; in ipx_rcv() local
1668 intrfc = ipxitf_find_using_phys(dev, pt->type); in ipx_rcv()
1669 if (!intrfc) { in ipx_rcv()
1672 intrfc = ipxitf_auto_create(dev, pt->type); in ipx_rcv()
1673 if (intrfc) in ipx_rcv()
1674 ipxitf_hold(intrfc); in ipx_rcv()
1677 if (!intrfc) /* Not one of ours */ in ipx_rcv()
1682 rc = ipxitf_rcv(intrfc, skb); in ipx_rcv()
1683 ipxitf_put(intrfc); in ipx_rcv()
1719 if (!ipxs->intrfc) in ipx_sendmsg()
1721 memcpy(uaddr.sipx_node, ipxs->intrfc->if_node, in ipx_sendmsg()
1777 if (!ipxs->intrfc) in ipx_recvmsg()
1779 memcpy(uaddr.sipx_node, ipxs->intrfc->if_node, IPX_NODE_LEN); in ipx_recvmsg()