Lines Matching refs:gtp
110 static struct pdp_ctx *gtp0_pdp_find(struct gtp_dev *gtp, u64 tid) in gtp0_pdp_find() argument
115 head = >p->tid_hash[gtp0_hashfn(tid) % gtp->hash_size]; in gtp0_pdp_find()
126 static struct pdp_ctx *gtp1_pdp_find(struct gtp_dev *gtp, u32 tid) in gtp1_pdp_find() argument
131 head = >p->tid_hash[gtp1u_hashfn(tid) % gtp->hash_size]; in gtp1_pdp_find()
142 static struct pdp_ctx *ipv4_pdp_find(struct gtp_dev *gtp, __be32 ms_addr) in ipv4_pdp_find() argument
147 head = >p->addr_hash[ipv4_hashfn(ms_addr) % gtp->hash_size]; in ipv4_pdp_find()
223 static int gtp0_udp_encap_recv(struct gtp_dev *gtp, struct sk_buff *skb) in gtp0_udp_encap_recv() argument
241 pctx = gtp0_pdp_find(gtp, be64_to_cpu(gtp0->tid)); in gtp0_udp_encap_recv()
243 netdev_dbg(gtp->dev, "No PDP ctx to decap skb=%p\n", skb); in gtp0_udp_encap_recv()
247 return gtp_rx(pctx, skb, hdrlen, gtp->role); in gtp0_udp_encap_recv()
250 static int gtp1u_udp_encap_recv(struct gtp_dev *gtp, struct sk_buff *skb) in gtp1u_udp_encap_recv() argument
283 pctx = gtp1_pdp_find(gtp, ntohl(gtp1->tid)); in gtp1u_udp_encap_recv()
285 netdev_dbg(gtp->dev, "No PDP ctx to decap skb=%p\n", skb); in gtp1u_udp_encap_recv()
289 return gtp_rx(pctx, skb, hdrlen, gtp->role); in gtp1u_udp_encap_recv()
294 struct gtp_dev *gtp; in gtp_encap_destroy() local
296 gtp = rcu_dereference_sk_user_data(sk); in gtp_encap_destroy()
297 if (gtp) { in gtp_encap_destroy()
312 static void gtp_encap_disable(struct gtp_dev *gtp) in gtp_encap_disable() argument
314 gtp_encap_disable_sock(gtp->sk0); in gtp_encap_disable()
315 gtp_encap_disable_sock(gtp->sk1u); in gtp_encap_disable()
323 struct gtp_dev *gtp; in gtp_encap_recv() local
326 gtp = rcu_dereference_sk_user_data(sk); in gtp_encap_recv()
327 if (!gtp) in gtp_encap_recv()
330 netdev_dbg(gtp->dev, "encap_recv sk=%p\n", sk); in gtp_encap_recv()
334 netdev_dbg(gtp->dev, "received GTP0 packet\n"); in gtp_encap_recv()
335 ret = gtp0_udp_encap_recv(gtp, skb); in gtp_encap_recv()
338 netdev_dbg(gtp->dev, "received GTP1U packet\n"); in gtp_encap_recv()
339 ret = gtp1u_udp_encap_recv(gtp, skb); in gtp_encap_recv()
347 netdev_dbg(gtp->dev, "pass up to the process\n"); in gtp_encap_recv()
352 netdev_dbg(gtp->dev, "GTP packet has been dropped\n"); in gtp_encap_recv()
363 struct gtp_dev *gtp = netdev_priv(dev); in gtp_dev_init() local
365 gtp->dev = dev; in gtp_dev_init()
376 struct gtp_dev *gtp = netdev_priv(dev); in gtp_dev_uninit() local
378 gtp_encap_disable(gtp); in gtp_dev_uninit()
477 struct gtp_dev *gtp = netdev_priv(dev); in gtp_build_skb_ip4() local
489 if (gtp->role == GTP_ROLE_SGSN) in gtp_build_skb_ip4()
490 pctx = ipv4_pdp_find(gtp, iph->saddr); in gtp_build_skb_ip4()
492 pctx = ipv4_pdp_find(gtp, iph->daddr); in gtp_build_skb_ip4()
634 static int gtp_hashtable_new(struct gtp_dev *gtp, int hsize);
635 static void gtp_hashtable_free(struct gtp_dev *gtp);
636 static int gtp_encap_enable(struct gtp_dev *gtp, struct nlattr *data[]);
642 struct gtp_dev *gtp; in gtp_newlink() local
649 gtp = netdev_priv(dev); in gtp_newlink()
651 err = gtp_encap_enable(gtp, data); in gtp_newlink()
660 err = gtp_hashtable_new(gtp, hashsize); in gtp_newlink()
671 list_add_rcu(>p->list, &gn->gtp_dev_list); in gtp_newlink()
678 gtp_hashtable_free(gtp); in gtp_newlink()
680 gtp_encap_disable(gtp); in gtp_newlink()
686 struct gtp_dev *gtp = netdev_priv(dev); in gtp_dellink() local
688 gtp_encap_disable(gtp); in gtp_dellink()
689 gtp_hashtable_free(gtp); in gtp_dellink()
690 list_del_rcu(>p->list); in gtp_dellink()
717 struct gtp_dev *gtp = netdev_priv(dev); in gtp_fill_info() local
719 if (nla_put_u32(skb, IFLA_GTP_PDP_HASHSIZE, gtp->hash_size)) in gtp_fill_info()
741 static int gtp_hashtable_new(struct gtp_dev *gtp, int hsize) in gtp_hashtable_new() argument
745 gtp->addr_hash = kmalloc_array(hsize, sizeof(struct hlist_head), in gtp_hashtable_new()
747 if (gtp->addr_hash == NULL) in gtp_hashtable_new()
750 gtp->tid_hash = kmalloc_array(hsize, sizeof(struct hlist_head), in gtp_hashtable_new()
752 if (gtp->tid_hash == NULL) in gtp_hashtable_new()
755 gtp->hash_size = hsize; in gtp_hashtable_new()
758 INIT_HLIST_HEAD(>p->addr_hash[i]); in gtp_hashtable_new()
759 INIT_HLIST_HEAD(>p->tid_hash[i]); in gtp_hashtable_new()
763 kfree(gtp->addr_hash); in gtp_hashtable_new()
767 static void gtp_hashtable_free(struct gtp_dev *gtp) in gtp_hashtable_free() argument
772 for (i = 0; i < gtp->hash_size; i++) in gtp_hashtable_free()
773 hlist_for_each_entry_rcu(pctx, >p->tid_hash[i], hlist_tid) in gtp_hashtable_free()
777 kfree(gtp->addr_hash); in gtp_hashtable_free()
778 kfree(gtp->tid_hash); in gtp_hashtable_free()
782 struct gtp_dev *gtp) in gtp_encap_enable_socket() argument
811 tuncfg.sk_user_data = gtp; in gtp_encap_enable_socket()
823 static int gtp_encap_enable(struct gtp_dev *gtp, struct nlattr *data[]) in gtp_encap_enable() argument
832 sk0 = gtp_encap_enable_socket(fd0, UDP_ENCAP_GTP0, gtp); in gtp_encap_enable()
840 sk1u = gtp_encap_enable_socket(fd1, UDP_ENCAP_GTP1U, gtp); in gtp_encap_enable()
854 gtp->sk0 = sk0; in gtp_encap_enable()
855 gtp->sk1u = sk1u; in gtp_encap_enable()
856 gtp->role = role; in gtp_encap_enable()
863 struct gtp_dev *gtp = NULL; in gtp_find_dev() local
881 gtp = netdev_priv(dev); in gtp_find_dev()
884 return gtp; in gtp_find_dev()
914 static int ipv4_pdp_add(struct gtp_dev *gtp, struct sock *sk, in ipv4_pdp_add() argument
917 struct net_device *dev = gtp->dev; in ipv4_pdp_add()
924 hash_ms = ipv4_hashfn(ms_addr) % gtp->hash_size; in ipv4_pdp_add()
926 hlist_for_each_entry_rcu(pctx, >p->addr_hash[hash_ms], hlist_addr) { in ipv4_pdp_add()
958 pctx->dev = gtp->dev; in ipv4_pdp_add()
969 hash_tid = gtp0_hashfn(pctx->u.v0.tid) % gtp->hash_size; in ipv4_pdp_add()
972 hash_tid = gtp1u_hashfn(pctx->u.v1.i_tei) % gtp->hash_size; in ipv4_pdp_add()
976 hlist_add_head_rcu(&pctx->hlist_addr, >p->addr_hash[hash_ms]); in ipv4_pdp_add()
977 hlist_add_head_rcu(&pctx->hlist_tid, >p->tid_hash[hash_tid]); in ipv4_pdp_add()
1013 struct gtp_dev *gtp; in gtp_genl_new_pdp() local
1043 gtp = gtp_find_dev(sock_net(skb->sk), info->attrs); in gtp_genl_new_pdp()
1044 if (!gtp) { in gtp_genl_new_pdp()
1050 sk = gtp->sk0; in gtp_genl_new_pdp()
1052 sk = gtp->sk1u; in gtp_genl_new_pdp()
1061 err = ipv4_pdp_add(gtp, sk, info); in gtp_genl_new_pdp()
1071 struct gtp_dev *gtp; in gtp_find_pdp_by_link() local
1073 gtp = gtp_find_dev(net, nla); in gtp_find_pdp_by_link()
1074 if (!gtp) in gtp_find_pdp_by_link()
1080 return ipv4_pdp_find(gtp, ip); in gtp_find_pdp_by_link()
1085 return gtp0_pdp_find(gtp, nla_get_u64(nla[GTPA_TID])); in gtp_find_pdp_by_link()
1087 return gtp1_pdp_find(gtp, nla_get_u32(nla[GTPA_I_TEI])); in gtp_find_pdp_by_link()
1217 struct gtp_dev *last_gtp = (struct gtp_dev *)cb->args[2], *gtp; in gtp_genl_dump_pdp() local
1227 list_for_each_entry_rcu(gtp, &gn->gtp_dev_list, list) { in gtp_genl_dump_pdp()
1228 if (last_gtp && last_gtp != gtp) in gtp_genl_dump_pdp()
1233 for (i = k; i < gtp->hash_size; i++) { in gtp_genl_dump_pdp()
1234 hlist_for_each_entry_rcu(pctx, >p->tid_hash[i], hlist_tid) { in gtp_genl_dump_pdp()
1247 cb->args[2] = (unsigned long)gtp; in gtp_genl_dump_pdp()
1314 struct gtp_dev *gtp; in gtp_net_exit() local
1318 list_for_each_entry(gtp, &gn->gtp_dev_list, list) in gtp_net_exit()
1319 gtp_dellink(gtp->dev, &list); in gtp_net_exit()