cregit-Linux how code gets into the kernel

Release 4.11 net/irda/ircomm/ircomm_ttp.c

Directory: net/irda/ircomm
/*********************************************************************
 *
 * Filename:      ircomm_ttp.c
 * Version:       1.0
 * Description:   Interface between IrCOMM and IrTTP
 * Status:        Stable
 * Author:        Dag Brattli <dagb@cs.uit.no>
 * Created at:    Sun Jun  6 20:48:27 1999
 * Modified at:   Mon Dec 13 11:35:13 1999
 * Modified by:   Dag Brattli <dagb@cs.uit.no>
 *
 *     Copyright (c) 1999 Dag Brattli, All Rights Reserved.
 *     Copyright (c) 2000-2003 Jean Tourrilhes <jt@hpl.hp.com>
 *
 *     This program is free software; you can redistribute it and/or
 *     modify it under the terms of the GNU General Public License as
 *     published by the Free Software Foundation; either version 2 of
 *     the License, or (at your option) any later version.
 *
 *     This program is distributed in the hope that it will be useful,
 *     but WITHOUT ANY WARRANTY; without even the implied warranty of
 *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 *     GNU General Public License for more details.
 *
 *     You should have received a copy of the GNU General Public License
 *     along with this program; if not, see <http://www.gnu.org/licenses/>.
 *
 ********************************************************************/

#include <linux/init.h>

#include <net/irda/irda.h>
#include <net/irda/irlmp.h>
#include <net/irda/iriap.h>
#include <net/irda/irttp.h>

#include <net/irda/ircomm_event.h>
#include <net/irda/ircomm_ttp.h>

static int ircomm_ttp_data_indication(void *instance, void *sap,
				      struct sk_buff *skb);
static void ircomm_ttp_connect_confirm(void *instance, void *sap,
				       struct qos_info *qos,
				       __u32 max_sdu_size,
				       __u8 max_header_size,
				       struct sk_buff *skb);
static void ircomm_ttp_connect_indication(void *instance, void *sap,
					  struct qos_info *qos,
					  __u32 max_sdu_size,
					  __u8 max_header_size,
					  struct sk_buff *skb);
static void ircomm_ttp_flow_indication(void *instance, void *sap,
				       LOCAL_FLOW cmd);
static void ircomm_ttp_disconnect_indication(void *instance, void *sap,
					     LM_REASON reason,
					     struct sk_buff *skb);
static int ircomm_ttp_data_request(struct ircomm_cb *self,
				   struct sk_buff *skb,
				   int clen);
static int ircomm_ttp_connect_request(struct ircomm_cb *self,
				      struct sk_buff *userdata,
				      struct ircomm_info *info);
static int ircomm_ttp_connect_response(struct ircomm_cb *self,
				       struct sk_buff *userdata);
static int ircomm_ttp_disconnect_request(struct ircomm_cb *self,
					 struct sk_buff *userdata,
					 struct ircomm_info *info);

/*
 * Function ircomm_open_tsap (self)
 *
 *
 *
 */

int ircomm_open_tsap(struct ircomm_cb *self) { notify_t notify; /* Register callbacks */ irda_notify_init(&notify); notify.data_indication = ircomm_ttp_data_indication; notify.connect_confirm = ircomm_ttp_connect_confirm; notify.connect_indication = ircomm_ttp_connect_indication; notify.flow_indication = ircomm_ttp_flow_indication; notify.disconnect_indication = ircomm_ttp_disconnect_indication; notify.instance = self; strlcpy(notify.name, "IrCOMM", sizeof(notify.name)); self->tsap = irttp_open_tsap(LSAP_ANY, DEFAULT_INITIAL_CREDIT, &notify); if (!self->tsap) { pr_debug("%sfailed to allocate tsap\n", __func__); return -1; } self->slsap_sel = self->tsap->stsap_sel; /* * Initialize the call-table for issuing commands */ self->issue.data_request = ircomm_ttp_data_request; self->issue.connect_request = ircomm_ttp_connect_request; self->issue.connect_response = ircomm_ttp_connect_response; self->issue.disconnect_request = ircomm_ttp_disconnect_request; return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)14192.76%120.00%
Benjamin Collins74.61%120.00%
Jean Tourrilhes21.32%120.00%
Harvey Harrison10.66%120.00%
Joe Perches10.66%120.00%
Total152100.00%5100.00%

