⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 llc_c_ac.c

📁 linux 内核源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
int llc_conn_ac_send_rej_rsp_f_set_1(struct sock *sk, struct sk_buff *skb){	int rc = -ENOBUFS;	struct llc_sock *llc = llc_sk(sk);	struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev);	if (nskb) {		struct llc_sap *sap = llc->sap;		llc_pdu_header_init(nskb, LLC_PDU_TYPE_S, sap->laddr.lsap,				    llc->daddr.lsap, LLC_PDU_RSP);		llc_pdu_init_as_rej_rsp(nskb, 1, llc->vR);		rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac);		if (unlikely(rc))			goto free;		llc_conn_send_pdu(sk, nskb);	}out:	return rc;free:	kfree_skb(nskb);	goto out;}int llc_conn_ac_send_rej_xxx_x_set_0(struct sock *sk, struct sk_buff *skb){	int rc = -ENOBUFS;	struct llc_sock *llc = llc_sk(sk);	struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev);	if (nskb) {		struct llc_sap *sap = llc->sap;		llc_pdu_header_init(nskb, LLC_PDU_TYPE_S, sap->laddr.lsap,				    llc->daddr.lsap, LLC_PDU_RSP);		llc_pdu_init_as_rej_rsp(nskb, 0, llc->vR);		rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac);		if (unlikely(rc))			goto free;		llc_conn_send_pdu(sk, nskb);	}out:	return rc;free:	kfree_skb(nskb);	goto out;}int llc_conn_ac_send_rnr_cmd_p_set_1(struct sock *sk, struct sk_buff *skb){	int rc = -ENOBUFS;	struct llc_sock *llc = llc_sk(sk);	struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev);	if (nskb) {		struct llc_sap *sap = llc->sap;		llc_pdu_header_init(nskb, LLC_PDU_TYPE_S, sap->laddr.lsap,				    llc->daddr.lsap, LLC_PDU_CMD);		llc_pdu_init_as_rnr_cmd(nskb, 1, llc->vR);		rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac);		if (unlikely(rc))			goto free;		llc_conn_send_pdu(sk, nskb);	}out:	return rc;free:	kfree_skb(nskb);	goto out;}int llc_conn_ac_send_rnr_rsp_f_set_1(struct sock *sk, struct sk_buff *skb){	int rc = -ENOBUFS;	struct llc_sock *llc = llc_sk(sk);	struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev);	if (nskb) {		struct llc_sap *sap = llc->sap;		llc_pdu_header_init(nskb, LLC_PDU_TYPE_S, sap->laddr.lsap,				    llc->daddr.lsap, LLC_PDU_RSP);		llc_pdu_init_as_rnr_rsp(nskb, 1, llc->vR);		rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac);		if (unlikely(rc))			goto free;		llc_conn_send_pdu(sk, nskb);	}out:	return rc;free:	kfree_skb(nskb);	goto out;}int llc_conn_ac_send_rnr_xxx_x_set_0(struct sock *sk, struct sk_buff *skb){	int rc = -ENOBUFS;	struct llc_sock *llc = llc_sk(sk);	struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev);	if (nskb) {		struct llc_sap *sap = llc->sap;		llc_pdu_header_init(nskb, LLC_PDU_TYPE_S, sap->laddr.lsap,				    llc->daddr.lsap, LLC_PDU_RSP);		llc_pdu_init_as_rnr_rsp(nskb, 0, llc->vR);		rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac);		if (unlikely(rc))			goto free;		llc_conn_send_pdu(sk, nskb);	}out:	return rc;free:	kfree_skb(nskb);	goto out;}int llc_conn_ac_set_remote_busy(struct sock *sk, struct sk_buff *skb){	struct llc_sock *llc = llc_sk(sk);	if (!llc->remote_busy_flag) {		llc->remote_busy_flag = 1;		mod_timer(&llc->busy_state_timer.timer,			 jiffies + llc->busy_state_timer.expire);	}	return 0;}int llc_conn_ac_opt_send_rnr_xxx_x_set_0(struct sock *sk, struct sk_buff *skb){	int rc = -ENOBUFS;	struct llc_sock *llc = llc_sk(sk);	struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev);	if (nskb) {		struct llc_sap *sap = llc->sap;		llc_pdu_header_init(nskb, LLC_PDU_TYPE_S, sap->laddr.lsap,				    llc->daddr.lsap, LLC_PDU_RSP);		llc_pdu_init_as_rnr_rsp(nskb, 0, llc->vR);		rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac);		if (unlikely(rc))			goto free;		llc_conn_send_pdu(sk, nskb);	}out:	return rc;free:	kfree_skb(nskb);	goto out;}int llc_conn_ac_send_rr_cmd_p_set_1(struct sock *sk, struct sk_buff *skb){	int rc = -ENOBUFS;	struct llc_sock *llc = llc_sk(sk);	struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev);	if (nskb) {		struct llc_sap *sap = llc->sap;		llc_pdu_header_init(nskb, LLC_PDU_TYPE_S, sap->laddr.lsap,				    llc->daddr.lsap, LLC_PDU_CMD);		llc_pdu_init_as_rr_cmd(nskb, 1, llc->vR);		rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac);		if (unlikely(rc))			goto free;		llc_conn_send_pdu(sk, nskb);	}out:	return rc;free:	kfree_skb(nskb);	goto out;}int llc_conn_ac_send_rr_rsp_f_set_1(struct sock *sk, struct sk_buff *skb){	int rc = -ENOBUFS;	struct llc_sock *llc = llc_sk(sk);	struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev);	if (nskb) {		struct llc_sap *sap = llc->sap;		u8 f_bit = 1;		llc_pdu_header_init(nskb, LLC_PDU_TYPE_S, sap->laddr.lsap,				    llc->daddr.lsap, LLC_PDU_RSP);		llc_pdu_init_as_rr_rsp(nskb, f_bit, llc->vR);		rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac);		if (unlikely(rc))			goto free;		llc_conn_send_pdu(sk, nskb);	}out:	return rc;free:	kfree_skb(nskb);	goto out;}int llc_conn_ac_send_ack_rsp_f_set_1(struct sock *sk, struct sk_buff *skb){	int rc = -ENOBUFS;	struct llc_sock *llc = llc_sk(sk);	struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev);	if (nskb) {		struct llc_sap *sap = llc->sap;		llc_pdu_header_init(nskb, LLC_PDU_TYPE_S, sap->laddr.lsap,				    llc->daddr.lsap, LLC_PDU_RSP);		llc_pdu_init_as_rr_rsp(nskb, 1, llc->vR);		rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac);		if (unlikely(rc))			goto free;		llc_conn_send_pdu(sk, nskb);	}out:	return rc;free:	kfree_skb(nskb);	goto out;}int llc_conn_ac_send_rr_xxx_x_set_0(struct sock *sk, struct sk_buff *skb){	int rc = -ENOBUFS;	struct llc_sock *llc = llc_sk(sk);	struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev);	if (nskb) {		struct llc_sap *sap = llc->sap;		llc_pdu_header_init(nskb, LLC_PDU_TYPE_S, sap->laddr.lsap,				    llc->daddr.lsap, LLC_PDU_RSP);		llc_pdu_init_as_rr_rsp(nskb, 0, llc->vR);		rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac);		if (unlikely(rc))			goto free;		llc_conn_send_pdu(sk, nskb);	}out:	return rc;free:	kfree_skb(nskb);	goto out;}int llc_conn_ac_send_ack_xxx_x_set_0(struct sock *sk, struct sk_buff *skb){	int rc = -ENOBUFS;	struct llc_sock *llc = llc_sk(sk);	struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev);	if (nskb) {		struct llc_sap *sap = llc->sap;		llc_pdu_header_init(nskb, LLC_PDU_TYPE_S, sap->laddr.lsap,				    llc->daddr.lsap, LLC_PDU_RSP);		llc_pdu_init_as_rr_rsp(nskb, 0, llc->vR);		rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac);		if (unlikely(rc))			goto free;		llc_conn_send_pdu(sk, nskb);	}out:	return rc;free:	kfree_skb(nskb);	goto out;}void llc_conn_set_p_flag(struct sock *sk, u8 value){	int state_changed = llc_sk(sk)->p_flag && !value;	llc_sk(sk)->p_flag = value;	if (state_changed)		sk->sk_state_change(sk);}int llc_conn_ac_send_sabme_cmd_p_set_x(struct sock *sk, struct sk_buff *skb){	int rc = -ENOBUFS;	struct llc_sock *llc = llc_sk(sk);	struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev);	if (nskb) {		struct llc_sap *sap = llc->sap;		u8 *dmac = llc->daddr.mac;		if (llc->dev->flags & IFF_LOOPBACK)			dmac = llc->dev->dev_addr;		llc_pdu_header_init(nskb, LLC_PDU_TYPE_U, sap->laddr.lsap,				    llc->daddr.lsap, LLC_PDU_CMD);		llc_pdu_init_as_sabme_cmd(nskb, 1);		rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, dmac);		if (unlikely(rc))			goto free;		llc_conn_send_pdu(sk, nskb);		llc_conn_set_p_flag(sk, 1);	}out:	return rc;free:	kfree_skb(nskb);	goto out;}int llc_conn_ac_send_ua_rsp_f_set_p(struct sock *sk, struct sk_buff *skb){	u8 f_bit;	int rc = -ENOBUFS;	struct llc_sock *llc = llc_sk(sk);	struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev);	llc_pdu_decode_pf_bit(skb, &f_bit);	if (nskb) {		struct llc_sap *sap = llc->sap;		nskb->dev = llc->dev;		llc_pdu_header_init(nskb, LLC_PDU_TYPE_U, sap->laddr.lsap,				    llc->daddr.lsap, LLC_PDU_RSP);		llc_pdu_init_as_ua_rsp(nskb, f_bit);		rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac);		if (unlikely(rc))			goto free;		llc_conn_send_pdu(sk, nskb);	}out:	return rc;free:	kfree_skb(nskb);	goto out;}int llc_conn_ac_set_s_flag_0(struct sock *sk, struct sk_buff *skb){	llc_sk(sk)->s_flag = 0;	return 0;}int llc_conn_ac_set_s_flag_1(struct sock *sk, struct sk_buff *skb){	llc_sk(sk)->s_flag = 1;	return 0;}int llc_conn_ac_start_p_timer(struct sock *sk, struct sk_buff *skb){	struct llc_sock *llc = llc_sk(sk);	llc_conn_set_p_flag(sk, 1);	mod_timer(&llc->pf_cycle_timer.timer,		  jiffies + llc->pf_cycle_timer.expire);	return 0;}/** *	llc_conn_ac_send_ack_if_needed - check if ack is needed *	@sk: current connection structure *	@skb: current event * *	Checks number of received PDUs which have not been acknowledged, yet, *	If number of them reaches to "npta"(Number of PDUs To Acknowledge) then *	sends an RR response as acknowledgement for them.  Returns 0 for *	success, 1 otherwise. */int llc_conn_ac_send_ack_if_needed(struct sock *sk, struct sk_buff *skb){	u8 pf_bit;	struct llc_sock *llc = llc_sk(sk);	llc_pdu_decode_pf_bit(skb, &pf_bit);	llc->ack_pf |= pf_bit & 1;	if (!llc->ack_must_be_send) {		llc->first_pdu_Ns = llc->vR;		llc->ack_must_be_send = 1;		llc->ack_pf = pf_bit & 1;	}	if (((llc->vR - llc->first_pdu_Ns + 1 + LLC_2_SEQ_NBR_MODULO)			% LLC_2_SEQ_NBR_MODULO) >= llc->npta) {		llc_conn_ac_send_rr_rsp_f_set_ackpf(sk, skb);		llc->ack_must_be_send	= 0;		llc->ack_pf		= 0;		llc_conn_ac_inc_npta_value(sk, skb);	}	return 0;}/** *	llc_conn_ac_rst_sendack_flag - resets ack_must_be_send flag *	@sk: current connection structure *	@skb: current event * *	This action resets ack_must_be_send flag of given connection, this flag *	indicates if there is any PDU which has not been acknowledged yet. *	Returns 0 for success, 1 otherwise. */int llc_conn_ac_rst_sendack_flag(struct sock *sk, struct sk_buff *skb){	llc_sk(sk)->ack_must_be_send = llc_sk(sk)->ack_pf = 0;	return 0;}/** *	llc_conn_ac_send_i_rsp_f_set_ackpf - acknowledge received PDUs *	@sk: current connection structure *	@skb: current event * *	Sends an I response PDU with f-bit set to ack_pf flag as acknowledge to *	all received PDUs which have not been acknowledged, yet. ack_pf flag is *	set to one if one PDU with p-bit set to one is received.  Returns 0 for *	success, 1 otherwise. */static int llc_conn_ac_send_i_rsp_f_set_ackpf(struct sock *sk,					      struct sk_buff *skb){	int rc;	struct llc_sock *llc = llc_sk(sk);	struct llc_sap *sap = llc->sap;	llc_pdu_header_init(skb, LLC_PDU_TYPE_I, sap->laddr.lsap,			    llc->daddr.lsap, LLC_PDU_RSP);	llc_pdu_init_as_i_cmd(skb, llc->ack_pf, llc->vS, llc->vR);	rc = llc_mac_hdr_init(skb, llc->dev->dev_addr, llc->daddr.mac);	if (likely(!rc)) {		llc_conn_send_pdu(sk, skb);		llc_conn_ac_inc_vs_by_1(sk, skb);	}	return rc;}/** *	llc_conn_ac_send_i_as_ack - sends an I-format PDU to acknowledge rx PDUs *	@sk: current connection structure. *	@skb: current event. * *	This action sends an I-format PDU as acknowledge to received PDUs which *	have not been acknowledged, yet, if there is any. By using of this *	action number of acknowledgements decreases, this technic is called *	piggy backing. Returns 0 for success, 1 otherwise. */int llc_conn_ac_send_i_as_ack(struct sock *sk, struct sk_buff *skb){	struct llc_sock *llc = llc_sk(sk);	if (llc->ack_must_be_send) {		llc_conn_ac_send_i_rsp_f_set_ackpf(sk, skb);		llc->ack_must_be_send = 0 ;		llc->ack_pf = 0;	} else		llc_conn_ac_send_i_cmd_p_set_0(sk, skb);	return 0;}/** *	llc_conn_ac_send_rr_rsp_f_set_ackpf - ack all rx PDUs not yet acked *	@sk: current connection structure. *	@skb: current event. * *	This action sends an RR response with f-bit set to ack_pf flag as *	acknowledge to all received PDUs which have not been acknowledged, yet, *	if there is any. ack_pf flag indicates if a PDU has been received with *	p-bit set to one. Returns 0 for success, 1 otherwise. */static int llc_conn_ac_send_rr_rsp_f_set_ackpf(struct sock *sk,					       struct sk_buff *skb){	int rc = -ENOBUFS;	struct llc_sock *llc = llc_sk(sk);	struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev);	if (nskb) {		struct llc_sap *sap = llc->sap;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -