On multi CPU systems, we may emit successive packets with the same id.

Fix the race by using an atomic operation.

Differential Revision:	https://reviews.freebsd.org/D2141
Obtained from:	emeric.poupon@stormshield.eu
MFC after:	1 week
Sponsored by:	Stormshield
This commit is contained in:
Fabien Thomas 2015-03-27 13:26:59 +00:00
parent 5d85cd2d11
commit d612b95e23
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=280759
2 changed files with 15 additions and 5 deletions

View File

@ -91,7 +91,7 @@ __FBSDID("$FreeBSD$");
#include <security/mac/mac_framework.h>
VNET_DEFINE(u_short, ip_id);
VNET_DEFINE(uint32_t, ip_id);
#ifdef MBUF_STRESS_TEST
static int mbuf_frag_size = 0;

View File

@ -174,7 +174,7 @@ struct inpcb;
struct route;
struct sockopt;
VNET_DECLARE(u_short, ip_id); /* ip packet ctr, for ids */
VNET_DECLARE(uint32_t, ip_id); /* ip packet ctr, for ids */
VNET_DECLARE(int, ip_defttl); /* default IP ttl */
VNET_DECLARE(int, ipforwarding); /* ip forwarding */
#ifdef IPSTEALTH
@ -228,7 +228,7 @@ struct in_ifaddr *
void ip_savecontrol(struct inpcb *, struct mbuf **, struct ip *,
struct mbuf *);
void ip_slowtimo(void);
u_int16_t ip_randomid(void);
uint16_t ip_randomid(void);
int rip_ctloutput(struct socket *, struct sockopt *);
void rip_ctlinput(int, struct sockaddr *, void *);
void rip_init(void);
@ -305,8 +305,18 @@ extern int (*ip_dn_io_ptr)(struct mbuf **, int, struct ip_fw_args *);
VNET_DECLARE(int, ip_do_randomid);
#define V_ip_do_randomid VNET(ip_do_randomid)
#define ip_newid() ((V_ip_do_randomid != 0) ? ip_randomid() : \
htons(V_ip_id++))
static __inline uint16_t
ip_newid(void)
{
uint16_t res;
if (V_ip_do_randomid != 0)
return (ip_randomid());
else {
res = atomic_fetchadd_32(&V_ip_id, 1) & 0xFFFF;
return (htons(res));
}
}
#endif /* _KERNEL */