mpi@ introduced a ph_cookie in mbuf packet headers that can be used
authordlg <dlg@openbsd.org>
Fri, 10 Apr 2015 11:02:12 +0000 (11:02 +0000)
committerdlg <dlg@openbsd.org>
Fri, 10 Apr 2015 11:02:12 +0000 (11:02 +0000)
by a subsystem to stash some state while the mbuf gets queued. eg,
net80211 uses it to keep track of the wireless node associated with
a packet before submitting it to a drivers snd queue for transmission.

this makes pipex use ph_cookie to keep track of the pipex session
associated with a packet before submitting it to the softint queues.
this lets us get rid of an mbuf tag type, and avoids the cost of
tag allocation.

ok yasuoka@

sys/net/pipex.c
sys/sys/mbuf.h

index f1d4c36..0caa9a1 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: pipex.c,v 1.66 2015/03/18 12:23:15 dlg Exp $  */
+/*     $OpenBSD: pipex.c,v 1.67 2015/04/10 11:02:12 dlg Exp $  */
 
 /*-
  * Copyright (c) 2009 Internet Initiative Japan Inc.
@@ -102,13 +102,12 @@ int pipex_prune = 1;                      /* walk list every seconds */
 /* pipex traffic queue */
 struct ifqueue pipexinq;
 struct ifqueue pipexoutq;
-struct pipex_tag {
-       struct pipex_session *session;
-       int                     proto;
-};
 void *pipex_softintr = NULL;
 Static void pipex_softintr_handler(void *);
 
+/* borrow an mbuf pkthdr field */
+#define ph_ppp_proto ether_vtag
+
 /* from udp_usrreq.c */
 extern int udpcksum;
 
@@ -716,9 +715,9 @@ pipex_softintr_handler(void *dummy)
 Static void
 pipex_ppp_dequeue(void)
 {
+       struct pipex_session *pkt_session;
+       u_int16_t proto;
        struct mbuf *m;
-       struct m_tag *mtag;
-       struct pipex_tag *tag;
        int c, s;
 
        /* ppp output */
@@ -731,20 +730,24 @@ pipex_ppp_dequeue(void)
                }
                splx(s);
 
-               mtag = m_tag_find(m, PACKET_TAG_PIPEX, NULL);
-               if (mtag == NULL) {
+               pkt_session = m->m_pkthdr.ph_cookie;
+               if (pkt_session == NULL) {
                        m_freem(m);
                        continue;
                }
-               tag = (struct pipex_tag *)(mtag + 1);
-               if (tag->session->is_multicast != 0) {
+               proto = m->m_pkthdr.ph_ppp_proto;
+
+               m->m_pkthdr.ph_cookie = NULL;
+               m->m_pkthdr.ph_ppp_proto = 0;
+
+               if (pkt_session->is_multicast != 0) {
                        struct pipex_session *session;
                        struct mbuf *m0;
 
                        LIST_FOREACH(session, &pipex_session_list,
                            session_list) {
                                if (session->pipex_iface !=
-                                   tag->session->pipex_iface)
+                                   pkt_session->pipex_iface)
                                        continue;
                                if (session->ip_forward == 0 &&
                                    session->ip6_forward == 0)
@@ -754,11 +757,11 @@ pipex_ppp_dequeue(void)
                                        session->stat.oerrors++;
                                        continue;
                                }
-                               pipex_ppp_output(m0, session, tag->proto);
+                               pipex_ppp_output(m0, session, proto);
                        }
                        m_freem(m);
                } else
-                       pipex_ppp_output(m, tag->session, tag->proto);
+                       pipex_ppp_output(m, pkt_session, proto);
        }
 
        /* ppp input */
@@ -771,13 +774,12 @@ pipex_ppp_dequeue(void)
                }
                splx(s);
 
-               mtag = m_tag_find(m, PACKET_TAG_PIPEX, NULL);
-               if (mtag == NULL) {
+               pkt_session = m->m_pkthdr.ph_cookie;
+               if (pkt_session == NULL) {
                        m_freem(m);
                        continue;
                }
-               tag = (struct pipex_tag *)(mtag + 1);
-               pipex_ppp_input(m, tag->session, 0);
+               pipex_ppp_input(m, pkt_session, 0);
        }
 
        /*
@@ -794,26 +796,18 @@ Static int
 pipex_ppp_enqueue(struct mbuf *m0, struct pipex_session *session,
     struct ifqueue *queue)
 {
-       struct pipex_tag *tag;
-       struct m_tag *mtag;
        int s;
 
+       m0->m_pkthdr.ph_cookie = session;
+       /* XXX need to support other protocols */
+       m0->m_pkthdr.ph_ppp_proto = PPP_IP;
+
        s = splnet();
        if (IF_QFULL(queue)) {
                IF_DROP(queue);
                splx(s);
                goto fail;
        }
