Lines Matching refs:gtp

125 static struct pdp_ctx *gtp0_pdp_find(struct gtp_dev *gtp, u64 tid)  in gtp0_pdp_find()  argument
130 head = &gtp->tid_hash[gtp0_hashfn(tid) % gtp->hash_size]; in gtp0_pdp_find()
141 static struct pdp_ctx *gtp1_pdp_find(struct gtp_dev *gtp, u32 tid) in gtp1_pdp_find() argument
146 head = &gtp->tid_hash[gtp1u_hashfn(tid) % gtp->hash_size]; in gtp1_pdp_find()
157 static struct pdp_ctx *ipv4_pdp_find(struct gtp_dev *gtp, __be32 ms_addr) in ipv4_pdp_find() argument
162 head = &gtp->addr_hash[ipv4_hashfn(ms_addr) % gtp->hash_size]; in ipv4_pdp_find()
295 static int gtp0_send_echo_resp(struct gtp_dev *gtp, struct sk_buff *skb) in gtp0_send_echo_resp() argument
326 gtp_pkt->ie.val = gtp->restart_count; in gtp0_send_echo_resp()
333 rt = ip4_route_output_gtp(&fl4, gtp->sk0, iph->saddr, iph->daddr); in gtp0_send_echo_resp()
335 netdev_dbg(gtp->dev, "no route for echo response from %pI4\n", in gtp0_send_echo_resp()
340 udp_tunnel_xmit_skb(rt, gtp->sk0, skb, in gtp0_send_echo_resp()
346 !net_eq(sock_net(gtp->sk1u), in gtp0_send_echo_resp()
347 dev_net(gtp->dev)), in gtp0_send_echo_resp()
375 static int gtp0_handle_echo_resp(struct gtp_dev *gtp, struct sk_buff *skb) in gtp0_handle_echo_resp() argument
403 return genlmsg_multicast_netns(&gtp_genl_family, dev_net(gtp->dev), in gtp0_handle_echo_resp()
408 static int gtp0_udp_encap_recv(struct gtp_dev *gtp, struct sk_buff *skb) in gtp0_udp_encap_recv() argument
427 if (gtp0->type == GTP_ECHO_REQ && gtp->sk_created) in gtp0_udp_encap_recv()
428 return gtp0_send_echo_resp(gtp, skb); in gtp0_udp_encap_recv()
430 if (gtp0->type == GTP_ECHO_RSP && gtp->sk_created) in gtp0_udp_encap_recv()
431 return gtp0_handle_echo_resp(gtp, skb); in gtp0_udp_encap_recv()
436 pctx = gtp0_pdp_find(gtp, be64_to_cpu(gtp0->tid)); in gtp0_udp_encap_recv()
438 netdev_dbg(gtp->dev, "No PDP ctx to decap skb=%p\n", skb); in gtp0_udp_encap_recv()
442 return gtp_rx(pctx, skb, hdrlen, gtp->role); in gtp0_udp_encap_recv()
475 static int gtp1u_send_echo_resp(struct gtp_dev *gtp, struct sk_buff *skb) in gtp1u_send_echo_resp() argument
515 rt = ip4_route_output_gtp(&fl4, gtp->sk1u, iph->saddr, iph->daddr); in gtp1u_send_echo_resp()
517 netdev_dbg(gtp->dev, "no route for echo response from %pI4\n", in gtp1u_send_echo_resp()
522 udp_tunnel_xmit_skb(rt, gtp->sk1u, skb, in gtp1u_send_echo_resp()
528 !net_eq(sock_net(gtp->sk1u), in gtp1u_send_echo_resp()
529 dev_net(gtp->dev)), in gtp1u_send_echo_resp()
534 static int gtp1u_handle_echo_resp(struct gtp_dev *gtp, struct sk_buff *skb) in gtp1u_handle_echo_resp() argument
566 return genlmsg_multicast_netns(&gtp_genl_family, dev_net(gtp->dev), in gtp1u_handle_echo_resp()
570 static int gtp1u_udp_encap_recv(struct gtp_dev *gtp, struct sk_buff *skb) in gtp1u_udp_encap_recv() argument
589 if (gtp1->type == GTP_ECHO_REQ && gtp->sk_created) in gtp1u_udp_encap_recv()
590 return gtp1u_send_echo_resp(gtp, skb); in gtp1u_udp_encap_recv()
592 if (gtp1->type == GTP_ECHO_RSP && gtp->sk_created) in gtp1u_udp_encap_recv()
593 return gtp1u_handle_echo_resp(gtp, skb); in gtp1u_udp_encap_recv()
613 pctx = gtp1_pdp_find(gtp, ntohl(gtp1->tid)); in gtp1u_udp_encap_recv()
615 netdev_dbg(gtp->dev, "No PDP ctx to decap skb=%p\n", skb); in gtp1u_udp_encap_recv()
619 return gtp_rx(pctx, skb, hdrlen, gtp->role); in gtp1u_udp_encap_recv()
624 struct gtp_dev *gtp; in __gtp_encap_destroy() local
627 gtp = sk->sk_user_data; in __gtp_encap_destroy()
628 if (gtp) { in __gtp_encap_destroy()
629 if (gtp->sk0 == sk) in __gtp_encap_destroy()
630 gtp->sk0 = NULL; in __gtp_encap_destroy()
632 gtp->sk1u = NULL; in __gtp_encap_destroy()
657 static void gtp_encap_disable(struct gtp_dev *gtp) in gtp_encap_disable() argument
659 if (gtp->sk_created) { in gtp_encap_disable()
660 udp_tunnel_sock_release(gtp->sk0->sk_socket); in gtp_encap_disable()
661 udp_tunnel_sock_release(gtp->sk1u->sk_socket); in gtp_encap_disable()
662 gtp->sk_created = false; in gtp_encap_disable()
663 gtp->sk0 = NULL; in gtp_encap_disable()
664 gtp->sk1u = NULL; in gtp_encap_disable()
666 gtp_encap_disable_sock(gtp->sk0); in gtp_encap_disable()
667 gtp_encap_disable_sock(gtp->sk1u); in gtp_encap_disable()
676 struct gtp_dev *gtp; in gtp_encap_recv() local
679 gtp = rcu_dereference_sk_user_data(sk); in gtp_encap_recv()
680 if (!gtp) in gtp_encap_recv()
683 netdev_dbg(gtp->dev, "encap_recv sk=%p\n", sk); in gtp_encap_recv()
687 netdev_dbg(gtp->dev, "received GTP0 packet\n"); in gtp_encap_recv()
688 ret = gtp0_udp_encap_recv(gtp, skb); in gtp_encap_recv()
691 netdev_dbg(gtp->dev, "received GTP1U packet\n"); in gtp_encap_recv()
692 ret = gtp1u_udp_encap_recv(gtp, skb); in gtp_encap_recv()
700 netdev_dbg(gtp->dev, "pass up to the process\n"); in gtp_encap_recv()
705 netdev_dbg(gtp->dev, "GTP packet has been dropped\n"); in gtp_encap_recv()
716 struct gtp_dev *gtp = netdev_priv(dev); in gtp_dev_init() local
718 gtp->dev = dev; in gtp_dev_init()
729 struct gtp_dev *gtp = netdev_priv(dev); in gtp_dev_uninit() local
731 gtp_encap_disable(gtp); in gtp_dev_uninit()
816 struct gtp_dev *gtp = netdev_priv(dev); in gtp_build_skb_ip4() local
828 if (gtp->role == GTP_ROLE_SGSN) in gtp_build_skb_ip4()
829 pctx = ipv4_pdp_find(gtp, iph->saddr); in gtp_build_skb_ip4()
831 pctx = ipv4_pdp_find(gtp, iph->daddr); in gtp_build_skb_ip4()
983 static int gtp_hashtable_new(struct gtp_dev *gtp, int hsize);
984 static int gtp_encap_enable(struct gtp_dev *gtp, struct nlattr *data[]);
988 struct gtp_dev *gtp = netdev_priv(dev); in gtp_destructor() local
990 kfree(gtp->addr_hash); in gtp_destructor()
991 kfree(gtp->tid_hash); in gtp_destructor()
994 static struct sock *gtp_create_sock(int type, struct gtp_dev *gtp) in gtp_create_sock() argument
1001 struct net *net = gtp->net; in gtp_create_sock()
1016 tuncfg.sk_user_data = gtp; in gtp_create_sock()
1026 static int gtp_create_sockets(struct gtp_dev *gtp, struct nlattr *data[]) in gtp_create_sockets() argument
1031 sk0 = gtp_create_sock(UDP_ENCAP_GTP0, gtp); in gtp_create_sockets()
1035 sk1u = gtp_create_sock(UDP_ENCAP_GTP1U, gtp); in gtp_create_sockets()
1041 gtp->sk_created = true; in gtp_create_sockets()
1042 gtp->sk0 = sk0; in gtp_create_sockets()
1043 gtp->sk1u = sk1u; in gtp_create_sockets()
1053 struct gtp_dev *gtp; in gtp_newlink() local
1057 gtp = netdev_priv(dev); in gtp_newlink()
1072 gtp->role = role; in gtp_newlink()
1075 gtp->restart_count = 0; in gtp_newlink()
1077 gtp->restart_count = nla_get_u8(data[IFLA_GTP_RESTART_COUNT]); in gtp_newlink()
1079 gtp->net = src_net; in gtp_newlink()
1081 err = gtp_hashtable_new(gtp, hashsize); in gtp_newlink()
1086 err = gtp_create_sockets(gtp, data); in gtp_newlink()
1088 err = gtp_encap_enable(gtp, data); in gtp_newlink()
1099 list_add_rcu(&gtp->list, &gn->gtp_dev_list); in gtp_newlink()
1107 gtp_encap_disable(gtp); in gtp_newlink()
1109 kfree(gtp->addr_hash); in gtp_newlink()
1110 kfree(gtp->tid_hash); in gtp_newlink()
1116 struct gtp_dev *gtp = netdev_priv(dev); in gtp_dellink() local
1121 for (i = 0; i < gtp->hash_size; i++) in gtp_dellink()
1122 hlist_for_each_entry_safe(pctx, next, &gtp->tid_hash[i], hlist_tid) in gtp_dellink()
1125 list_del_rcu(&gtp->list); in gtp_dellink()
1156 struct gtp_dev *gtp = netdev_priv(dev); in gtp_fill_info() local
1158 if (nla_put_u32(skb, IFLA_GTP_PDP_HASHSIZE, gtp->hash_size)) in gtp_fill_info()
1160 if (nla_put_u32(skb, IFLA_GTP_ROLE, gtp->role)) in gtp_fill_info()
1162 if (nla_put_u8(skb, IFLA_GTP_RESTART_COUNT, gtp->restart_count)) in gtp_fill_info()
1184 static int gtp_hashtable_new(struct gtp_dev *gtp, int hsize) in gtp_hashtable_new() argument
1188 gtp->addr_hash = kmalloc_array(hsize, sizeof(struct hlist_head), in gtp_hashtable_new()
1190 if (gtp->addr_hash == NULL) in gtp_hashtable_new()
1193 gtp->tid_hash = kmalloc_array(hsize, sizeof(struct hlist_head), in gtp_hashtable_new()
1195 if (gtp->tid_hash == NULL) in gtp_hashtable_new()
1198 gtp->hash_size = hsize; in gtp_hashtable_new()
1201 INIT_HLIST_HEAD(&gtp->addr_hash[i]); in gtp_hashtable_new()
1202 INIT_HLIST_HEAD(&gtp->tid_hash[i]); in gtp_hashtable_new()
1206 kfree(gtp->addr_hash); in gtp_hashtable_new()
1211 struct gtp_dev *gtp) in gtp_encap_enable_socket() argument
1243 tuncfg.sk_user_data = gtp; in gtp_encap_enable_socket()
1257 static int gtp_encap_enable(struct gtp_dev *gtp, struct nlattr *data[]) in gtp_encap_enable() argument
1268 sk0 = gtp_encap_enable_socket(fd0, UDP_ENCAP_GTP0, gtp); in gtp_encap_enable()
1276 sk1u = gtp_encap_enable_socket(fd1, UDP_ENCAP_GTP1U, gtp); in gtp_encap_enable()
1283 gtp->sk0 = sk0; in gtp_encap_enable()
1284 gtp->sk1u = sk1u; in gtp_encap_enable()
1291 struct gtp_dev *gtp = NULL; in gtp_find_dev() local
1309 gtp = netdev_priv(dev); in gtp_find_dev()
1312 return gtp; in gtp_find_dev()
1342 static struct pdp_ctx *gtp_pdp_add(struct gtp_dev *gtp, struct sock *sk, in gtp_pdp_add() argument
1346 struct net_device *dev = gtp->dev; in gtp_pdp_add()
1353 hash_ms = ipv4_hashfn(ms_addr) % gtp->hash_size; in gtp_pdp_add()
1356 pctx = ipv4_pdp_find(gtp, ms_addr); in gtp_pdp_add()
1360 pctx_tid = gtp0_pdp_find(gtp, in gtp_pdp_add()
1363 pctx_tid = gtp1_pdp_find(gtp, in gtp_pdp_add()
1398 pctx->dev = gtp->dev; in gtp_pdp_add()
1409 hash_tid = gtp0_hashfn(pctx->u.v0.tid) % gtp->hash_size; in gtp_pdp_add()
1412 hash_tid = gtp1u_hashfn(pctx->u.v1.i_tei) % gtp->hash_size; in gtp_pdp_add()
1416 hlist_add_head_rcu(&pctx->hlist_addr, &gtp->addr_hash[hash_ms]); in gtp_pdp_add()
1417 hlist_add_head_rcu(&pctx->hlist_tid, &gtp->tid_hash[hash_tid]); in gtp_pdp_add()
1456 struct gtp_dev *gtp; in gtp_genl_new_pdp() local
1486 gtp = gtp_find_dev(sock_net(skb->sk), info->attrs); in gtp_genl_new_pdp()
1487 if (!gtp) { in gtp_genl_new_pdp()
1493 sk = gtp->sk0; in gtp_genl_new_pdp()
1495 sk = gtp->sk1u; in gtp_genl_new_pdp()
1504 pctx = gtp_pdp_add(gtp, sk, info); in gtp_genl_new_pdp()
1520 struct gtp_dev *gtp; in gtp_find_pdp_by_link() local
1522 gtp = gtp_find_dev(net, nla); in gtp_find_pdp_by_link()
1523 if (!gtp) in gtp_find_pdp_by_link()
1529 return ipv4_pdp_find(gtp, ip); in gtp_find_pdp_by_link()
1534 return gtp0_pdp_find(gtp, nla_get_u64(nla[GTPA_TID])); in gtp_find_pdp_by_link()
1536 return gtp1_pdp_find(gtp, nla_get_u32(nla[GTPA_I_TEI])); in gtp_find_pdp_by_link()
1686 struct gtp_dev *last_gtp = (struct gtp_dev *)cb->args[2], *gtp; in gtp_genl_dump_pdp() local
1698 list_for_each_entry_rcu(gtp, &gn->gtp_dev_list, list) { in gtp_genl_dump_pdp()
1699 if (last_gtp && last_gtp != gtp) in gtp_genl_dump_pdp()
1704 for (i = bucket; i < gtp->hash_size; i++) { in gtp_genl_dump_pdp()
1706 hlist_for_each_entry_rcu(pctx, &gtp->tid_hash[i], in gtp_genl_dump_pdp()
1716 cb->args[2] = (unsigned long)gtp; in gtp_genl_dump_pdp()
1736 struct gtp_dev *gtp; in gtp_genl_send_echo_req() local
1753 gtp = gtp_find_dev(sock_net(skb->sk), info->attrs); in gtp_genl_send_echo_req()
1754 if (!gtp) in gtp_genl_send_echo_req()
1757 if (!gtp->sk_created) in gtp_genl_send_echo_req()
1759 if (!(gtp->dev->flags & IFF_UP)) in gtp_genl_send_echo_req()
1765 len = LL_RESERVED_SPACE(gtp->dev) + sizeof(struct gtp0_header) + in gtp_genl_send_echo_req()
1768 skb_to_send = netdev_alloc_skb_ip_align(gtp->dev, len); in gtp_genl_send_echo_req()
1772 sk = gtp->sk0; in gtp_genl_send_echo_req()
1781 len = LL_RESERVED_SPACE(gtp->dev) + in gtp_genl_send_echo_req()
1785 skb_to_send = netdev_alloc_skb_ip_align(gtp->dev, len); in gtp_genl_send_echo_req()
1789 sk = gtp->sk1u; in gtp_genl_send_echo_req()
1802 netdev_dbg(gtp->dev, "no route for echo request to %pI4\n", in gtp_genl_send_echo_req()
1815 dev_net(gtp->dev)), in gtp_genl_send_echo_req()
1886 struct gtp_dev *gtp; in gtp_net_exit() local
1890 list_for_each_entry(gtp, &gn->gtp_dev_list, list) in gtp_net_exit()
1891 gtp_dellink(gtp->dev, &list); in gtp_net_exit()