/* * Function ircomm_ttp_connect_request (self, userdata) * * * */
static int ircomm_ttp_connect_request(struct ircomm_cb *self, struct sk_buff *userdata, struct ircomm_info *info) { int ret = 0; /* Don't forget to refcount it - should be NULL anyway */ if(userdata) skb_get(userdata); ret = irttp_connect_request(self->tsap, info->dlsap_sel, info->saddr, info->daddr, NULL, TTP_SAR_DISABLE, userdata); return ret; }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)5583.33%250.00%
Jean Tourrilhes1015.15%125.00%
David S. Miller11.52%125.00%
Total66100.00%4100.00%

/* * Function ircomm_ttp_connect_response (self, skb) * * * */
static int ircomm_ttp_connect_response(struct ircomm_cb *self, struct sk_buff *userdata) { int ret; /* Don't forget to refcount it - should be NULL anyway */ if(userdata) skb_get(userdata); ret = irttp_connect_response(self->tsap, TTP_SAR_DISABLE, userdata); return ret; }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)3271.11%250.00%
Jean Tourrilhes1226.67%125.00%
David S. Miller12.22%125.00%
Total45100.00%4100.00%

/* * Function ircomm_ttp_data_request (self, userdata) * * Send IrCOMM data to IrTTP layer. Currently we do not try to combine * control data with pure data, so they will be sent as separate frames. * Should not be a big problem though, since control frames are rare. But * some of them are sent after connection establishment, so this can * increase the latency a bit. */
static int ircomm_ttp_data_request(struct ircomm_cb *self, struct sk_buff *skb, int clen) { int ret; IRDA_ASSERT(skb != NULL, return -1;); pr_debug("%s(), clen=%d\n", __func__ , clen); /* * Insert clen field, currently we either send data only, or control * only frames, to make things easier and avoid queueing */ IRDA_ASSERT(skb_headroom(skb) >= IRCOMM_HEADER_SIZE, return -1;); /* Don't forget to refcount it - see ircomm_tty_do_softint() */ skb_get(skb); skb_push(skb, IRCOMM_HEADER_SIZE); skb->data[0] = clen; ret = irttp_data_request(self->tsap, skb); if (ret) { net_err_ratelimited("%s(), failed\n", __func__); /* irttp_data_request already free the packet */ } return ret; }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)8181.00%218.18%
Jean Tourrilhes1111.00%327.27%
Joe Perches22.00%218.18%
Jeff Garzik22.00%19.09%
Harvey Harrison22.00%19.09%
Hideaki Yoshifuji / 吉藤英明11.00%19.09%
David S. Miller11.00%19.09%
Total100100.00%11100.00%

/* * Function ircomm_ttp_data_indication (instance, sap, skb) * * Incoming data * */
static int ircomm_ttp_data_indication(void *instance, void *sap, struct sk_buff *skb) { struct ircomm_cb *self = (struct ircomm_cb *) instance; IRDA_ASSERT(self != NULL, return -1;); IRDA_ASSERT(self->magic == IRCOMM_MAGIC, return -1;); IRDA_ASSERT(skb != NULL, return -1;); ircomm_do_event(self, IRCOMM_TTP_DATA_INDICATION, skb, NULL); /* Drop reference count - see ircomm_tty_data_indication(). */ dev_kfree_skb(skb); return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)6887.18%125.00%
Jean Tourrilhes911.54%250.00%
David S. Miller11.28%125.00%
Total78100.00%4100.00%


static void ircomm_ttp_connect_confirm(void *instance, void *sap, struct qos_info *qos, __u32 max_sdu_size, __u8 max_header_size, struct sk_buff *skb) { struct ircomm_cb *self = (struct ircomm_cb *) instance; struct ircomm_info info; IRDA_ASSERT(self != NULL, return;); IRDA_ASSERT(self->magic == IRCOMM_MAGIC, return;); IRDA_ASSERT(skb != NULL, return;); IRDA_ASSERT(qos != NULL, goto out;); if (max_sdu_size != TTP_SAR_DISABLE) { net_err_ratelimited("%s(), SAR not allowed for IrCOMM!\n", __func__); goto out; } info.max_data_size = irttp_get_max_seg_size(self->tsap) - IRCOMM_HEADER_SIZE; info.max_header_size = max_header_size + IRCOMM_HEADER_SIZE; info.qos = qos; ircomm_do_event(self, IRCOMM_TTP_CONNECT_CONFIRM, skb, &info); out: /* Drop reference count - see ircomm_tty_connect_confirm(). */ dev_kfree_skb(skb); }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)11884.89%333.33%
Jean Tourrilhes1611.51%222.22%
Jeff Garzik21.44%111.11%
Joe Perches10.72%111.11%
David S. Miller10.72%111.11%
Harvey Harrison10.72%111.11%
Total139100.00%9100.00%