-       mtag = m_tag_get(PACKET_TAG_PIPEX, sizeof(struct pipex_tag), M_NOWAIT);
-       if (mtag == NULL) {
-               splx(s);
-               goto fail;
-       }
-       m_tag_prepend(m0, mtag);
-       tag = (struct pipex_tag *)(mtag + 1);
-       tag->session = session;
-       tag->proto = PPP_IP;    /* XXX need to support other protocols */
-
        IF_ENQUEUE(queue, m0);
        splx(s);
 
@@ -907,8 +901,6 @@ pipex_output(struct mbuf *m0, int af, int off,
 {
        struct pipex_session *session;
        struct ip ip;
-       struct pipex_tag *tag;
-       struct m_tag *mtag;
        struct mbuf *mret;
 
        session = NULL;
@@ -923,20 +915,6 @@ pipex_output(struct mbuf *m0, int af, int off,
                                session = pipex_lookup_by_ip_address(ip.ip_dst);
                }
                if (session != NULL) {
-                       for (mtag = m_tag_find(m0, PACKET_TAG_PIPEX, NULL);
-                           mtag != NULL;
-                           mtag = m_tag_find(m0, PACKET_TAG_PIPEX, mtag)) {
-                               tag = (struct pipex_tag *)(mtag + 1);
-                               if (tag->session == session) {
-                                       /*
-                                        * Don't encapsulate encapsulated
-                                        * packets.
-                                        */
-                                       m_freem(m0);
-                                       return (NULL);
-                               }
-                       }
-
                        if (session == pipex_iface->multicast_session) {
                                mret = m0;
                                m0 = m_copym(m0, 0, M_COPYALL, M_NOWAIT);
@@ -1071,8 +1049,6 @@ Static void
 pipex_ppp_input(struct mbuf *m0, struct pipex_session *session, int decrypted)
 {
        int proto, hlen = 0;
-       struct m_tag *mtag;
-       struct pipex_tag *tag;
 
        KASSERT(m0->m_pkthdr.len >= PIPEX_PPPMINLEN);
        proto = pipex_ppp_proto(m0, session, 0, &hlen);
@@ -1104,16 +1080,6 @@ pipex_ppp_input(struct mbuf *m0, struct pipex_session *session, int decrypted)
                return;
        }
 #endif
-       /* delete mtag from decapsulated packet */
-       for (mtag = m_tag_find(m0, PACKET_TAG_PIPEX, NULL); mtag;
-           mtag = m_tag_find(m0, PACKET_TAG_PIPEX, mtag)) {
-               tag = (struct pipex_tag *)(mtag + 1);
-               if (tag->session == session) {
-                       m_tag_delete(m0, mtag);
-                       break;
-               }
-       }
-
        switch (proto) {
        case PPP_IP:
                if (session->ip_forward == 0)
index 364d7ea..451136f 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: mbuf.h,v 1.187 2015/02/10 03:46:30 lteo Exp $ */
+/*     $OpenBSD: mbuf.h,v 1.188 2015/04/10 11:02:12 dlg Exp $  */
 /*     $NetBSD: mbuf.h,v 1.19 1996/02/09 18:25:14 christos Exp $       */
 
 /*
@@ -462,7 +462,6 @@ struct m_tag *m_tag_next(struct mbuf *, struct m_tag *);
 #define PACKET_TAG_GRE                 0x0080  /* GRE processing done */
 #define PACKET_TAG_DLT                 0x0100 /* data link layer type */
 #define PACKET_TAG_PF_DIVERT           0x0200 /* pf(4) diverted packet */
-#define PACKET_TAG_PIPEX               0x0400 /* pipex session cache */
 #define PACKET_TAG_PF_REASSEMBLED      0x0800 /* pf reassembled ipv6 packet */
 #define PACKET_TAG_SRCROUTE            0x1000 /* IPv4 source routing options */
 #define PACKET_TAG_TUNNEL              0x2000  /* Tunnel endpoint address */
@@ -470,7 +469,7 @@ struct m_tag *m_tag_next(struct mbuf *, struct m_tag *);
 #define MTAG_BITS \
     ("\20\1IPSEC_IN_DONE\2IPSEC_OUT_DONE\3IPSEC_IN_CRYPTO_DONE" \
     "\4IPSEC_OUT_CRYPTO_NEEDED\5IPSEC_PENDING_TDB\6BRIDGE\7GIF\10GRE\11DLT" \
-    "\12PF_DIVERT\13PIPEX\14PF_REASSEMBLED\15SRCROUTE\16TUNNEL")
+    "\12PF_DIVERT\14PF_REASSEMBLED\15SRCROUTE\16TUNNEL")
 
 /*
  * Maximum tag payload length (that is excluding the m_tag structure).