11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/********************************************************************* 26819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki * 31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Filename: ircomm_ttp.c 41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Version: 1.0 51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Description: Interface between IrCOMM and IrTTP 61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Status: Stable 71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Author: Dag Brattli <dagb@cs.uit.no> 81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Created at: Sun Jun 6 20:48:27 1999 91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Modified at: Mon Dec 13 11:35:13 1999 101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Modified by: Dag Brattli <dagb@cs.uit.no> 116819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki * 121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright (c) 1999 Dag Brattli, All Rights Reserved. 131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright (c) 2000-2003 Jean Tourrilhes <jt@hpl.hp.com> 146819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki * 156819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki * This program is free software; you can redistribute it and/or 166819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki * modify it under the terms of the GNU General Public License as 176819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki * published by the Free Software Foundation; either version 2 of 181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * the License, or (at your option) any later version. 196819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki * 201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This program is distributed in the hope that it will be useful, 211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * but WITHOUT ANY WARRANTY; without even the implied warranty of 221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * GNU General Public License for more details. 246819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki * 256819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki * You should have received a copy of the GNU General Public License 26d37705092fb1bad8dade186451f3cca754a5d1d1Jeff Kirsher * along with this program; if not, see <http://www.gnu.org/licenses/>. 276819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki * 281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ********************************************************************/ 291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/init.h> 311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <net/irda/irda.h> 331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <net/irda/irlmp.h> 341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <net/irda/iriap.h> 351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <net/irda/irttp.h> 361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <net/irda/ircomm_event.h> 381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <net/irda/ircomm_ttp.h> 391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ircomm_ttp_data_indication(void *instance, void *sap, 411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct sk_buff *skb); 421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void ircomm_ttp_connect_confirm(void *instance, void *sap, 436819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki struct qos_info *qos, 446819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki __u32 max_sdu_size, 451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds __u8 max_header_size, 461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct sk_buff *skb); 471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void ircomm_ttp_connect_indication(void *instance, void *sap, 481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct qos_info *qos, 491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds __u32 max_sdu_size, 501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds __u8 max_header_size, 511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct sk_buff *skb); 521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void ircomm_ttp_flow_indication(void *instance, void *sap, 531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds LOCAL_FLOW cmd); 546819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideakistatic void ircomm_ttp_disconnect_indication(void *instance, void *sap, 551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds LM_REASON reason, 561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct sk_buff *skb); 571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ircomm_ttp_data_request(struct ircomm_cb *self, 586819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki struct sk_buff *skb, 591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int clen); 606819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideakistatic int ircomm_ttp_connect_request(struct ircomm_cb *self, 616819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki struct sk_buff *userdata, 621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ircomm_info *info); 631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ircomm_ttp_connect_response(struct ircomm_cb *self, 641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct sk_buff *userdata); 656819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideakistatic int ircomm_ttp_disconnect_request(struct ircomm_cb *self, 666819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki struct sk_buff *userdata, 671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ircomm_info *info); 681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Function ircomm_open_tsap (self) 711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 726819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki * 731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint ircomm_open_tsap(struct ircomm_cb *self) 761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds notify_t notify; 781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 790dc47877a3de00ceadea0005189656ae8dc52669Harvey Harrison IRDA_DEBUG(4, "%s()\n", __func__ ); 801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Register callbacks */ 821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds irda_notify_init(¬ify); 831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds notify.data_indication = ircomm_ttp_data_indication; 841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds notify.connect_confirm = ircomm_ttp_connect_confirm; 851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds notify.connect_indication = ircomm_ttp_connect_indication; 861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds notify.flow_indication = ircomm_ttp_flow_indication; 871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds notify.disconnect_indication = ircomm_ttp_disconnect_indication; 881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds notify.instance = self; 891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds strlcpy(notify.name, "IrCOMM", sizeof(notify.name)); 901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds self->tsap = irttp_open_tsap(LSAP_ANY, DEFAULT_INITIAL_CREDIT, 921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ¬ify); 931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!self->tsap) { 940dc47877a3de00ceadea0005189656ae8dc52669Harvey Harrison IRDA_DEBUG(0, "%sfailed to allocate tsap\n", __func__ ); 951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return -1; 961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds self->slsap_sel = self->tsap->stsap_sel; 981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Initialize the call-table for issuing commands 1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds self->issue.data_request = ircomm_ttp_data_request; 1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds self->issue.connect_request = ircomm_ttp_connect_request; 1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds self->issue.connect_response = ircomm_ttp_connect_response; 1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds self->issue.disconnect_request = ircomm_ttp_disconnect_request; 1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Function ircomm_ttp_connect_request (self, userdata) 1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1136819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki * 1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1166819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideakistatic int ircomm_ttp_connect_request(struct ircomm_cb *self, 1176819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki struct sk_buff *userdata, 1181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ircomm_info *info) 1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int ret = 0; 1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1220dc47877a3de00ceadea0005189656ae8dc52669Harvey Harrison IRDA_DEBUG(4, "%s()\n", __func__ ); 1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Don't forget to refcount it - should be NULL anyway */ 1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if(userdata) 1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds skb_get(userdata); 1271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ret = irttp_connect_request(self->tsap, info->dlsap_sel, 1296819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki info->saddr, info->daddr, NULL, 1306819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki TTP_SAR_DISABLE, userdata); 1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return ret; 1336819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki} 1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Function ircomm_ttp_connect_response (self, skb) 1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1386819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki * 1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ircomm_ttp_connect_response(struct ircomm_cb *self, 1421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct sk_buff *userdata) 1431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int ret; 1451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1460dc47877a3de00ceadea0005189656ae8dc52669Harvey Harrison IRDA_DEBUG(4, "%s()\n", __func__ ); 1476819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki 1481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Don't forget to refcount it - should be NULL anyway */ 1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if(userdata) 1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds skb_get(userdata); 1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ret = irttp_connect_response(self->tsap, TTP_SAR_DISABLE, userdata); 1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return ret; 1551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 1581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Function ircomm_ttp_data_request (self, userdata) 1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1606819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki * Send IrCOMM data to IrTTP layer. Currently we do not try to combine 1616819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki * control data with pure data, so they will be sent as separate frames. 1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Should not be a big problem though, since control frames are rare. But 1636819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki * some of them are sent after connection establishment, so this can 1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * increase the latency a bit. 1651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ircomm_ttp_data_request(struct ircomm_cb *self, 1676819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki struct sk_buff *skb, 1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int clen) 1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int ret; 1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds IRDA_ASSERT(skb != NULL, return -1;); 1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1740dc47877a3de00ceadea0005189656ae8dc52669Harvey Harrison IRDA_DEBUG(2, "%s(), clen=%d\n", __func__ , clen); 1751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1766819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki /* 1771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Insert clen field, currently we either send data only, or control 1781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * only frames, to make things easier and avoid queueing 1791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds IRDA_ASSERT(skb_headroom(skb) >= IRCOMM_HEADER_SIZE, return -1;); 1811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Don't forget to refcount it - see ircomm_tty_do_softint() */ 1831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds skb_get(skb); 1841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds skb_push(skb, IRCOMM_HEADER_SIZE); 1861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds skb->data[0] = clen; 1881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ret = irttp_data_request(self->tsap, skb); 1901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (ret) { 1910dc47877a3de00ceadea0005189656ae8dc52669Harvey Harrison IRDA_ERROR("%s(), failed\n", __func__); 1921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* irttp_data_request already free the packet */ 1931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return ret; 1961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 1991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Function ircomm_ttp_data_indication (instance, sap, skb) 2001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Incoming data 2021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 2041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ircomm_ttp_data_indication(void *instance, void *sap, 2051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct sk_buff *skb) 2061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ircomm_cb *self = (struct ircomm_cb *) instance; 2081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2090dc47877a3de00ceadea0005189656ae8dc52669Harvey Harrison IRDA_DEBUG(4, "%s()\n", __func__ ); 2106819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki 2111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds IRDA_ASSERT(self != NULL, return -1;); 2121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds IRDA_ASSERT(self->magic == IRCOMM_MAGIC, return -1;); 2131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds IRDA_ASSERT(skb != NULL, return -1;); 2141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ircomm_do_event(self, IRCOMM_TTP_DATA_INDICATION, skb, NULL); 2161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Drop reference count - see ircomm_tty_data_indication(). */ 2181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dev_kfree_skb(skb); 2191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 2211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void ircomm_ttp_connect_confirm(void *instance, void *sap, 2246819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki struct qos_info *qos, 2256819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki __u32 max_sdu_size, 2261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds __u8 max_header_size, 2271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct sk_buff *skb) 2281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ircomm_cb *self = (struct ircomm_cb *) instance; 2301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ircomm_info info; 2311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2320dc47877a3de00ceadea0005189656ae8dc52669Harvey Harrison IRDA_DEBUG(4, "%s()\n", __func__ ); 2331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds IRDA_ASSERT(self != NULL, return;); 2351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds IRDA_ASSERT(self->magic == IRCOMM_MAGIC, return;); 2361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds IRDA_ASSERT(skb != NULL, return;); 2371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds IRDA_ASSERT(qos != NULL, goto out;); 2381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (max_sdu_size != TTP_SAR_DISABLE) { 2401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds IRDA_ERROR("%s(), SAR not allowed for IrCOMM!\n", 2410dc47877a3de00ceadea0005189656ae8dc52669Harvey Harrison __func__); 2421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds goto out; 2431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds info.max_data_size = irttp_get_max_seg_size(self->tsap) 2461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds - IRCOMM_HEADER_SIZE; 2471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds info.max_header_size = max_header_size + IRCOMM_HEADER_SIZE; 2481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds info.qos = qos; 2491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ircomm_do_event(self, IRCOMM_TTP_CONNECT_CONFIRM, skb, &info); 2511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsout: 2531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Drop reference count - see ircomm_tty_connect_confirm(). */ 2541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dev_kfree_skb(skb); 2551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 2581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Function ircomm_ttp_connect_indication (instance, sap, qos, max_sdu_size, 2591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * max_header_size, skb) 2601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2616819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki * 2621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 2641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void ircomm_ttp_connect_indication(void *instance, void *sap, 2651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct qos_info *qos, 2661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds __u32 max_sdu_size, 2671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds __u8 max_header_size, 2681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct sk_buff *skb) 2691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ircomm_cb *self = (struct ircomm_cb *)instance; 2711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ircomm_info info; 2721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2730dc47877a3de00ceadea0005189656ae8dc52669Harvey Harrison IRDA_DEBUG(4, "%s()\n", __func__ ); 2741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds IRDA_ASSERT(self != NULL, return;); 2761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds IRDA_ASSERT(self->magic == IRCOMM_MAGIC, return;); 2771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds IRDA_ASSERT(skb != NULL, return;); 2781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds IRDA_ASSERT(qos != NULL, goto out;); 2791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (max_sdu_size != TTP_SAR_DISABLE) { 2811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds IRDA_ERROR("%s(), SAR not allowed for IrCOMM!\n", 2820dc47877a3de00ceadea0005189656ae8dc52669Harvey Harrison __func__); 2831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds goto out; 2841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds info.max_data_size = irttp_get_max_seg_size(self->tsap) 2871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds - IRCOMM_HEADER_SIZE; 2881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds info.max_header_size = max_header_size + IRCOMM_HEADER_SIZE; 2891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds info.qos = qos; 2901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ircomm_do_event(self, IRCOMM_TTP_CONNECT_INDICATION, skb, &info); 2921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsout: 2941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Drop reference count - see ircomm_tty_connect_indication(). */ 2951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dev_kfree_skb(skb); 2961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 2991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Function ircomm_ttp_disconnect_request (self, userdata, info) 3001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3016819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki * 3021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 3046819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideakistatic int ircomm_ttp_disconnect_request(struct ircomm_cb *self, 3056819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki struct sk_buff *userdata, 3061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ircomm_info *info) 3071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 3081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int ret; 3091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Don't forget to refcount it - should be NULL anyway */ 3111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if(userdata) 3121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds skb_get(userdata); 3131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ret = irttp_disconnect_request(self->tsap, userdata, P_NORMAL); 3151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return ret; 3171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 3181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 3201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Function ircomm_ttp_disconnect_indication (instance, sap, reason, skb) 3211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3226819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki * 3231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 3256819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideakistatic void ircomm_ttp_disconnect_indication(void *instance, void *sap, 3261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds LM_REASON reason, 3271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct sk_buff *skb) 3281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 3291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ircomm_cb *self = (struct ircomm_cb *) instance; 3301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ircomm_info info; 3311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3320dc47877a3de00ceadea0005189656ae8dc52669Harvey Harrison IRDA_DEBUG(2, "%s()\n", __func__ ); 3331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds IRDA_ASSERT(self != NULL, return;); 3351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds IRDA_ASSERT(self->magic == IRCOMM_MAGIC, return;); 3361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds info.reason = reason; 3381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ircomm_do_event(self, IRCOMM_TTP_DISCONNECT_INDICATION, skb, &info); 3401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Drop reference count - see ircomm_tty_disconnect_indication(). */ 3421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if(skb) 3431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dev_kfree_skb(skb); 3441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 3451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 3471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Function ircomm_ttp_flow_indication (instance, sap, cmd) 3481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Layer below is telling us to start or stop the flow of data 3501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 3521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void ircomm_ttp_flow_indication(void *instance, void *sap, 3531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds LOCAL_FLOW cmd) 3541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 3551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ircomm_cb *self = (struct ircomm_cb *) instance; 3561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3570dc47877a3de00ceadea0005189656ae8dc52669Harvey Harrison IRDA_DEBUG(4, "%s()\n", __func__ ); 3581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds IRDA_ASSERT(self != NULL, return;); 3601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds IRDA_ASSERT(self->magic == IRCOMM_MAGIC, return;); 3616819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki 3621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (self->notify.flow_indication) 3631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds self->notify.flow_indication(self->notify.instance, self, cmd); 3641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 3651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 367