IPv6 Multicast is added

This commit is contained in:
Sukchan Lee 2017-12-15 22:42:52 +09:00
parent b63f92fc20
commit 7898fb4ae3
3 changed files with 76 additions and 32 deletions

View File

@ -1056,10 +1056,7 @@ pgw_bearer_t* pgw_bearer_next(pgw_bearer_t *bearer)
pgw_bearer_t* pgw_bearer_find_by_packet(pkbuf_t *pkt)
{
pgw_bearer_t *default_bearer = NULL;
pgw_bearer_t *bearer = NULL;
hash_index_t *hi = NULL;
pgw_sess_t *sess = NULL;
struct ip *ip_h = NULL;
struct ip6_hdr *ip6_h = NULL;
c_uint32_t *src_addr = NULL;
@ -1115,7 +1112,8 @@ pgw_bearer_t* pgw_bearer_find_by_packet(pkbuf_t *pkt)
for (hi = pgw_sess_first(); hi; hi = pgw_sess_next(hi))
{
sess = pgw_sess_this(hi);
pgw_sess_t *sess = pgw_sess_this(hi);
d_assert(sess, return NULL,);
if (sess->ipv4)
d_trace(50, "PAA IPv4:%s\n", INET_NTOP(&sess->ipv4->addr, buf));
@ -1125,6 +1123,8 @@ pgw_bearer_t* pgw_bearer_find_by_packet(pkbuf_t *pkt)
if ((sess->ipv4 && memcmp(dst_addr, sess->ipv4->addr, addr_len) == 0) ||
(sess->ipv6 && memcmp(dst_addr, sess->ipv6->addr, addr_len) == 0))
{
pgw_bearer_t *default_bearer = NULL;
pgw_bearer_t *bearer = NULL;
/* Found */
/* Save the default bearer */

View File

@ -10,6 +10,40 @@
#include "pgw_event.h"
#include "pgw_gtp_path.h"
static status_t pgw_gtp_send_to_bearer(pgw_bearer_t *bearer, pkbuf_t *sendbuf)
{
status_t rv;
gtp_header_t *gtp_h = NULL;
/* Add GTP-U header */
rv = pkbuf_header(sendbuf, GTPV1U_HEADER_LEN);
if (rv != CORE_OK)
{
d_error("pkbuf_header error");
pkbuf_free(sendbuf);
return CORE_ERROR;
}
gtp_h = (gtp_header_t *)sendbuf->payload;
/* Bits 8 7 6 5 4 3 2 1
* +--+--+--+--+--+--+--+--+
* |version |PT| 1| E| S|PN|
* +--+--+--+--+--+--+--+--+
* 0 0 1 1 0 0 0 0
*/
gtp_h->flags = 0x30;
gtp_h->type = GTPU_MSGTYPE_GPDU;
gtp_h->length = htons(sendbuf->len);
gtp_h->teid = htonl(bearer->sgw_s5u_teid);
/* Send to SGW */
d_trace(50, "Send S5U PDU (teid = 0x%x) to SGW\n",
bearer->sgw_s5u_teid);
rv = gtp_send(bearer->gnode, sendbuf);
return rv;
}
static int _gtpv1_tun_recv_cb(sock_id sock, void *data)
{
pkbuf_t *recvbuf = NULL;
@ -36,37 +70,41 @@ static int _gtpv1_tun_recv_cb(sock_id sock, void *data)
bearer = pgw_bearer_find_by_packet(recvbuf);
if (bearer)
{
gtp_header_t *gtp_h = NULL;
/* Add GTP-U header */
rv = pkbuf_header(recvbuf, GTPV1U_HEADER_LEN);
if (rv != CORE_OK)
{
d_error("pkbuf_header error");
pkbuf_free(recvbuf);
return -1;
}
gtp_h = (gtp_header_t *)recvbuf->payload;
/* Bits 8 7 6 5 4 3 2 1
* +--+--+--+--+--+--+--+--+
* |version |PT| 1| E| S|PN|
* +--+--+--+--+--+--+--+--+
* 0 0 1 1 0 0 0 0
*/
gtp_h->flags = 0x30;
gtp_h->type = GTPU_MSGTYPE_GPDU;
gtp_h->length = htons(n);
gtp_h->teid = htonl(bearer->sgw_s5u_teid);
/* Send to SGW */
d_trace(50, "Send S5U PDU (teid = 0x%x) to SGW\n",
bearer->sgw_s5u_teid);
rv = gtp_send(bearer->gnode, recvbuf);
/* Unicast */
rv = pgw_gtp_send_to_bearer(bearer, recvbuf);
d_assert(rv == CORE_OK,, "pgw_gtp_send_to_bearer failed");
}
else
{
d_trace(3, "Can not find bearer\n");
struct ip *ip_h = NULL;
struct ip6_hdr *ip6_h = NULL;
ip_h = (struct ip *)recvbuf->payload;
if (ip_h->ip_v == 6)
{
ip6_h = (struct ip6_hdr *)recvbuf->payload;
if (IN6_IS_ADDR_MULTICAST(&ip6_h->ip6_dst))
{
hash_index_t *hi = NULL;
/* IPv6 Multicast */
for (hi = pgw_sess_first(); hi; hi = pgw_sess_next(hi))
{
pgw_sess_t *sess = pgw_sess_this(hi);
d_assert(sess, return 0,);
if (sess->ipv6)
{
/* PDN IPv6 is avaiable */
pgw_bearer_t *bearer = pgw_default_bearer_in_sess(sess);
d_assert(bearer, return 0,);
rv = pgw_gtp_send_to_bearer(bearer, recvbuf);
d_assert(rv == CORE_OK,,
"pgw_gtp_send_to_bearer failed");
}
}
}
}
}
pkbuf_free(recvbuf);

6
support/radvd/README.md Normal file
View File

@ -0,0 +1,6 @@
IPv6 Routing Daemon(radvd)
===========================================
- sudo apt-get install radvd
- sudo cp support/radvd/radvd.conf /etc/
- sudo systemctl start radvd