Merge master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
This commit is contained in:
Коммит
7fcdf327be
|
@ -910,16 +910,18 @@ core99_gmac_phy_reset(struct device_node *node, long param, long value)
|
||||||
macio->type != macio_intrepid)
|
macio->type != macio_intrepid)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
|
printk(KERN_DEBUG "Hard reset of PHY chip ...\n");
|
||||||
|
|
||||||
LOCK(flags);
|
LOCK(flags);
|
||||||
MACIO_OUT8(KL_GPIO_ETH_PHY_RESET, KEYLARGO_GPIO_OUTPUT_ENABLE);
|
MACIO_OUT8(KL_GPIO_ETH_PHY_RESET, KEYLARGO_GPIO_OUTPUT_ENABLE);
|
||||||
(void)MACIO_IN8(KL_GPIO_ETH_PHY_RESET);
|
(void)MACIO_IN8(KL_GPIO_ETH_PHY_RESET);
|
||||||
UNLOCK(flags);
|
UNLOCK(flags);
|
||||||
mdelay(10);
|
msleep(10);
|
||||||
LOCK(flags);
|
LOCK(flags);
|
||||||
MACIO_OUT8(KL_GPIO_ETH_PHY_RESET, /*KEYLARGO_GPIO_OUTPUT_ENABLE | */
|
MACIO_OUT8(KL_GPIO_ETH_PHY_RESET, /*KEYLARGO_GPIO_OUTPUT_ENABLE | */
|
||||||
KEYLARGO_GPIO_OUTOUT_DATA);
|
KEYLARGO_GPIO_OUTOUT_DATA);
|
||||||
UNLOCK(flags);
|
UNLOCK(flags);
|
||||||
mdelay(10);
|
msleep(10);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1653,36 +1653,40 @@ static void gem_init_rings(struct gem *gp)
|
||||||
/* Init PHY interface and start link poll state machine */
|
/* Init PHY interface and start link poll state machine */
|
||||||
static void gem_init_phy(struct gem *gp)
|
static void gem_init_phy(struct gem *gp)
|
||||||
{
|
{
|
||||||
u32 mifcfg;
|
u32 mif_cfg;
|
||||||
|
|
||||||
/* Revert MIF CFG setting done on stop_phy */
|
/* Revert MIF CFG setting done on stop_phy */
|
||||||
mifcfg = readl(gp->regs + MIF_CFG);
|
mif_cfg = readl(gp->regs + MIF_CFG);
|
||||||
mifcfg &= ~MIF_CFG_BBMODE;
|
mif_cfg &= ~(MIF_CFG_PSELECT|MIF_CFG_POLL|MIF_CFG_BBMODE|MIF_CFG_MDI1);
|
||||||
writel(mifcfg, gp->regs + MIF_CFG);
|
mif_cfg |= MIF_CFG_MDI0;
|
||||||
|
writel(mif_cfg, gp->regs + MIF_CFG);
|
||||||
|
writel(PCS_DMODE_MGM, gp->regs + PCS_DMODE);
|
||||||
|
writel(MAC_XIFCFG_OE, gp->regs + MAC_XIFCFG);
|
||||||
|
|
||||||
if (gp->pdev->vendor == PCI_VENDOR_ID_APPLE) {
|
if (gp->pdev->vendor == PCI_VENDOR_ID_APPLE) {
|
||||||
int i;
|
int i;
|
||||||
|
u16 ctrl;
|
||||||
|
|
||||||
/* Those delay sucks, the HW seem to love them though, I'll
|
|
||||||
* serisouly consider breaking some locks here to be able
|
|
||||||
* to schedule instead
|
|
||||||
*/
|
|
||||||
for (i = 0; i < 3; i++) {
|
|
||||||
#ifdef CONFIG_PPC_PMAC
|
#ifdef CONFIG_PPC_PMAC
|
||||||
pmac_call_feature(PMAC_FTR_GMAC_PHY_RESET, gp->of_node, 0, 0);
|
pmac_call_feature(PMAC_FTR_GMAC_PHY_RESET, gp->of_node, 0, 0);
|
||||||
msleep(20);
|
|
||||||
#endif
|
#endif
|
||||||
/* Some PHYs used by apple have problem getting back to us,
|
|
||||||
* we do an additional reset here
|
/* Some PHYs used by apple have problem getting back
|
||||||
*/
|
* to us, we do an additional reset here
|
||||||
phy_write(gp, MII_BMCR, BMCR_RESET);
|
*/
|
||||||
msleep(20);
|
phy_write(gp, MII_BMCR, BMCR_RESET);
|
||||||
if (phy_read(gp, MII_BMCR) != 0xffff)
|
for (i = 0; i < 50; i++) {
|
||||||
|
if ((phy_read(gp, MII_BMCR) & BMCR_RESET) == 0)
|
||||||
break;
|
break;
|
||||||
if (i == 2)
|
msleep(10);
|
||||||
printk(KERN_WARNING "%s: GMAC PHY not responding !\n",
|
|
||||||
gp->dev->name);
|
|
||||||
}
|
}
|
||||||
|
if (i == 50)
|
||||||
|
printk(KERN_WARNING "%s: GMAC PHY not responding !\n",
|
||||||
|
gp->dev->name);
|
||||||
|
/* Make sure isolate is off */
|
||||||
|
ctrl = phy_read(gp, MII_BMCR);
|
||||||
|
if (ctrl & BMCR_ISOLATE)
|
||||||
|
phy_write(gp, MII_BMCR, ctrl & ~BMCR_ISOLATE);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (gp->pdev->vendor == PCI_VENDOR_ID_SUN &&
|
if (gp->pdev->vendor == PCI_VENDOR_ID_SUN &&
|
||||||
|
@ -2119,7 +2123,7 @@ static void gem_reinit_chip(struct gem *gp)
|
||||||
/* Must be invoked with no lock held. */
|
/* Must be invoked with no lock held. */
|
||||||
static void gem_stop_phy(struct gem *gp, int wol)
|
static void gem_stop_phy(struct gem *gp, int wol)
|
||||||
{
|
{
|
||||||
u32 mifcfg;
|
u32 mif_cfg;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
/* Let the chip settle down a bit, it seems that helps
|
/* Let the chip settle down a bit, it seems that helps
|
||||||
|
@ -2130,9 +2134,9 @@ static void gem_stop_phy(struct gem *gp, int wol)
|
||||||
/* Make sure we aren't polling PHY status change. We
|
/* Make sure we aren't polling PHY status change. We
|
||||||
* don't currently use that feature though
|
* don't currently use that feature though
|
||||||
*/
|
*/
|
||||||
mifcfg = readl(gp->regs + MIF_CFG);
|
mif_cfg = readl(gp->regs + MIF_CFG);
|
||||||
mifcfg &= ~MIF_CFG_POLL;
|
mif_cfg &= ~MIF_CFG_POLL;
|
||||||
writel(mifcfg, gp->regs + MIF_CFG);
|
writel(mif_cfg, gp->regs + MIF_CFG);
|
||||||
|
|
||||||
if (wol && gp->has_wol) {
|
if (wol && gp->has_wol) {
|
||||||
unsigned char *e = &gp->dev->dev_addr[0];
|
unsigned char *e = &gp->dev->dev_addr[0];
|
||||||
|
@ -2182,7 +2186,8 @@ static void gem_stop_phy(struct gem *gp, int wol)
|
||||||
/* According to Apple, we must set the MDIO pins to this begnign
|
/* According to Apple, we must set the MDIO pins to this begnign
|
||||||
* state or we may 1) eat more current, 2) damage some PHYs
|
* state or we may 1) eat more current, 2) damage some PHYs
|
||||||
*/
|
*/
|
||||||
writel(mifcfg | MIF_CFG_BBMODE, gp->regs + MIF_CFG);
|
mif_cfg = 0;
|
||||||
|
writel(mif_cfg | MIF_CFG_BBMODE, gp->regs + MIF_CFG);
|
||||||
writel(0, gp->regs + MIF_BBCLK);
|
writel(0, gp->regs + MIF_BBCLK);
|
||||||
writel(0, gp->regs + MIF_BBDATA);
|
writel(0, gp->regs + MIF_BBDATA);
|
||||||
writel(0, gp->regs + MIF_BBOENAB);
|
writel(0, gp->regs + MIF_BBOENAB);
|
||||||
|
|
|
@ -19,7 +19,21 @@ struct xt_get_revision
|
||||||
/* For standard target */
|
/* For standard target */
|
||||||
#define XT_RETURN (-NF_REPEAT - 1)
|
#define XT_RETURN (-NF_REPEAT - 1)
|
||||||
|
|
||||||
#define XT_ALIGN(s) (((s) + (__alignof__(u_int64_t)-1)) & ~(__alignof__(u_int64_t)-1))
|
/* this is a dummy structure to find out the alignment requirement for a struct
|
||||||
|
* containing all the fundamental data types that are used in ipt_entry,
|
||||||
|
* ip6t_entry and arpt_entry. This sucks, and it is a hack. It will be my
|
||||||
|
* personal pleasure to remove it -HW
|
||||||
|
*/
|
||||||
|
struct _xt_align
|
||||||
|
{
|
||||||
|
u_int8_t u8;
|
||||||
|
u_int16_t u16;
|
||||||
|
u_int32_t u32;
|
||||||
|
u_int64_t u64;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define XT_ALIGN(s) (((s) + (__alignof__(struct _xt_align)-1)) \
|
||||||
|
& ~(__alignof__(struct _xt_align)-1))
|
||||||
|
|
||||||
/* Standard return verdict, or do jump. */
|
/* Standard return verdict, or do jump. */
|
||||||
#define XT_STANDARD_TARGET ""
|
#define XT_STANDARD_TARGET ""
|
||||||
|
|
|
@ -2543,13 +2543,14 @@ int dev_ioctl(unsigned int cmd, void __user *arg)
|
||||||
case SIOCBONDENSLAVE:
|
case SIOCBONDENSLAVE:
|
||||||
case SIOCBONDRELEASE:
|
case SIOCBONDRELEASE:
|
||||||
case SIOCBONDSETHWADDR:
|
case SIOCBONDSETHWADDR:
|
||||||
case SIOCBONDSLAVEINFOQUERY:
|
|
||||||
case SIOCBONDINFOQUERY:
|
|
||||||
case SIOCBONDCHANGEACTIVE:
|
case SIOCBONDCHANGEACTIVE:
|
||||||
case SIOCBRADDIF:
|
case SIOCBRADDIF:
|
||||||
case SIOCBRDELIF:
|
case SIOCBRDELIF:
|
||||||
if (!capable(CAP_NET_ADMIN))
|
if (!capable(CAP_NET_ADMIN))
|
||||||
return -EPERM;
|
return -EPERM;
|
||||||
|
/* fall through */
|
||||||
|
case SIOCBONDSLAVEINFOQUERY:
|
||||||
|
case SIOCBONDINFOQUERY:
|
||||||
dev_load(ifr.ifr_name);
|
dev_load(ifr.ifr_name);
|
||||||
rtnl_lock();
|
rtnl_lock();
|
||||||
ret = dev_ifsioc(&ifr, cmd);
|
ret = dev_ifsioc(&ifr, cmd);
|
||||||
|
|
|
@ -64,7 +64,7 @@ static inline void *load_pointer(struct sk_buff *skb, int k,
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* sk_run_filter - run a filter on a socket
|
* sk_run_filter - run a filter on a socket
|
||||||
* @skb: buffer to run the filter on
|
* @skb: buffer to run the filter on
|
||||||
* @filter: filter to apply
|
* @filter: filter to apply
|
||||||
* @flen: length of filter
|
* @flen: length of filter
|
||||||
|
@ -78,8 +78,8 @@ unsigned int sk_run_filter(struct sk_buff *skb, struct sock_filter *filter, int
|
||||||
{
|
{
|
||||||
struct sock_filter *fentry; /* We walk down these */
|
struct sock_filter *fentry; /* We walk down these */
|
||||||
void *ptr;
|
void *ptr;
|
||||||
u32 A = 0; /* Accumulator */
|
u32 A = 0; /* Accumulator */
|
||||||
u32 X = 0; /* Index Register */
|
u32 X = 0; /* Index Register */
|
||||||
u32 mem[BPF_MEMWORDS]; /* Scratch Memory Store */
|
u32 mem[BPF_MEMWORDS]; /* Scratch Memory Store */
|
||||||
u32 tmp;
|
u32 tmp;
|
||||||
int k;
|
int k;
|
||||||
|
|
|
@ -135,13 +135,15 @@ void skb_under_panic(struct sk_buff *skb, int sz, void *here)
|
||||||
struct sk_buff *__alloc_skb(unsigned int size, gfp_t gfp_mask,
|
struct sk_buff *__alloc_skb(unsigned int size, gfp_t gfp_mask,
|
||||||
int fclone)
|
int fclone)
|
||||||
{
|
{
|
||||||
|
kmem_cache_t *cache;
|
||||||
struct skb_shared_info *shinfo;
|
struct skb_shared_info *shinfo;
|
||||||
struct sk_buff *skb;
|
struct sk_buff *skb;
|
||||||
u8 *data;
|
u8 *data;
|
||||||
|
|
||||||
|
cache = fclone ? skbuff_fclone_cache : skbuff_head_cache;
|
||||||
|
|
||||||
/* Get the HEAD */
|
/* Get the HEAD */
|
||||||
skb = kmem_cache_alloc(fclone ? skbuff_fclone_cache : skbuff_head_cache,
|
skb = kmem_cache_alloc(cache, gfp_mask & ~__GFP_DMA);
|
||||||
gfp_mask & ~__GFP_DMA);
|
|
||||||
if (!skb)
|
if (!skb)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
@ -180,7 +182,7 @@ struct sk_buff *__alloc_skb(unsigned int size, gfp_t gfp_mask,
|
||||||
out:
|
out:
|
||||||
return skb;
|
return skb;
|
||||||
nodata:
|
nodata:
|
||||||
kmem_cache_free(skbuff_head_cache, skb);
|
kmem_cache_free(cache, skb);
|
||||||
skb = NULL;
|
skb = NULL;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
|
@ -970,7 +970,6 @@ int igmp_rcv(struct sk_buff *skb)
|
||||||
case IGMP_MTRACE_RESP:
|
case IGMP_MTRACE_RESP:
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
NETDEBUG(KERN_DEBUG "New IGMP type=%d, why we do not know about it?\n", ih->type);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
drop:
|
drop:
|
||||||
|
|
|
@ -230,7 +230,6 @@ static void htcp_cong_avoid(struct sock *sk, u32 ack, u32 rtt,
|
||||||
if (tp->snd_cwnd < tp->snd_cwnd_clamp)
|
if (tp->snd_cwnd < tp->snd_cwnd_clamp)
|
||||||
tp->snd_cwnd++;
|
tp->snd_cwnd++;
|
||||||
tp->snd_cwnd_cnt = 0;
|
tp->snd_cwnd_cnt = 0;
|
||||||
ca->ccount++;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1252,8 +1252,7 @@ int igmp6_event_query(struct sk_buff *skb)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
for (ma = idev->mc_list; ma; ma=ma->next) {
|
for (ma = idev->mc_list; ma; ma=ma->next) {
|
||||||
if (group_type != IPV6_ADDR_ANY &&
|
if (!ipv6_addr_equal(group, &ma->mca_addr))
|
||||||
!ipv6_addr_equal(group, &ma->mca_addr))
|
|
||||||
continue;
|
continue;
|
||||||
spin_lock_bh(&ma->mca_lock);
|
spin_lock_bh(&ma->mca_lock);
|
||||||
if (ma->mca_flags & MAF_TIMER_RUNNING) {
|
if (ma->mca_flags & MAF_TIMER_RUNNING) {
|
||||||
|
@ -1268,11 +1267,10 @@ int igmp6_event_query(struct sk_buff *skb)
|
||||||
ma->mca_flags &= ~MAF_GSQUERY;
|
ma->mca_flags &= ~MAF_GSQUERY;
|
||||||
}
|
}
|
||||||
if (!(ma->mca_flags & MAF_GSQUERY) ||
|
if (!(ma->mca_flags & MAF_GSQUERY) ||
|
||||||
mld_marksources(ma, ntohs(mlh2->nsrcs), mlh2->srcs))
|
mld_marksources(ma, ntohs(mlh2->nsrcs), mlh2->srcs))
|
||||||
igmp6_group_queried(ma, max_delay);
|
igmp6_group_queried(ma, max_delay);
|
||||||
spin_unlock_bh(&ma->mca_lock);
|
spin_unlock_bh(&ma->mca_lock);
|
||||||
if (group_type != IPV6_ADDR_ANY)
|
break;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
read_unlock_bh(&idev->lock);
|
read_unlock_bh(&idev->lock);
|
||||||
|
@ -1351,7 +1349,7 @@ static int is_in(struct ifmcaddr6 *pmc, struct ip6_sf_list *psf, int type,
|
||||||
* in all filters
|
* in all filters
|
||||||
*/
|
*/
|
||||||
if (psf->sf_count[MCAST_INCLUDE])
|
if (psf->sf_count[MCAST_INCLUDE])
|
||||||
return 0;
|
return type == MLD2_MODE_IS_INCLUDE;
|
||||||
return pmc->mca_sfcount[MCAST_EXCLUDE] ==
|
return pmc->mca_sfcount[MCAST_EXCLUDE] ==
|
||||||
psf->sf_count[MCAST_EXCLUDE];
|
psf->sf_count[MCAST_EXCLUDE];
|
||||||
}
|
}
|
||||||
|
@ -1966,7 +1964,7 @@ static void sf_markstate(struct ifmcaddr6 *pmc)
|
||||||
|
|
||||||
static int sf_setstate(struct ifmcaddr6 *pmc)
|
static int sf_setstate(struct ifmcaddr6 *pmc)
|
||||||
{
|
{
|
||||||
struct ip6_sf_list *psf;
|
struct ip6_sf_list *psf, *dpsf;
|
||||||
int mca_xcount = pmc->mca_sfcount[MCAST_EXCLUDE];
|
int mca_xcount = pmc->mca_sfcount[MCAST_EXCLUDE];
|
||||||
int qrv = pmc->idev->mc_qrv;
|
int qrv = pmc->idev->mc_qrv;
|
||||||
int new_in, rv;
|
int new_in, rv;
|
||||||
|
@ -1978,8 +1976,48 @@ static int sf_setstate(struct ifmcaddr6 *pmc)
|
||||||
!psf->sf_count[MCAST_INCLUDE];
|
!psf->sf_count[MCAST_INCLUDE];
|
||||||
} else
|
} else
|
||||||
new_in = psf->sf_count[MCAST_INCLUDE] != 0;
|
new_in = psf->sf_count[MCAST_INCLUDE] != 0;
|
||||||
if (new_in != psf->sf_oldin) {
|
if (new_in) {
|
||||||
psf->sf_crcount = qrv;
|
if (!psf->sf_oldin) {
|
||||||
|
struct ip6_sf_list *prev = 0;
|
||||||
|
|
||||||
|
for (dpsf=pmc->mca_tomb; dpsf;
|
||||||
|
dpsf=dpsf->sf_next) {
|
||||||
|
if (ipv6_addr_equal(&dpsf->sf_addr,
|
||||||
|
&psf->sf_addr))
|
||||||
|
break;
|
||||||
|
prev = dpsf;
|
||||||
|
}
|
||||||
|
if (dpsf) {
|
||||||
|
if (prev)
|
||||||
|
prev->sf_next = dpsf->sf_next;
|
||||||
|
else
|
||||||
|
pmc->mca_tomb = dpsf->sf_next;
|
||||||
|
kfree(dpsf);
|
||||||
|
}
|
||||||
|
psf->sf_crcount = qrv;
|
||||||
|
rv++;
|
||||||
|
}
|
||||||
|
} else if (psf->sf_oldin) {
|
||||||
|
psf->sf_crcount = 0;
|
||||||
|
/*
|
||||||
|
* add or update "delete" records if an active filter
|
||||||
|
* is now inactive
|
||||||
|
*/
|
||||||
|
for (dpsf=pmc->mca_tomb; dpsf; dpsf=dpsf->sf_next)
|
||||||
|
if (ipv6_addr_equal(&dpsf->sf_addr,
|
||||||
|
&psf->sf_addr))
|
||||||
|
break;
|
||||||
|
if (!dpsf) {
|
||||||
|
dpsf = (struct ip6_sf_list *)
|
||||||
|
kmalloc(sizeof(*dpsf), GFP_ATOMIC);
|
||||||
|
if (!dpsf)
|
||||||
|
continue;
|
||||||
|
*dpsf = *psf;
|
||||||
|
/* pmc->mca_lock held by callers */
|
||||||
|
dpsf->sf_next = pmc->mca_tomb;
|
||||||
|
pmc->mca_tomb = dpsf;
|
||||||
|
}
|
||||||
|
dpsf->sf_crcount = qrv;
|
||||||
rv++;
|
rv++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1620,6 +1620,7 @@ static int key_notify_sa_flush(struct km_event *c)
|
||||||
return -ENOBUFS;
|
return -ENOBUFS;
|
||||||
hdr = (struct sadb_msg *) skb_put(skb, sizeof(struct sadb_msg));
|
hdr = (struct sadb_msg *) skb_put(skb, sizeof(struct sadb_msg));
|
||||||
hdr->sadb_msg_satype = pfkey_proto2satype(c->data.proto);
|
hdr->sadb_msg_satype = pfkey_proto2satype(c->data.proto);
|
||||||
|
hdr->sadb_msg_type = SADB_FLUSH;
|
||||||
hdr->sadb_msg_seq = c->seq;
|
hdr->sadb_msg_seq = c->seq;
|
||||||
hdr->sadb_msg_pid = c->pid;
|
hdr->sadb_msg_pid = c->pid;
|
||||||
hdr->sadb_msg_version = PF_KEY_V2;
|
hdr->sadb_msg_version = PF_KEY_V2;
|
||||||
|
@ -2385,6 +2386,7 @@ static int key_notify_policy_flush(struct km_event *c)
|
||||||
if (!skb_out)
|
if (!skb_out)
|
||||||
return -ENOBUFS;
|
return -ENOBUFS;
|
||||||
hdr = (struct sadb_msg *) skb_put(skb_out, sizeof(struct sadb_msg));
|
hdr = (struct sadb_msg *) skb_put(skb_out, sizeof(struct sadb_msg));
|
||||||
|
hdr->sadb_msg_type = SADB_X_SPDFLUSH;
|
||||||
hdr->sadb_msg_seq = c->seq;
|
hdr->sadb_msg_seq = c->seq;
|
||||||
hdr->sadb_msg_pid = c->pid;
|
hdr->sadb_msg_pid = c->pid;
|
||||||
hdr->sadb_msg_version = PF_KEY_V2;
|
hdr->sadb_msg_version = PF_KEY_V2;
|
||||||
|
|
|
@ -365,7 +365,7 @@ static int packet_sendmsg_spkt(struct kiocb *iocb, struct socket *sock,
|
||||||
*/
|
*/
|
||||||
|
|
||||||
err = -EMSGSIZE;
|
err = -EMSGSIZE;
|
||||||
if(len>dev->mtu+dev->hard_header_len)
|
if (len > dev->mtu + dev->hard_header_len)
|
||||||
goto out_unlock;
|
goto out_unlock;
|
||||||
|
|
||||||
err = -ENOBUFS;
|
err = -ENOBUFS;
|
||||||
|
@ -935,7 +935,7 @@ static int packet_bind_spkt(struct socket *sock, struct sockaddr *uaddr, int add
|
||||||
* Check legality
|
* Check legality
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if(addr_len!=sizeof(struct sockaddr))
|
if (addr_len != sizeof(struct sockaddr))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
strlcpy(name,uaddr->sa_data,sizeof(name));
|
strlcpy(name,uaddr->sa_data,sizeof(name));
|
||||||
|
|
||||||
|
@ -1092,7 +1092,7 @@ static int packet_recvmsg(struct kiocb *iocb, struct socket *sock,
|
||||||
* retries.
|
* retries.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if(skb==NULL)
|
if (skb == NULL)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1392,8 +1392,8 @@ static int packet_getsockopt(struct socket *sock, int level, int optname,
|
||||||
if (level != SOL_PACKET)
|
if (level != SOL_PACKET)
|
||||||
return -ENOPROTOOPT;
|
return -ENOPROTOOPT;
|
||||||
|
|
||||||
if (get_user(len,optlen))
|
if (get_user(len, optlen))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
if (len < 0)
|
if (len < 0)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
@ -1419,9 +1419,9 @@ static int packet_getsockopt(struct socket *sock, int level, int optname,
|
||||||
return -ENOPROTOOPT;
|
return -ENOPROTOOPT;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (put_user(len, optlen))
|
if (put_user(len, optlen))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -884,7 +884,7 @@ sctp_disposition_t sctp_sf_sendbeat_8_3(const struct sctp_endpoint *ep,
|
||||||
{
|
{
|
||||||
struct sctp_transport *transport = (struct sctp_transport *) arg;
|
struct sctp_transport *transport = (struct sctp_transport *) arg;
|
||||||
|
|
||||||
if (asoc->overall_error_count > asoc->max_retrans) {
|
if (asoc->overall_error_count >= asoc->max_retrans) {
|
||||||
/* CMD_ASSOC_FAILED calls CMD_DELETE_TCB. */
|
/* CMD_ASSOC_FAILED calls CMD_DELETE_TCB. */
|
||||||
sctp_add_cmd_sf(commands, SCTP_CMD_ASSOC_FAILED,
|
sctp_add_cmd_sf(commands, SCTP_CMD_ASSOC_FAILED,
|
||||||
SCTP_U32(SCTP_ERROR_NO_ERROR));
|
SCTP_U32(SCTP_ERROR_NO_ERROR));
|
||||||
|
@ -2122,7 +2122,7 @@ static sctp_disposition_t sctp_sf_do_5_2_6_stale(const struct sctp_endpoint *ep,
|
||||||
struct sctp_bind_addr *bp;
|
struct sctp_bind_addr *bp;
|
||||||
int attempts = asoc->init_err_counter + 1;
|
int attempts = asoc->init_err_counter + 1;
|
||||||
|
|
||||||
if (attempts >= asoc->max_init_attempts) {
|
if (attempts > asoc->max_init_attempts) {
|
||||||
sctp_add_cmd_sf(commands, SCTP_CMD_INIT_FAILED,
|
sctp_add_cmd_sf(commands, SCTP_CMD_INIT_FAILED,
|
||||||
SCTP_U32(SCTP_ERROR_STALE_COOKIE));
|
SCTP_U32(SCTP_ERROR_STALE_COOKIE));
|
||||||
return SCTP_DISPOSITION_DELETE_TCB;
|
return SCTP_DISPOSITION_DELETE_TCB;
|
||||||
|
@ -4640,7 +4640,7 @@ sctp_disposition_t sctp_sf_t1_init_timer_expire(const struct sctp_endpoint *ep,
|
||||||
|
|
||||||
SCTP_DEBUG_PRINTK("Timer T1 expired (INIT).\n");
|
SCTP_DEBUG_PRINTK("Timer T1 expired (INIT).\n");
|
||||||
|
|
||||||
if (attempts < asoc->max_init_attempts) {
|
if (attempts <= asoc->max_init_attempts) {
|
||||||
bp = (struct sctp_bind_addr *) &asoc->base.bind_addr;
|
bp = (struct sctp_bind_addr *) &asoc->base.bind_addr;
|
||||||
repl = sctp_make_init(asoc, bp, GFP_ATOMIC, 0);
|
repl = sctp_make_init(asoc, bp, GFP_ATOMIC, 0);
|
||||||
if (!repl)
|
if (!repl)
|
||||||
|
@ -4697,7 +4697,7 @@ sctp_disposition_t sctp_sf_t1_cookie_timer_expire(const struct sctp_endpoint *ep
|
||||||
|
|
||||||
SCTP_DEBUG_PRINTK("Timer T1 expired (COOKIE-ECHO).\n");
|
SCTP_DEBUG_PRINTK("Timer T1 expired (COOKIE-ECHO).\n");
|
||||||
|
|
||||||
if (attempts < asoc->max_init_attempts) {
|
if (attempts <= asoc->max_init_attempts) {
|
||||||
repl = sctp_make_cookie_echo(asoc, NULL);
|
repl = sctp_make_cookie_echo(asoc, NULL);
|
||||||
if (!repl)
|
if (!repl)
|
||||||
return SCTP_DISPOSITION_NOMEM;
|
return SCTP_DISPOSITION_NOMEM;
|
||||||
|
|
|
@ -5426,7 +5426,7 @@ out:
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
do_error:
|
do_error:
|
||||||
if (asoc->init_err_counter + 1 >= asoc->max_init_attempts)
|
if (asoc->init_err_counter + 1 > asoc->max_init_attempts)
|
||||||
err = -ETIMEDOUT;
|
err = -ETIMEDOUT;
|
||||||
else
|
else
|
||||||
err = -ECONNREFUSED;
|
err = -ECONNREFUSED;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче