Lines Matching refs:pctx
106 static void pdp_context_delete(struct pdp_ctx *pctx);
173 static bool gtp_check_ms_ipv4(struct sk_buff *skb, struct pdp_ctx *pctx,
184 return iph->daddr == pctx->ms_addr_ip4.s_addr;
186 return iph->saddr == pctx->ms_addr_ip4.s_addr;
192 static bool gtp_check_ms(struct sk_buff *skb, struct pdp_ctx *pctx,
197 return gtp_check_ms_ipv4(skb, pctx, hdrlen, role);
202 static int gtp_rx(struct pdp_ctx *pctx, struct sk_buff *skb,
205 if (!gtp_check_ms(skb, pctx, hdrlen, role)) {
206 netdev_dbg(pctx->dev, "No PDP ctx for this MS\n");
212 !net_eq(sock_net(pctx->sk), dev_net(pctx->dev)))) {
213 pctx->dev->stats.rx_length_errors++;
217 netdev_dbg(pctx->dev, "forwarding packet from GGSN to uplink\n");
226 skb->dev = pctx->dev;
228 dev_sw_netstats_rx_add(pctx->dev, skb->len);
234 pctx->dev->stats.rx_dropped++;
413 struct pdp_ctx *pctx;
436 pctx = gtp0_pdp_find(gtp, be64_to_cpu(gtp0->tid));
437 if (!pctx) {
442 return gtp_rx(pctx, skb, hdrlen, gtp->role);
575 struct pdp_ctx *pctx;
613 pctx = gtp1_pdp_find(gtp, ntohl(gtp1->tid));
614 if (!pctx) {
619 return gtp_rx(pctx, skb, hdrlen, gtp->role);
735 static inline void gtp0_push_header(struct sk_buff *skb, struct pdp_ctx *pctx)
745 gtp0->seq = htons((atomic_inc_return(&pctx->tx_seq) - 1) % 0xffff);
746 gtp0->flow = htons(pctx->u.v0.flow);
749 gtp0->tid = cpu_to_be64(pctx->u.v0.tid);
752 static inline void gtp1_push_header(struct sk_buff *skb, struct pdp_ctx *pctx)
768 gtp1->tid = htonl(pctx->u.v1.o_tei);
780 struct pdp_ctx *pctx;
787 switch (pktinfo->pctx->gtp_version) {
790 gtp0_push_header(skb, pktinfo->pctx);
794 gtp1_push_header(skb, pktinfo->pctx);
801 struct pdp_ctx *pctx, struct rtable *rt,
807 pktinfo->pctx = pctx;
817 struct pdp_ctx *pctx;
829 pctx = ipv4_pdp_find(gtp, iph->saddr);
831 pctx = ipv4_pdp_find(gtp, iph->daddr);
833 if (!pctx) {
838 netdev_dbg(dev, "found PDP context %p\n", pctx);
840 rt = ip4_route_output_gtp(&fl4, pctx->sk, pctx->peer_addr_ip4.s_addr,
841 inet_sk(pctx->sk)->inet_saddr);
844 &pctx->peer_addr_ip4.s_addr);
851 &pctx->peer_addr_ip4.s_addr);
861 switch (pctx->gtp_version) {
884 gtp_set_pktinfo_ipv4(pktinfo, pctx->sk, iph, pctx, rt, &fl4, dev);
931 !net_eq(sock_net(pktinfo.pctx->sk),
1114 struct pdp_ctx *pctx;
1118 hlist_for_each_entry_rcu(pctx, >p->tid_hash[i], hlist_tid)
1119 pdp_context_delete(pctx);
1311 static void ipv4_pdp_fill(struct pdp_ctx *pctx, struct genl_info *info)
1313 pctx->gtp_version = nla_get_u32(info->attrs[GTPA_VERSION]);
1314 pctx->af = AF_INET;
1315 pctx->peer_addr_ip4.s_addr =
1317 pctx->ms_addr_ip4.s_addr =
1320 switch (pctx->gtp_version) {
1326 pctx->u.v0.tid = nla_get_u64(info->attrs[GTPA_TID]);
1327 pctx->u.v0.flow = nla_get_u16(info->attrs[GTPA_FLOW]);
1330 pctx->u.v1.i_tei = nla_get_u32(info->attrs[GTPA_I_TEI]);
1331 pctx->u.v1.o_tei = nla_get_u32(info->attrs[GTPA_O_TEI]);
1341 struct pdp_ctx *pctx, *pctx_tid = NULL;
1352 pctx = ipv4_pdp_find(gtp, ms_addr);
1353 if (pctx)
1370 if (pctx && pctx_tid)
1372 if (!pctx)
1373 pctx = pctx_tid;
1375 ipv4_pdp_fill(pctx, info);
1377 if (pctx->gtp_version == GTP_V0)
1379 pctx->u.v0.tid, pctx);
1380 else if (pctx->gtp_version == GTP_V1)
1382 pctx->u.v1.i_tei, pctx->u.v1.o_tei, pctx);
1384 return pctx;
1388 pctx = kmalloc(sizeof(*pctx), GFP_ATOMIC);
1389 if (pctx == NULL)
1393 pctx->sk = sk;
1394 pctx->dev = gtp->dev;
1395 ipv4_pdp_fill(pctx, info);
1396 atomic_set(&pctx->tx_seq, 0);
1398 switch (pctx->gtp_version) {
1405 hash_tid = gtp0_hashfn(pctx->u.v0.tid) % gtp->hash_size;
1408 hash_tid = gtp1u_hashfn(pctx->u.v1.i_tei) % gtp->hash_size;
1412 hlist_add_head_rcu(&pctx->hlist_addr, >p->addr_hash[hash_ms]);
1413 hlist_add_head_rcu(&pctx->hlist_tid, >p->tid_hash[hash_tid]);
1415 switch (pctx->gtp_version) {
1418 pctx->u.v0.tid, &pctx->peer_addr_ip4,
1419 &pctx->ms_addr_ip4, pctx);
1423 pctx->u.v1.i_tei, pctx->u.v1.o_tei,
1424 &pctx->peer_addr_ip4, &pctx->ms_addr_ip4, pctx);
1428 return pctx;
1433 struct pdp_ctx *pctx = container_of(head, struct pdp_ctx, rcu_head);
1435 sock_put(pctx->sk);
1436 kfree(pctx);
1439 static void pdp_context_delete(struct pdp_ctx *pctx)
1441 hlist_del_rcu(&pctx->hlist_tid);
1442 hlist_del_rcu(&pctx->hlist_addr);
1443 call_rcu(&pctx->rcu_head, pdp_context_free);
1446 static int gtp_tunnel_notify(struct pdp_ctx *pctx, u8 cmd, gfp_t allocation);
1451 struct pdp_ctx *pctx;
1500 pctx = gtp_pdp_add(gtp, sk, info);
1501 if (IS_ERR(pctx)) {
1502 err = PTR_ERR(pctx);
1504 gtp_tunnel_notify(pctx, GTP_CMD_NEWPDP, GFP_KERNEL);
1540 struct pdp_ctx *pctx;
1543 pctx = gtp_find_pdp_by_link(net, nla);
1545 pctx = ERR_PTR(-EINVAL);
1547 if (!pctx)
1548 pctx = ERR_PTR(-ENOENT);
1550 return pctx;
1555 struct pdp_ctx *pctx;
1563 pctx = gtp_find_pdp(sock_net(skb->sk), info->attrs);
1564 if (IS_ERR(pctx)) {
1565 err = PTR_ERR(pctx);
1569 if (pctx->gtp_version == GTP_V0)
1570 netdev_dbg(pctx->dev, "GTPv0-U: deleting tunnel id = %llx (pdp %p)\n",
1571 pctx->u.v0.tid, pctx);
1572 else if (pctx->gtp_version == GTP_V1)
1573 netdev_dbg(pctx->dev, "GTPv1-U: deleting tunnel id = %x/%x (pdp %p)\n",
1574 pctx->u.v1.i_tei, pctx->u.v1.o_tei, pctx);
1576 gtp_tunnel_notify(pctx, GTP_CMD_DELPDP, GFP_ATOMIC);
1577 pdp_context_delete(pctx);
1585 int flags, u32 type, struct pdp_ctx *pctx)
1594 if (nla_put_u32(skb, GTPA_VERSION, pctx->gtp_version) ||
1595 nla_put_u32(skb, GTPA_LINK, pctx->dev->ifindex) ||
1596 nla_put_be32(skb, GTPA_PEER_ADDRESS, pctx->peer_addr_ip4.s_addr) ||
1597 nla_put_be32(skb, GTPA_MS_ADDRESS, pctx->ms_addr_ip4.s_addr))
1600 switch (pctx->gtp_version) {
1602 if (nla_put_u64_64bit(skb, GTPA_TID, pctx->u.v0.tid, GTPA_PAD) ||
1603 nla_put_u16(skb, GTPA_FLOW, pctx->u.v0.flow))
1607 if (nla_put_u32(skb, GTPA_I_TEI, pctx->u.v1.i_tei) ||
1608 nla_put_u32(skb, GTPA_O_TEI, pctx->u.v1.o_tei))
1621 static int gtp_tunnel_notify(struct pdp_ctx *pctx, u8 cmd, gfp_t allocation)
1630 ret = gtp_genl_fill_info(msg, 0, 0, 0, cmd, pctx);
1636 ret = genlmsg_multicast_netns(>p_genl_family, dev_net(pctx->dev), msg,
1643 struct pdp_ctx *pctx = NULL;
1652 pctx = gtp_find_pdp(sock_net(skb->sk), info->attrs);
1653 if (IS_ERR(pctx)) {
1654 err = PTR_ERR(pctx);
1665 0, info->nlhdr->nlmsg_type, pctx);
1685 struct pdp_ctx *pctx;
1702 hlist_for_each_entry_rcu(pctx, >p->tid_hash[i],
1709 cb->nlh->nlmsg_type, pctx)) {