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:
parent
b00b7e03fd
commit
dc0fa4f712
@ -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 */
|
/* 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 (*ng_ipfw_input_p)(struct mbuf **, struct ip_fw_args *, bool);
|
||||||
extern int (*ip_dn_ctl_ptr)(struct sockopt *);
|
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 /* _KERNEL */
|
||||||
|
|
||||||
#endif /* !_NETINET_IP_VAR_H_ */
|
#endif /* !_NETINET_IP_VAR_H_ */
|
||||||
|
@ -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;
|
VNET_DEFINE(ip_fw_ctl_ptr_t, ip_fw_ctl_ptr) = NULL;
|
||||||
|
|
||||||
int (*ip_dn_ctl_ptr)(struct sockopt *);
|
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);
|
void (*ip_divert_ptr)(struct mbuf *, bool);
|
||||||
int (*ng_ipfw_input_p)(struct mbuf **, struct ip_fw_args *, bool);
|
int (*ng_ipfw_input_p)(struct mbuf **, struct ip_fw_args *, bool);
|
||||||
|
|
||||||
|
@ -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
|
* 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
|
* associated to it. The we apply flow_mask and sched_mask to
|
||||||
* determine the queue and scheduler instances.
|
* 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
|
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 mbuf *m = *m0;
|
||||||
struct dn_fsk *fs = NULL;
|
struct dn_fsk *fs = NULL;
|
||||||
struct dn_sch_inst *si;
|
struct dn_sch_inst *si;
|
||||||
struct dn_queue *q = NULL; /* default */
|
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);
|
((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();
|
DN_BH_WLOCK();
|
||||||
io_pkt++;
|
io_pkt++;
|
||||||
/* we could actually tag outside the lock, but who cares... */
|
/* we could actually tag outside the lock, but who cares... */
|
||||||
|
@ -387,11 +387,26 @@ struct dn_pkt_tag {
|
|||||||
uint16_t iphdr_off; /* IP header offset for mtodo() */
|
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;
|
extern struct dn_parms dn_cfg;
|
||||||
//VNET_DECLARE(struct dn_parms, _base_dn_cfg);
|
//VNET_DECLARE(struct dn_parms, _base_dn_cfg);
|
||||||
//#define dn_cfg VNET(_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 dummynet_task(void *context, int pending);
|
||||||
void dn_reschedule(void);
|
void dn_reschedule(void);
|
||||||
struct dn_pkt_tag * dn_tag_get(struct mbuf *m);
|
struct dn_pkt_tag * dn_tag_get(struct mbuf *m);
|
||||||
|
@ -1436,6 +1436,7 @@ do { \
|
|||||||
struct ip6_hdr *ip6 = (struct ip6_hdr *)ip;
|
struct ip6_hdr *ip6 = (struct ip6_hdr *)ip;
|
||||||
|
|
||||||
is_ipv6 = 1;
|
is_ipv6 = 1;
|
||||||
|
args->flags |= IPFW_ARGS_IP6;
|
||||||
hlen = sizeof(struct ip6_hdr);
|
hlen = sizeof(struct ip6_hdr);
|
||||||
proto = ip6->ip6_nxt;
|
proto = ip6->ip6_nxt;
|
||||||
/* Search extension headers to find upper layer protocols */
|
/* Search extension headers to find upper layer protocols */
|
||||||
@ -1618,6 +1619,7 @@ do { \
|
|||||||
} else if (pktlen >= sizeof(struct ip) &&
|
} else if (pktlen >= sizeof(struct ip) &&
|
||||||
(etype == 0 || etype == ETHERTYPE_IP) && ip->ip_v == 4) {
|
(etype == 0 || etype == ETHERTYPE_IP) && ip->ip_v == 4) {
|
||||||
is_ipv4 = 1;
|
is_ipv4 = 1;
|
||||||
|
args->flags |= IPFW_ARGS_IP4;
|
||||||
hlen = ip->ip_hl << 2;
|
hlen = ip->ip_hl << 2;
|
||||||
/*
|
/*
|
||||||
* Collect parameters into local variables for faster
|
* Collect parameters into local variables for faster
|
||||||
|
@ -124,10 +124,9 @@ ipfw_check_packet(struct mbuf **m0, struct ifnet *ifp, int flags,
|
|||||||
struct ip_fw_args args;
|
struct ip_fw_args args;
|
||||||
struct m_tag *tag;
|
struct m_tag *tag;
|
||||||
pfil_return_t ret;
|
pfil_return_t ret;
|
||||||
int ipfw, dir;
|
int ipfw;
|
||||||
|
|
||||||
args.flags = (flags & PFIL_IN) ? IPFW_ARGS_IN : IPFW_ARGS_OUT;
|
args.flags = (flags & PFIL_IN) ? IPFW_ARGS_IN : IPFW_ARGS_OUT;
|
||||||
dir = (flags & PFIL_IN) ? DIR_IN : DIR_OUT;
|
|
||||||
again:
|
again:
|
||||||
/*
|
/*
|
||||||
* extract and remove the tag if present. If we are left
|
* extract and remove the tag if present. If we are left
|
||||||
@ -254,10 +253,8 @@ again:
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
MPASS(args.flags & IPFW_ARGS_REF);
|
MPASS(args.flags & IPFW_ARGS_REF);
|
||||||
if (mtod(*m0, struct ip *)->ip_v == 4)
|
if (args.flags & (IPFW_ARGS_IP4 | IPFW_ARGS_IP6))
|
||||||
(void )ip_dn_io_ptr(m0, dir, &args);
|
(void )ip_dn_io_ptr(m0, &args);
|
||||||
else if (mtod(*m0, struct ip *)->ip_v == 6)
|
|
||||||
(void )ip_dn_io_ptr(m0, dir | PROTO_IPV6, &args);
|
|
||||||
else {
|
else {
|
||||||
ret = PFIL_DROPPED;
|
ret = PFIL_DROPPED;
|
||||||
break;
|
break;
|
||||||
@ -331,7 +328,7 @@ again:
|
|||||||
* ipfw processing for ethernet packets (in and out).
|
* ipfw processing for ethernet packets (in and out).
|
||||||
*/
|
*/
|
||||||
static pfil_return_t
|
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)
|
void *ruleset __unused, struct inpcb *inp)
|
||||||
{
|
{
|
||||||
struct ip_fw_args args;
|
struct ip_fw_args args;
|
||||||
@ -343,7 +340,7 @@ ipfw_check_frame(struct mbuf **m0, struct ifnet *ifp, int dir,
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
args.flags = IPFW_ARGS_ETHER;
|
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:
|
again:
|
||||||
/* fetch start point from rule, if any. remove the tag if present. */
|
/* fetch start point from rule, if any. remove the tag if present. */
|
||||||
mtag = m_tag_locate(*m0, MTAG_IPFW_RULE, 0, NULL);
|
mtag = m_tag_locate(*m0, MTAG_IPFW_RULE, 0, NULL);
|
||||||
@ -407,9 +404,8 @@ again:
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
*m0 = NULL;
|
*m0 = NULL;
|
||||||
dir = (dir & PFIL_IN) ? DIR_IN : DIR_OUT;
|
|
||||||
MPASS(args.flags & IPFW_ARGS_REF);
|
MPASS(args.flags & IPFW_ARGS_REF);
|
||||||
ip_dn_io_ptr(&m, dir | PROTO_LAYER2, &args);
|
ip_dn_io_ptr(&m, &args);
|
||||||
return (PFIL_CONSUMED);
|
return (PFIL_CONSUMED);
|
||||||
|
|
||||||
case IP_FW_NGTEE:
|
case IP_FW_NGTEE:
|
||||||
|
@ -136,28 +136,6 @@ struct ip_fw_args {
|
|||||||
|
|
||||||
MALLOC_DECLARE(M_IPFW);
|
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 */
|
/* wrapper for freeing a packet, in case we need to do more work */
|
||||||
#ifndef FREE_PKT
|
#ifndef FREE_PKT
|
||||||
#if defined(__linux__) || defined(_WIN32)
|
#if defined(__linux__) || defined(_WIN32)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user