/* * Function ircomm_ttp_connect_indication (instance, sap, qos, max_sdu_size, * max_header_size, skb) * * * */
static void ircomm_ttp_connect_indication(void *instance, void *sap, struct qos_info *qos, __u32 max_sdu_size, __u8 max_header_size, struct sk_buff *skb) { struct ircomm_cb *self = (struct ircomm_cb *)instance; struct ircomm_info info; IRDA_ASSERT(self != NULL, return;); IRDA_ASSERT(self->magic == IRCOMM_MAGIC, return;); IRDA_ASSERT(skb != NULL, return;); IRDA_ASSERT(qos != NULL, goto out;); if (max_sdu_size != TTP_SAR_DISABLE) { net_err_ratelimited("%s(), SAR not allowed for IrCOMM!\n", __func__); goto out; } info.max_data_size = irttp_get_max_seg_size(self->tsap) - IRCOMM_HEADER_SIZE; info.max_header_size = max_header_size + IRCOMM_HEADER_SIZE; info.qos = qos; ircomm_do_event(self, IRCOMM_TTP_CONNECT_INDICATION, skb, &info); out: /* Drop reference count - see ircomm_tty_connect_indication(). */ dev_kfree_skb(skb); }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)11884.89%333.33%
Jean Tourrilhes1611.51%222.22%
Jeff Garzik21.44%111.11%
Joe Perches10.72%111.11%
Harvey Harrison10.72%111.11%
David S. Miller10.72%111.11%
Total139100.00%9100.00%

/* * Function ircomm_ttp_disconnect_request (self, userdata, info) * * * */
static int ircomm_ttp_disconnect_request(struct ircomm_cb *self, struct sk_buff *userdata, struct ircomm_info *info) { int ret; /* Don't forget to refcount it - should be NULL anyway */ if(userdata) skb_get(userdata); ret = irttp_disconnect_request(self->tsap, userdata, P_NORMAL); return ret; }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)3978.00%133.33%
Jean Tourrilhes1020.00%133.33%
David S. Miller12.00%133.33%
Total50100.00%3100.00%

/* * Function ircomm_ttp_disconnect_indication (instance, sap, reason, skb) * * * */
static void ircomm_ttp_disconnect_indication(void *instance, void *sap, LM_REASON reason, struct sk_buff *skb) { struct ircomm_cb *self = (struct ircomm_cb *) instance; struct ircomm_info info; IRDA_ASSERT(self != NULL, return;); IRDA_ASSERT(self->magic == IRCOMM_MAGIC, return;); info.reason = reason; ircomm_do_event(self, IRCOMM_TTP_DISCONNECT_INDICATION, skb, &info); /* Drop reference count - see ircomm_tty_disconnect_indication(). */ if(skb) dev_kfree_skb(skb); }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)6783.75%125.00%
Jean Tourrilhes1215.00%250.00%
David S. Miller11.25%125.00%
Total80100.00%4100.00%

/* * Function ircomm_ttp_flow_indication (instance, sap, cmd) * * Layer below is telling us to start or stop the flow of data * */
static void ircomm_ttp_flow_indication(void *instance, void *sap, LOCAL_FLOW cmd) { struct ircomm_cb *self = (struct ircomm_cb *) instance; IRDA_ASSERT(self != NULL, return;); IRDA_ASSERT(self->magic == IRCOMM_MAGIC, return;); if (self->notify.flow_indication) self->notify.flow_indication(self->notify.instance, self, cmd); }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)6595.59%133.33%
Jean Tourrilhes22.94%133.33%
David S. Miller11.47%133.33%
Total68100.00%3100.00%


Overall Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)80671.08%320.00%
David S. Miller19517.20%16.67%
Jean Tourrilhes1008.82%320.00%
Hideaki Yoshifuji / 吉藤英明80.71%16.67%
Benjamin Collins70.62%16.67%
Jeff Garzik60.53%16.67%
Harvey Harrison50.44%16.67%
Joe Perches50.44%213.33%
Jeff Kirsher10.09%16.67%
Linus Torvalds10.09%16.67%
Total1134100.00%15100.00%
Directory: net/irda/ircomm
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.