Hi, On 2017/12/17 2:17, Robert Elz wrote: > Date: Fri, 15 Dec 2017 21:24:20 +0700 > From: Robert Elz <k...@munnari.oz.au> > Message-ID: <11642.1513347...@andromeda.noi.kre.to> > > | Unfortunately, because of the way it gets called, this might not be an > | easy change to make. > > It wouldn't be, but it also turns out to be (I think) unnecessary. > > The m_pullup() (or equiv) isn't needed at all, as you determined initially, > m_copydata() handles fetching data from multiple mbufs (or an external > cluster if needed). > > The problem with your first fix was that you were checking whether the > current mbuf contained the session-ID which it might not, it could be > later - but we really do not need to care (and if it isn't there we > do not need to fix it). > > What I'd suggest doing (and the same for the inet6 case) is to make the > function be ... > > [aside don't cut& paste from this e-mail, it will have had most tabs > turned into spaces...] > > static int > in_l2tp_match(struct mbuf *m, int off, int proto, void *arg) > { > struct l2tp_variant *var = arg; > uint32_t sess_id; > > KASSERT(proto == IPPROTO_L2TP); > > /* > * If the packet contains no session ID it cannot match > */ > if (m_length(m) < off + sizeof(uint32_t)) > return 0; > > /* get L2TP session ID */ > m_copydata(m, off, sizeof(uint32_t), (void *)&sess_id); > NTOHL(sess_id); > if (sess_id == 0) { > /* > * L2TPv3 control packet received. > * userland daemon(l2tpd?) should process. > */ > return 32 * 2; > } else if (sess_id == var->lv_my_sess_id) > return 32 * 2; > else > return 0; > }
You are right. I fix it by your patch at in_l2tp.c:r1.9 and in6_l2tp.c:r1.12. Thanks, -- ////////////////////////////////////////////////////////////////////// Internet Initiative Japan Inc. Device Engineering Section, IoT Platform Development Department, Network Division, Technology Unit Kengo NAKAHARA <k-nakah...@iij.ad.jp>