ale updated this revision to Diff 32487.
ale added a comment.
The updated patch fixes the reported issue on multiple PADO replies after the
session has been already established.
REPOSITORY
rS FreeBSD src repository
CHANGES SINCE LAST UPDATE
https://reviews.freebsd.org/D9270?vs=27059&id=32487
REVISION DETAIL
https://reviews.freebsd.org/D9270
AFFECTED FILES
share/man/man4/ng_pppoe.4
sys/netgraph/ng_pppoe.c
sys/netgraph/ng_pppoe.h
EMAIL PREFERENCES
https://reviews.freebsd.org/settings/panel/emailpreferences/
To: ale, #manpages, wblock, #network, julian, mav, adrian, glebius
Cc: garga, eugen_grosbein.net, franco_opnsense.org, mleone87_hotmail.com,
glebius, wblock, mav, poolroom_gmail.com, mandree, imp, freebsd-net-list
diff --git a/sys/netgraph/ng_pppoe.h b/sys/netgraph/ng_pppoe.h
--- a/sys/netgraph/ng_pppoe.h
+++ b/sys/netgraph/ng_pppoe.h
@@ -52,8 +52,10 @@
#define NGM_PPPOE_COOKIE 1089893072
#define NGM_PPPOE_SETMAXP_COOKIE 1441624322
+#define NGM_PPPOE_PADM_COOKIE 1488405822
#define PPPOE_SERVICE_NAME_SIZE 64 /* for now */
+#define PPPOE_PADM_VALUE_SIZE 128 /* for now */
/* Hook names */
#define NG_PPPOE_HOOK_ETHERNET "ethernet"
@@ -84,7 +86,11 @@
NGM_PPPOE_SETMODE = 12, /* set to standard or compat modes */
NGM_PPPOE_GETMODE = 13, /* see current mode */
NGM_PPPOE_SETENADDR = 14, /* set Ethernet address */
- NGM_PPPOE_SETMAXP = 15 /* Set PPP-Max-Payload value */
+ NGM_PPPOE_SETMAXP = 15, /* Set PPP-Max-Payload value */
+ NGM_PPPOE_SEND_HURL = 16, /* Send PADM HURL message */
+ NGM_PPPOE_HURL = 17, /* HURL for informational purposes */
+ NGM_PPPOE_SEND_MOTM = 18, /* Send PADM MOTM message */
+ NGM_PPPOE_MOTM = 19 /* MOTM for informational purposes */
};
/***
@@ -157,6 +163,13 @@
uint16_t data;
};
+/*
+ * This structure is used to send PADM messages from server to client.
+ */
+struct ngpppoe_padm {
+ char msg[PPPOE_PADM_VALUE_SIZE];
+};
+
/
* Constants and definitions specific to pppoe
/
@@ -171,6 +184,7 @@
#define PADR_CODE 0x19
#define PADS_CODE 0x65
#define PADT_CODE 0xa7
+#define PADM_CODE 0xd3
/* Tag identifiers */
#if BYTE_ORDER == BIG_ENDIAN
@@ -181,6 +195,8 @@
#define PTT_AC_COOKIE (0x0104)
#define PTT_VENDOR (0x0105)
#define PTT_RELAY_SID (0x0110)
+#define PTT_HURL (0x0111) /* PPPoE Extensions (CARREL) */
+#define PTT_MOTM (0x0112) /* PPPoE Extensions (CARREL) */
#define PTT_MAX_PAYL (0x0120) /* PPP-Max-Payload (RFC4638) */
#define PTT_SRV_ERR (0x0201)
#define PTT_SYS_ERR (0x0202)
@@ -198,6 +214,8 @@
#define PTT_AC_COOKIE (0x0401)
#define PTT_VENDOR (0x0501)
#define PTT_RELAY_SID (0x1001)
+#define PTT_HURL (0x1101) /* PPPoE Extensions (CARREL) */
+#define PTT_MOTM (0x1201) /* PPPoE Extensions (CARREL) */
#define PTT_MAX_PAYL (0x2001) /* PPP-Max-Payload (RFC4638) */
#define PTT_SRV_ERR (0x0102)
#define PTT_SYS_ERR (0x0202)
diff --git a/sys/netgraph/ng_pppoe.c b/sys/netgraph/ng_pppoe.c
--- a/sys/netgraph/ng_pppoe.c
+++ b/sys/netgraph/ng_pppoe.c
@@ -175,6 +175,20 @@
&ng_parse_uint16_type,
NULL
},
+{
+ NGM_PPPOE_COOKIE,
+ NGM_PPPOE_SEND_HURL,
+ "send_hurl",
+ &ngpppoe_init_data_state_type,
+ NULL
+},
+{
+ NGM_PPPOE_COOKIE,
+ NGM_PPPOE_SEND_MOTM,
+ "send_motm",
+ &ngpppoe_init_data_state_type,
+ NULL
+},
{ 0 }
};
@@ -226,9 +240,11 @@
const struct pppoe_tag *tags[NUMTAGS];
u_int service_len;
u_int ac_name_len;
+ u_int host_uniq_len;
struct datatag service;
struct datatag ac_name;
+ struct datatag host_uniq;
};
typedef struct sess_neg *negp;
@@ -589,18 +605,43 @@
pppoe_finduniq(node_p node, const struct pppoe_tag *tag)
{
hook_p hook = NULL;
- union uniq uniq;
+ sessp sp;
- bcopy(tag + 1, uniq.bytes, sizeof(void *));
/* Cycle through all known hooks. */
LIST_FOREACH(hook, &node->nd_hooks, hk_hooks) {
/* Skip any nonsession hook. */
if (NG_HOOK_PRIVATE(hook) == NULL)
continue;
- if (uniq.pointer == NG_HOOK_PRIVATE(hook))
+ sp = NG_HOOK_PRIVATE(hook);
+ /* Skip already connected sessions. */
+ if (sp->neg == NULL)
+ continue;
+ if (sp->neg->host_uniq_len == ntohs(tag->tag_len) &&
+ bcmp(sp->neg->host_uniq.data, (const char *)(tag + 1),
+ sp->neg->host_uniq_len) == 0)
break;
}
- CTR3(KTR_NET, "%20s: matched %p for %p", __func__, hook, uniq.pointer);
+ CTR3(KTR_NET, "%20s: matched %p for %p", __func__, hook, sp);
+
+ return (hook);
+}
+
+static hook_p
+pppoe_findcookie(node_p node, const struct pppoe_tag *tag)
+{
+ hook_p hook = NULL;
+ union uniq cookie;
+
+ bcopy(tag + 1, cookie.bytes, sizeof(void *));
+ /* Cycle through all known hooks. */
+ LIST_FOREACH(hook, &node->nd_hooks, hk_hooks) {
+ /* Skip any nonsession hook. */
+ if (NG_HOOK_PRIVATE(hook) == NULL)
+ continue;
+ if (cookie.pointer == NG_HOOK_PRIVATE