Remove 'dir' argument from dummynet_io(). This makes it possible to make

dn_dir flags private to dummynet. There is still some room for improvement.
This commit is contained in:
Gleb Smirnoff 2019-03-14 22:32:50 +00:00
parent b00b7e03fd
commit dc0fa4f712
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=345165
7 changed files with 38 additions and 42 deletions

View File

@ -296,7 +296,7 @@ extern void (*ip_divert_ptr)(struct mbuf *m, bool incoming);
/* ng_ipfw hooks -- XXX make it the same as divert and dummynet */
extern int (*ng_ipfw_input_p)(struct mbuf **, struct ip_fw_args *, bool);
extern int (*ip_dn_ctl_ptr)(struct sockopt *);
extern int (*ip_dn_io_ptr)(struct mbuf **, int, struct ip_fw_args *);
extern int (*ip_dn_io_ptr)(struct mbuf **, struct ip_fw_args *);
#endif /* _KERNEL */
#endif /* !_NETINET_IP_VAR_H_ */

View File

@ -100,7 +100,7 @@ VNET_DEFINE(ip_fw_chk_ptr_t, ip_fw_chk_ptr) = NULL;
VNET_DEFINE(ip_fw_ctl_ptr_t, ip_fw_ctl_ptr) = NULL;
int (*ip_dn_ctl_ptr)(struct sockopt *);
int (*ip_dn_io_ptr)(struct mbuf **, int, struct ip_fw_args *);
int (*ip_dn_io_ptr)(struct mbuf **, struct ip_fw_args *);
void (*ip_divert_ptr)(struct mbuf *, bool);
int (*ng_ipfw_input_p)(struct mbuf **, struct ip_fw_args *, bool);

View File

