summaryrefslogtreecommitdiff
path: root/accel-pppd/ctrl
diff options
context:
space:
mode:
Diffstat (limited to 'accel-pppd/ctrl')
-rw-r--r--accel-pppd/ctrl/l2tp/l2tp.h1
-rw-r--r--accel-pppd/ctrl/l2tp/packet.c30
2 files changed, 31 insertions, 0 deletions
diff --git a/accel-pppd/ctrl/l2tp/l2tp.h b/accel-pppd/ctrl/l2tp/l2tp.h
index 566212a..b816bc8 100644
--- a/accel-pppd/ctrl/l2tp/l2tp.h
+++ b/accel-pppd/ctrl/l2tp/l2tp.h
@@ -88,6 +88,7 @@ struct l2tp_packet_t *l2tp_packet_alloc(int ver, int msg_type,
int l2tp_packet_send(int sock, struct l2tp_packet_t *);
int l2tp_packet_add_int16(struct l2tp_packet_t *pack, int id, int16_t val, int M);
int l2tp_packet_add_int32(struct l2tp_packet_t *pack, int id, int32_t val, int M);
+int l2tp_packet_add_int64(struct l2tp_packet_t *pack, int id, int64_t val, int M);
int l2tp_packet_add_string(struct l2tp_packet_t *pack, int id, const char *val, int M);
int l2tp_packet_add_octets(struct l2tp_packet_t *pack, int id, const uint8_t *val, int size, int M);
diff --git a/accel-pppd/ctrl/l2tp/packet.c b/accel-pppd/ctrl/l2tp/packet.c
index 9bd11eb..e4278a3 100644
--- a/accel-pppd/ctrl/l2tp/packet.c
+++ b/accel-pppd/ctrl/l2tp/packet.c
@@ -511,6 +511,9 @@ int l2tp_packet_send(int sock, struct l2tp_packet_t *pack)
case ATTR_TYPE_INT32:
*(int32_t *)avp->val = htonl(attr->val.int32);
break;
+ case ATTR_TYPE_INT64:
+ *(uint64_t *)avp->val = htobe64(attr->val.uint64);
+ break;
case ATTR_TYPE_STRING:
case ATTR_TYPE_OCTETS:
memcpy(avp->val, attr->val.string, attr->length);
@@ -800,6 +803,33 @@ err:
return -1;
}
+int l2tp_packet_add_int64(struct l2tp_packet_t *pack, int id, int64_t val, int M)
+{
+ struct l2tp_attr_t *attr = attr_alloc(id, M, pack->hide_avps);
+
+ if (!attr)
+ return -1;
+
+ if (attr->H) {
+ if (pack->last_RV == NULL)
+ if (l2tp_packet_add_random_vector(pack) < 0)
+ goto err;
+ val = htobe64(val);
+ if (encode_attr(pack, attr, &val, sizeof(val)) < 0)
+ goto err;
+ } else {
+ attr->length = sizeof(val);
+ attr->val.uint64 = val;
+ }
+ list_add_tail(&attr->entry, &pack->attrs);
+
+ return 0;
+
+err:
+ mempool_free(attr);
+ return -1;
+}
+
int l2tp_packet_add_string(struct l2tp_packet_t *pack, int id, const char *val, int M)
{
struct l2tp_attr_t *attr = attr_alloc(id, M, pack->hide_avps);