@ -854,22 +854,27 @@ tag_mbuf(struct mbuf *m, int dir, struct ip_fw_args *fwa)
* We use the argument to locate the flowset fs and the sched_set sch
* associated to it. The we apply flow_mask and sched_mask to
* determine the queue and scheduler instances.
*
* dir where shall we send the packet after dummynet.
* *m0 the mbuf with the packet
* ifp the 'ifp' parameter from the caller.
* NULL in ip_input, destination interface in ip_output,
*/
int
dummynet_io(struct mbuf **m0, int dir, struct ip_fw_args *fwa)
dummynet_io(struct mbuf **m0, struct ip_fw_args *fwa)
{
struct mbuf *m = *m0;
struct dn_fsk *fs = NULL;
struct dn_sch_inst *si;
struct dn_queue *q = NULL; /* default */
int fs_id, dir;
int fs_id = (fwa->rule.info & IPFW_INFO_MASK) +
fs_id = (fwa->rule.info & IPFW_INFO_MASK) +
((fwa->rule.info & IPFW_IS_PIPE) ? 2*DN_MAX_ID : 0);
/* XXXGL: convert args to dir */
if (fwa->flags & IPFW_ARGS_IN)
dir = DIR_IN;
else
dir = DIR_OUT;
if (fwa->flags & IPFW_ARGS_ETHER)
dir |= PROTO_LAYER2;
else if (fwa->flags & IPFW_ARGS_IP6)
dir |= PROTO_IPV6;
DN_BH_WLOCK();
io_pkt++;
/* we could actually tag outside the lock, but who cares... */

View File

@ -387,11 +387,26 @@ struct dn_pkt_tag {
uint16_t iphdr_off; /* IP header offset for mtodo() */
};
/*
* Possible values for dn_dir. XXXGL: this needs to be reviewed
* and converted to same values ip_fw_args.flags use.
*/
enum {
DIR_OUT = 0,
DIR_IN = 1,
DIR_FWD = 2,
DIR_DROP = 3,
PROTO_LAYER2 = 0x4, /* set for layer 2 */
PROTO_IPV4 = 0x08,
PROTO_IPV6 = 0x10,
PROTO_IFB = 0x0c, /* layer2 + ifbridge */
};
extern struct dn_parms dn_cfg;
//VNET_DECLARE(struct dn_parms, _base_dn_cfg);
//#define dn_cfg VNET(_base_dn_cfg)
int dummynet_io(struct mbuf **, int , struct ip_fw_args *);
int dummynet_io(struct mbuf **, struct ip_fw_args *);
void dummynet_task(void *context, int pending);
void dn_reschedule(void);
struct dn_pkt_tag * dn_tag_get(struct mbuf *m);

View File

@ -1436,6 +1436,7 @@ do { \
struct ip6_hdr *ip6 = (struct ip6_hdr *)ip;
is_ipv6 = 1;
args->flags |= IPFW_ARGS_IP6;
hlen = sizeof(struct ip6_hdr);
proto = ip6->ip6_nxt;
/* Search extension headers to find upper layer protocols */
@ -1618,6 +1619,7 @@ do { \
} else if (pktlen >= sizeof(struct ip) &&
(etype == 0 || etype == ETHERTYPE_IP) && ip->ip_v == 4) {
is_ipv4 = 1;
args->flags |= IPFW_ARGS_IP4;
hlen = ip->ip_hl << 2;
/*
* Collect parameters into local variables for faster

View File

@ -124,10 +124,9 @@ ipfw_check_packet(struct mbuf **m0, struct ifnet *ifp, int flags,
struct ip_fw_args args;
struct m_tag *tag;
pfil_return_t ret;
int ipfw, dir;
int ipfw;
args.flags = (flags & PFIL_IN) ? IPFW_ARGS_IN : IPFW_ARGS_OUT;
dir = (flags & PFIL_IN) ? DIR_IN : DIR_OUT;
again:
/*
* extract and remove the tag if present. If we are left
@ -254,10 +253,8 @@ ipfw_check_packet(struct mbuf **m0, struct ifnet *ifp, int flags,
break;
}
MPASS(args.flags & IPFW_ARGS_REF);
if (mtod(*m0, struct ip *)->ip_v == 4)
(void )ip_dn_io_ptr(m0, dir, &args);
else if (mtod(*m0, struct ip *)->ip_v == 6)
(void )ip_dn_io_ptr(m0, dir | PROTO_IPV6, &args);
if (args.flags & (IPFW_ARGS_IP4 | IPFW_ARGS_IP6))
(void )ip_dn_io_ptr(m0, &args);
else {
ret = PFIL_DROPPED;
break;
@ -331,7 +328,7 @@ ipfw_check_packet(struct mbuf **m0, struct ifnet *ifp, int flags,
* ipfw processing for ethernet packets (in and out).
*/
static pfil_return_t
ipfw_check_frame(struct mbuf **m0, struct ifnet *ifp, int dir,
ipfw_check_frame(struct mbuf **m0, struct ifnet *ifp, int flags,
void *ruleset __unused, struct inpcb *inp)
{
struct ip_fw_args args;
@ -343,7 +340,7 @@ ipfw_check_frame(struct mbuf **m0, struct ifnet *ifp, int dir,
int i;
args.flags = IPFW_ARGS_ETHER;
args.flags |= (dir & PFIL_IN) ? IPFW_ARGS_IN : IPFW_ARGS_OUT;
args.flags |= (flags & PFIL_IN) ? IPFW_ARGS_IN : IPFW_ARGS_OUT;
again:
/* fetch start point from rule, if any. remove the tag if present. */
mtag = m_tag_locate(*m0, MTAG_IPFW_RULE, 0, NULL);
@ -407,9 +404,8 @@ ipfw_check_frame(struct mbuf **m0, struct ifnet *ifp, int dir,
break;
}
*m0 = NULL;
dir = (dir & PFIL_IN) ? DIR_IN : DIR_OUT;
MPASS(args.flags & IPFW_ARGS_REF);
ip_dn_io_ptr(&m, dir | PROTO_LAYER2, &args);
ip_dn_io_ptr(&m, &args);
return (PFIL_CONSUMED);
case IP_FW_NGTEE:

View File

@ -136,28 +136,6 @@ struct ip_fw_args {
MALLOC_DECLARE(M_IPFW);
/*
* Hooks sometime need to know the direction of the packet
* (divert, dummynet, netgraph, ...)
* We use a generic definition here, with bit0-1 indicating the
* direction, bit 2 indicating layer2 or 3, bit 3-4 indicating the
* specific protocol
* indicating the protocol (if necessary)
*/
enum {
DIR_MASK = 0x3,
DIR_OUT = 0,
DIR_IN = 1,
DIR_FWD = 2,
DIR_DROP = 3,
PROTO_LAYER2 = 0x4, /* set for layer 2 */
/* PROTO_DEFAULT = 0, */
PROTO_IPV4 = 0x08,
PROTO_IPV6 = 0x10,
PROTO_IFB = 0x0c, /* layer2 + ifbridge */
/* PROTO_OLDBDG = 0x14, unused, old bridge */
};
/* wrapper for freeing a packet, in case we need to do more work */
#ifndef FREE_PKT
#if defined(__linux__) || defined(_WIN32)